13 Ağustos 2024

CDC(Change Data Capture) Nedir,Nasıl Yapılır?

 

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 😊