Delta Lake Temizliği ile Depolama Alanı Optimizasyonu

Herkese merhaba!

Gittikçe artan veri hacimleriyle birlikte, verilerin depolanması, yönetilmesi konusundaki güçlüklerin de benzer oranda arttığını biliyoruz.  Açık kaynaklı bir depolama katmanı olan olan Delta Lake kullanıyorsanız, bir Delta tablosunda yapılan tüm değişikliklerin izlenmesi için kullanılan log dosyaları ve verilerin kaydedildiği parquet uzantılı dosyaların zamanla arttığını gözlemlemişsinizdir. Bu dosyalar zamanla ciddi boyutlara ulaşabilir, sorgu performansını düşürebilir veya gereksiz depolama maliyetine sebep olabilir.  Bugünkü yazımızda, Delta tablolarını “vacuum” ile nasıl temizleyeceğimize ve ihtiyaca göre veri saklama sürelerini nasıl ayarlayacağımıza değineceğiz. 

Öncelikle veri saklama süreleri ile başlayalım. Aşağıda S3 uyumlu bir nesne depolama aracı olan MinIO’da json formatındaki log dosyalarını ve parquet uzantılı veri dosyalarını görebiliyoruz. 

Şekil-1: Delta Table Log Klasörü ve Veri Dosyaları
Şekil-2: Delta Table Log Dosyaları

Log saklama süresini (yani bir tablo için geçmişin ne kadar süre ile tutulacağını) belirlemek için aşağıdaki delta table özelliğini kendimize uygun olarak değiştirebiliyoruz.  Vacuum komutu çalıştırmadığımız sürece, belirlediğimiz bu periyot kadar “time travel” özelliğini de kullanabiliyoruz. 

## Varsayılan değer 30 gün

delta.logRetentionDuration = "interval <interval>"

Bu değişikliği yaptıktan sonra, bir “checkpoint” yazıldığında, log tutma süresinden daha eski olan loglar otomatik olarak temizlenmektedir.  Beklentilerimize uygun süreyi ayarlamak dışında yapmamız gereken bir şey yok. 

Bir veri dosyasının (parquet), vacuum işleminde silinip silinmemesi gerektiğini belirleyen süreyi ise aşağıdaki delta table özelliğini kullanarak değiştirebiliyoruz.  Böylece bir delta tablosu tarafından başvurulmayan/kullanılmayan ve belirlediğimiz bu saklama süresinden daha eski olan veri dosyaları vacuum işlemi uygulandığında silinmektedir, ancak bu işlem otomatik olarak gerçekleşmemektedir. 

# Ön tanımlı değer 7 gün

delta.deletedFileRetentionDuration = "interval <interval>"

Şimdi, bir Jupyter notebook üzerinde Spark (pyspark) ile bu işlemlerin nasıl uygulanacağını bir kaç satırda göstermek istiyorum.  Delta tablosu formatında kaydedilmiş bir tablonuz olduğunu ve Spark-MinIO (veya diğer nesne depolama araçları) konfigürasyonunun sağlandığını varsayarak ilerliyorum.

  • Delta tablomuzu okuyalım.
dt = DeltaTable.forPath(spark,'s3a://public/lighting_fault_detection')
  • Mevcut tablo özelliklerini kontrol edelim.
spark.sql("SHOW TBLPROPERTIES delta.`s3a://public/lighting_fault_detection`").toPandas()

Aşağıda görebileceğiniz şekilde, henüz bir ayar değişikliği yapmadığımız için mevcut tablo özelliklerinde yukarıda konuştuğumuz değerler görünmemektedir. 

Şekil-3: Tablo Özellikleri (öncesi)
  • Log saklama süresini değiştirelim.
spark.sql("""ALTER TABLE delta.`s3a://public/lighting_fault_detection` SET TBLPROPERTIES ('delta.logRetentionDuration' ='interval 15 days') """)
  • Şimdi vacuum işlemine aday olacak dosyalar için süreyi belirleyelim. Ben vacuum işleminden sonraki durumu gösterebilmek için 1 gün olarak ayarladım.  Siz önerilen ve varsayılan değer olan 7 günü değiştirmeyebilirsiniz veya yine kendinize uygun aralığı belirleyebilirsiniz.
spark.sql("""ALTER TABLE delta.`s3a://public/lighting_fault_detection` SET TBLPROPERTIES ('delta.deletedFileRetentionDuration' ='interval 1 days') """)

Tekrar tablo özelliklerini kontrol ettiğimizde,  yaptığımız değişikliklerin yansıdığını aşağıda görebiliyoruz.

Şekil-4: Tablo özellikleri (sonrası)

Evet şimdi sıra vacuum işlemine geldi.  Aşağıdaki kodu çalıştırdığımızda, herhangi bir parametre belirtmediğimiz için, saklama süresinden (yukarıda benim 1 gün olarak düzenlediğim değerden) daha eski sürümlerin ihtiyaç duymadığı dosyaların silindiğini göreceğiz.  Bu işlemi otomatize etmek artık biz geliştiriciler için keyifli ve kolay bir iş😏

dt.vacuum() # Belirlediğimiz veri tutulma süresinden

Arayüzden kontrol ettiğimizde pazartesine ait dosyaların silindiğini gözlemliyoruz.

Bu yazımızda veri projelerinde kullanılmayan dosyaların etkili bir şekilde silinmesi için vazgeçilmez bir unsur olan vacuum’u kullanarak ve log saklama süresinde düzenleme yaparak daha verimli bir depolama alanı kullanılmasına ve maliyet düşüşüne imkan sağlamaya çalıştık.  Çalışırken etrafı da temiz tutmak ve maliyeti kontrol altına almak önemli değil mi😊 Yeni yazılarda görüşmek üzere!✌️

Kaynaklar:

https://docs.delta.io/

https://docs.databricks.com/en/delta/vacuum.html

Yazar Hakkında
Toplam 7 yazı
Elif Sinem AKTAŞ
Elif Sinem AKTAŞ
DataLonga'da Data Engineer olarak çalışmaktadır. Teknolojiye ve veri bilimine olan ilgisi sebebiyle çıktığı yolda, günümüzün yeniliklerine yönelik gelişmeye ve öğrendiklerini paylaşmaya devam etmektedir.
Yorumlar (Yorum yapılmamış)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara