Cumartesi , 12 Temmuz 2014
Son Haberler
Anasayfa / MAKALELER / İş Zekası / ODI’da Seri ve Paralel Paket Çalıştırma

ODI’da Seri ve Paralel Paket Çalıştırma

Synchronous/asynchronous package execution in ODI

Bu yazıda kısa bir örnekle ODI’de senaryoların paralel ve seri verilmesinden bahsedeceğim.
Veri ambarlarına periyodik data yüklemelerini sağlamak için birçok paket oluşturulur. İlk tasarım safhasında her adım için hangi yüklemelerin seri ve paralel verileceği belirlenir. İlk tasarımdan sonra yeni yüklemeler eklendikçe periyodik yükleme sürelerinde uzama görülebilir, bunun nedenlerinden biri yeni geliştirmelerde eklenen paketlerin hangi adımlarda çalışacağı, tabloların yüklenmesi için hangi tablolara ihtiyaç olduğunun iyi analiz edilmemesi olabilir. Yeni paket ilişkili paketin öncesinde veya sonrasında çalışacak şekilde seri bağlanır. Yeni geliştirmelerde sadece tablonun hangi sistemden, hangi yöntemle yükleneceği yanında, hangi adımdan önce yüklenmesi gerekli, yüklenmesi için hangi tablolar gerektiğine dikkat edilmelidir.
ODI’de paralel çalıştırma özelliği sadece senaryolarda vardır, interface ve procedure senaryosu oluşturulmadan paralel verilmiyor. ODI paketlerinde seri çalışma için değişikliğe gerek yok, paralel çalıştırmak için senaryonun Command tabında “-SYNC_MODE=2″ kodu yazılarak veya General tabında Synchronous / Asynchronous özelliği Asynchronous seçilerek senaryolar paralel verilebilir.
Örnekte bir paket oluşturup interface senaryolarını pakete atıp INT_JOBS paralel, INT_REGIONS seri, INT_COUNTRIES seri, INT_LOCATIONS paralel, INT_EMPLOYEES paralel çalışacak şekilde girdim. Bu tabloların yüklenmesi birbirinden bağımsızdır.

paralel_seri2

ODI 10g Operator, paketlerin steps adımına tıklandığında adımların başlangıç, bitiş zamanlarını ve sürelerini verirken ODI 11g Operator de bunu göremediğim için repository tablolarından select ediyorum.
SELECT sess_no || ‘-’ || sess_name sess_no_sess_name,
CASE
WHEN synchro = 1
THEN ‘SYNCH’
ELSE ‘ASYNCH’
END “SYNCH/ASYNCH”, sess_beg, sess_end,
ROUND ((sess_end – sess_beg) * 24 * 60 * 60, 2) DURATION
FROM snpw1.snp_session
WHERE sess_beg >= TO_DATE (’20110630′, ‘yyyymmdd’) AND sess_no > 214001
ORDER BY sess_beg, sess_no, sess_end;

 

4OWFCS_2

 

 

Sess_no 215001, 216001, 217001 senaryoları ilk grup olarak çalışıyor, bu grup bittikten sonra sess_no 218001, 219001 senaryoları başlıyor. İlk grubun süresi 58 sn, ikinci grubun süresi 48 sn. Bu durumda paket süresi, 106 sn dir.Aynı zamanda paketin süresini, repository tablosundan, içindeki adımların zamanların bu şekilde hesaplayabiliriz.
SELECT parent_sess_no, MIN (sess_beg), MAX (sess_end),
ROUND ((MAX (sess_end) – MIN (sess_beg)) * 24 * 60 * 60, 2) sess_dur
FROM snpw1.snp_session
WHERE sess_beg >= TO_DATE (’20110630′, ‘yyyymmdd’)
AND parent_sess_no = 214001
GROUP BY parent_sess_no

PARENT_SESS_NO MIN(SESS_BEG) MAX(SESS_END) SESS_DUR
214001 30.06.2011 22:39:50 30.06.2011 22:41:36 106
Dikkat edilmesi gereken nokta, INT_JOBS senaryosu kendisinden sonraki senaryolara paralel çalışıyor. INT_JOBS senaryosu, en uzun süreli senaryo olsaydı, paketin çalışma süresi INT_JOBS süresi olurdu.

Aynı paket için tablolar yüklenirken birbirlerine bağlı oldukları bir durumda ODI WAIT FOR CHILD SESSION (OWFCS) ekledim. OdiWaitForChildSession “-POLL_INT=1″ “-MAX_CHILD_ERROR=1″ kodu ile bu adımı geçmesi için önceki tüm adımların tamamlanmasını sağlanır. OWFCS adımından önceki adımlarda bir fail olursa paketin devam etmemesini sağlamış olduk.

 

3OWFCS

 

Önceki sürelere aktığımızda ikinci grup, ilk grubun bitmesini beklemeden çalışırken şimdi ilk grup bittikten sonra ikinci grubun girdiğini görebiliriz.
SELECT sess_no || ‘-’ || sess_name sess_no_sess_name,
CASE
WHEN synchro = 1
THEN ‘SYNCH’
ELSE ‘ASYNCH’
END “SYNCH/ASYNCH”, sess_beg, sess_end,
ROUND ((sess_end – sess_beg) * 24 * 60 * 60, 2) DURATION
FROM snpw1.snp_session
WHERE sess_beg >= TO_DATE (’20110630′, ‘yyyymmdd’) AND sess_no > 214001
ORDER BY sess_beg, sess_no, sess_end

 

sql1

 

SELECT parent_sess_no, MIN (sess_beg), MAX (sess_end),
ROUND ((MAX (sess_end) – MIN (sess_beg)) * 24 * 60 * 60, 2) sess_dur
FROM snpw1.snp_session
WHERE sess_beg >= TO_DATE (’20110630′, ‘yyyymmdd’)
AND parent_sess_no = 264001
GROUP BY parent_sess_no

PARENT_SESS_NO MIN(SESS_BEG) MAX(SESS_END) SESS_DUR
264001 04.07.2011 23:10:27 04.07.2011 23:13:41 194
Bir pakette çalışan tüm senaryolar paralel çalışıyorsa hata alan bir senaryo olduğunda ana paket başarılı bitmiş görünüyor, OWFCS ekleyerek bunu önleyebilirsiniz. Ayrıca paralelde yüklenen tablolardan birini kullanan başka bir senaryo olduğunda mutlaka eklenmelidir.

Hakkında Jale Ozgur

PL/SQL , ETL, BI Developer

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>