CDC(Change Data
Capture) Nedir,Nasıl Yapılır?
Bildiğiniz gibi data boyutları gün geçtikçe çok ciddi
artıyor.Bu artış DWH-Lake vb yapılara veri aktarımı yaparken bize çok büyük
sorun çıkarıyor çünkü bizim için veri aktarımının hızı çok önemli ne kadar az
datayı aktarırsak o kadar iyi.Bu durumda her gün hiç bir değişikliğe uğramamış
bir datayı almakla tekrar tekrar uğraşmak mantıksız bir hale geliyor,biz en son
datayı DWH’a aldıktan sonra değişenleri alsak çok çok daha az bir data ile
uğraşmış olacağız.Çünkü zaten bir noktadan sonra isteseniz de tüm datayla her
gün uğraşamıyor noktaya geleceksiniz.
Bu rakamları şöyle ifade edelim 1 milyarlık bir tabloda
sadece 3 milyonla uğraşmak gibi.
İşte CDC mantığı bu noktada devreye giriyor kaynak
sisteminizde sadece 3 milyon veri değiştiyse sadece bu 3 milyonu DWH’a
aktarıyoruz.Peki bunu nasıl yapıyoruz?
Öncelikle bildiğiniz gibi DWH bir çok katmandan oluşuyor ve
bizim şuan ilgilendiğimiz ODS(Operational Data Store) katmanı.Bu katman,kaynak
sistemle neredeyse aynıdır tablo yapıları itibariyle.Biz önce verilerimizi bu
katmana alırız sonra DM(Data Mart) katmanlarına çıkarız.
Peki biz tüm tabloları ODS’e aktarırken CDC methodunu mu
kullanmalıyız?
Mümkünse evet,değilse yapabildiğiniz kadarını.
Mümkünse ne demek peki?
CDC yapabilmek için tablonuz üzerinde bir satır
yaratıldığında veya değiştirildiğinde bunu tutan sütunlar olmalı.Yani
yaratıldığında created_date,güncellendiğinde update_date benzeri sütunlarınız
güncellenmeli ve yazılım size bunu garanti etmeli!
Bu illa böyle olacak değil bir sequence yaratılıp kayıt
güncellenip,yaratıldığında bu sequence’in değeri bir satıra yazılabilir bu da
size değişen kayıtları yakalama imkanı sağlar.İşin özü dün siz veri aktarımı
yaptıktan sonra gelen dataları tespit edebilmeniz,nasıl yaptığınız önemli
değil.
Her tabloda bunu bulamayabilirsiniz bu durumda her gün tüm
tabloyu truncate-insert etmekden başka çareniz kalmaz.Ama çok büyük tablolar
varsa yazılıma bastırıp ekletmeye çalışın bunları ama işiniz kolay değil
söyleyeyim 😊
Peki dün veriyi aktardıktan sonra güncellenen-eklenen
kayıtları bulduk sıradaki nedir?
ETL aracımızda tabloyu aktarırken Where kısmına şöyle bir
kod yazmanız lazım
created_date>=son_aktardığım_tarih or
updated_date>=son_aktardığım_tarih
Bunu yazabiliriz ama son_aktardığım_tarih’i nereden
bileceğim?
Bunun için 2 yöntem söyleyebilirim ya gider ODS katmanındaki
yükleme yapmak istediğiniz tablodaki max(created_date)’i alır bir variable’a
koyar ve bunu son_aktardığım_tarih’e eşitlersiniz ki bu tablonuz çok büyükse
uzun sürebilir ya da bir parametre tablosu oluşturursunuz her yükleme
yaptığınızda bu tabloya en son şu tarihte yükleme yaptım tarzında bir kayıt
atarsınız ve variable ile burada okuyup son_aktardığım_tarih’e eşitlersiniz.
Artık elimizde hangi sütunlar üzerinden CDC yapacağımız ve
son aktarım tarihi var artık veriyi alıp ODS’deki tabloya basabiliriz.Fakat
burada şöyle bir sorun veri alıp direkt insert edemezsiniz!Çünkü güncellenen
datalarda geldiği için ODS katmanınızda duplice datalar oluşur.Bunun için
yapmanız gereken şey veriyi öncelikle ODS’de geçici bir tabloya
alacağız.Örneğin tablomuz ODS_SALES olsun bizim veriyi ilk aktaracağımız tablo
aslında TEMP_ODS_SALES gibi bir tablo olacak.Veriyi ODS katmanına taşıyorum ki ODS_SALES
ile TEMP_ODS_SALES arasında ilişki kurabileyim.Çünkü şimdi iki veride aynı DB
üzerinde.Söylemeye ihtiyaç duyamadım ama elbette tablonuz üzerinde uniqe bir
key bir PK veya bir composite unique key olmalı muhakkak varlık yokluk kontrolü
için.Bu noktadan sonra iki şey yapabilirsiniz ya ODS_SALES’de ve TEMP_ODS_SALES’de olan
dataları ODS_SALES’den silersiniz çünkü TEMP_ODS_SALES’den güncel halini
yükleyeceğiz zaten ya da MERGE INTO ile ODS_SALES’e yüklersiniz.
Ben açıkçası MERGE INTO tercih ediyorum çoğu zaman çünkü
DELETE ile yaptığınızda o tablo üzerinde bir SK(Surrrogate Key) alanı var ise
tekrar yakalamıyorsunuz ve indexler DELETE’de daha çok yoruyor.
Sonrasında TEMP_ODS_SALES tablosunu drop ettininiz ve 1
milyar data yerine sadece 3 milyon data aldınız.
Süre farkını şöyle ifade edeyim 5 saatten 30 dk’a
düşebilirsiniz ODS yüklemesi anlamında çok çok çok önemli bir yaklaşımdır.Çünkü
bizde ETL hata alır sabah çalıştırdığımızda ETL süreniz 8 saat olursa mesai
biter raporlar yeni oluşmaya başlar😊
Aynı zamanda mülakatlarda çok sorulur anlamış,sindirmiş
şekilde cevap verirseniz çok öne geçersiniz.
ETL toolu bağımsız hepsinde yapılır!!ODI üzerine konuşuyor
Talend’i bağlamaz gibi düşünmeyin 😊