Share via


Apache Spark'ta yazmayı iyileştirme gereksinimi

Apache Spark gibi Büyük Veri işleme altyapılarında analitik iş yükleri, standartlaştırılmış daha büyük dosya boyutları kullanılırken en verimli performansı gösterir. Dosya boyutu, dosya sayısı, Spark çalışanlarının sayısı ve yapılandırmaları arasındaki ilişki, performans üzerinde kritik bir rol oynar. data lake tablolarına iş yüklerinin alımı, sürekli olarak çok sayıda küçük dosya yazmanın devralınan özelliğine sahip olabilir; bu senaryo genellikle "küçük dosya sorunu" olarak bilinir.

Yazma İyileştirme, yazılan dosya sayısını azaltan ve yazılan verilerin tek tek dosya boyutunu artırmayı hedefleyen Synapse üzerinde Delta Lake özelliğidir. Varsayılan 128 MB boyutuna sahip dosyalar oluştururken bölümleri dinamik olarak iyileştirir. Hedef dosya boyutu, yapılandırmalar kullanılarak iş yükü gereksinimleri başına değiştirilebilir.

Bu özellik, bölümler üzerinde fazladan veri karıştırma aşaması kullanarak dosya boyutuna ulaşır ve bu da verileri yazarken ek işlem maliyetine neden olur. Küçük yazma cezası, tablolardaki okuma verimliliğinden daha ağır basmalıdır.

Not

  • 3.1'in üzerindeki Apache Spark sürümleri için Synapse Havuzları'nda kullanılabilir.

Yazmaları İyileştirmenin Avantajları

  • Hem Batch hem de Streaming yazma desenleri için Delta Lake tablolarında kullanılabilir.
  • Komut düzenini değiştirmeniz spark.write gerekmez. Bu özellik bir yapılandırma ayarı veya tablo özelliği tarafından etkinleştirilir.
  • OPTIMIZE komutuyla karşılaştırıldığında yazma işlemlerinin sayısını azaltır.
  • OPTIMIZE işlemleri daha az dosyada çalıştığından daha hızlı olacaktır.
  • Başvurulmayan eski dosyaların silinmesi için VACUUM komutu da daha hızlı çalışır.
  • Sorgular daha iyi dosya boyutlarına sahip daha az dosyayı tarar ve okuma performansını veya kaynak kullanımını geliştirir.

Yazma kullanımı senaryolarını iyileştirme

Kullanılması gereken durumlar

  • Delta lake bölümlenmiş tablolar, en iyi duruma getirilmemiş (128 MB'tan az) veya standart olmayan dosya boyutları (kendi arasında farklı boyutlara sahip dosyalar) oluşturan yazma desenlerine tabidir.
  • Yetersiz dosya boyutuyla diske yazılacak yeniden bölümlenmiş veri çerçeveleri.
  • UPDATE, DELETE, MERGE, CREATE TABLE AS SELECT, INSERT INTO gibi küçük toplu SQL komutları tarafından hedeflenen Delta lake bölümlenmiş tabloları.
  • Delta lake bölümlenmiş tablolarına veri ekleme desenleri içeren ve ek yazma gecikmesinin tolere edilebilen akış alımı senaryoları.

Ne zaman önlenir?

  • Bölümlenmemiş tablolar.
  • Ek yazma gecikme süresinin kabul edilebilir olmadığı durumlar.
  • İyi tanımlanmış iyileştirme zamanlamalarına ve okuma desenlerine sahip büyük tablolar.

Yazma özelliğini iyileştirmeyi etkinleştirme ve devre dışı bırakma

Yazma iyileştirme özelliği varsayılan olarak devre dışıdır. Spark 3.3 Havuzu'nda bölümlenmiş tablolar için varsayılan olarak etkinleştirilir.

Havuz veya oturum için yapılandırma ayarlandıktan sonra, tüm Spark yazma desenleri işlevselliği kullanır.

En iyi duruma getirme yazma özelliğini kullanmak için aşağıdaki yapılandırmayı kullanarak etkinleştirin:

  1. Scala ve PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "true")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = true

Geçerli yapılandırma değerini denetlemek için aşağıda gösterildiği gibi komutunu kullanın:

  1. Scala ve PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.enabled")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled`

En iyi duruma getirme yazma özelliğini devre dışı bırakmak için aşağıdaki yapılandırmayı aşağıda gösterildiği gibi değiştirin:

  1. Scala ve PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "false")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = false

Tablo özelliklerini kullanarak yazmayı iyileştirmeyi denetleme

Yeni tablolarda

  1. SQL
CREATE TABLE <table_name> TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

DeltaTableBuilder API'sini kullanma:

val table = DeltaTable.create()
  .tableName("<table_name>")
  .addColumnn("<colName>", <dataType>)
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

Var olan tablolarda

  1. SQL
ALTER TABLE <table_name> SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

DeltaTableBuilder API'sini kullanma

val table = DeltaTable.replace()
  .tableName("<table_name>")
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

Yazma İyileştirme için geçerli en büyük dosya boyutu yapılandırmasını alma ve değiştirme

Geçerli yapılandırma değerini almak için bellow komutlarını kullanın. Varsayılan değer 128 MB'tır.

  1. Scala ve PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
  • Yapılandırma değerini değiştirmek için
  1. Scala ve PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728

Sonraki adımlar