Aracılığıyla paylaş


Apache Spark için veri depolama iyileştirmesi

Bu makalede, Azure HDInsight'ta verimli Apache Spark iş yürütmesi için veri depolamayı iyileştirme stratejileri ele alınmaktadır.

Genel Bakış

Spark csv, json, xml, parquet, orc ve avro gibi birçok biçimi destekler. Spark, dış veri kaynaklarıyla çok daha fazla biçimi destekleyecek şekilde genişletilebilir. Daha fazla bilgi için bkz . Apache Spark paketleri.

Performans için en iyi format, Spark 2.x'te varsayılan olan snappy sıkıştırmalı parquet biçimidir. Parquet verileri sütun biçiminde depolar ve Spark'ta yüksek oranda iyileştirilmiştir.

Veri soyutlama seçme

Önceki Spark sürümlerinde verileri soyutlama amacıyla RDD'ler kullanılır, Spark 1.3 ve 1.6 sırasıyla DataFrame'ler ve DataSet'ler kullanıma sunulmuştur. Aşağıdaki göreli değerleri göz önünde bulundurun:

  • Veri Çerçeveleri
    • Çoğu durumda en iyi seçim.
    • Catalyst aracılığıyla sorgu iyileştirmesi sağlar.
    • Tam aşamalı kod oluşturma.
    • Doğrudan bellek erişimi.
    • Düşük çöp toplama (GC) yükü.
    • Derleme zamanı denetimleri veya etki alanı nesne programlaması olmadığından DataSets kadar geliştirici dostu değildir.
  • Veri Kümeleri
    • Performans etkisinin kabul edilebilir olduğu karmaşık ETL işlem hatlarında iyidir.
    • Performans etkisinin önemli ölçüde olabileceği toplamalarda iyi değildir.
    • Catalyst aracılığıyla sorgu iyileştirmesi sağlar.
    • Alan nesnesi programlama ve derleme zamanı denetimleri sağlayarak geliştirici dostudur.
    • Serileştirme/seriden çıkarma ek yükü ekler.
    • Yüksek GC yükü.
    • Tüm aşamalı kod oluşturmayı bozar.
  • RDD'ler
    • Yeni bir özel RDD oluşturma durumunda olmadığınız sürece RDD kullanmanız gerekmez.
    • Catalyst üzerinden sorgu iyileştirmesi yapılmamaktadır.
    • Tam aşamalı kod oluşturma yok.
    • Yüksek GC yükü.
    • Spark 1.x eski API'lerini kullanmalıdır.

Varsayılan depolamayı seçin

Yeni bir Spark kümesi oluşturduğunuzda, kümenizin varsayılan depolama alanı olarak Azure Blob Depolama'yı veya Azure Data Lake Storage'ı seçebilirsiniz. Her iki seçenek de geçici kümeler için uzun vadeli depolama avantajı sağlar. Bu nedenle kümenizi sildiğinizde verileriniz otomatik olarak silinmez. Geçici bir kümeyi yeniden oluşturabilir ve verilerinize erişmeye devam edebilirsiniz.

Mağaza Türü Dosya Sistemi Hız Geçici Kullanım Örnekleri
Azure Blob Depolama wasb://url/ Standart Evet Geçici küme
Azure Blob Depolama (güvenli) wasbs://url/ Standart Evet Geçici küme
Azure Data Lake Storage Gen 2 abfs://url/ Hızlı Evet Geçici küme
** Azure Data Lake Storage Birinci Nesil adl://url/ Hızlı Evet Geçici küme
Yerel HDFS hdfs://url/ En Hızlı Hayı Etkileşimli 7/24 küme

Depolama seçeneklerinin tam açıklaması için bkz. Azure HDInsight kümeleriyle kullanılacak depolama seçeneklerini karşılaştırma.

Önbelleği kullanma

Spark, , .persist()ve .cache()gibi CACHE TABLEfarklı yöntemlerle kullanılabilen kendi yerel önbelleğe alma mekanizmalarını sağlar. Bu yerel önbelleğe alma, küçük veri kümelerinde ve ara sonuçları önbelleğe almanız gereken ETL işlem hatlarında etkilidir. Ancak, önbelleğe alınmış bir tablo bölümleme verilerini tutmadığından Spark yerel önbelleğe alma şu anda bölümlemeyle iyi çalışmıyor. Depolama katmanı önbelleğe alma daha genel ve güvenilir bir önbelleğe alma tekniğidir.

  • Yerel Spark önbelleğe alma (önerilmez)

    • Küçük veri kümeleri için iyidir.
    • Gelecekteki Spark sürümlerinde değişebilecek bölümleme ile çalışmaz.
  • Depolama düzeyinde önbelleğe alma (önerilir)

    • IO Önbelleği özelliği kullanılarak HDInsight üzerinde uygulanabilir.
    • Bellek içi önbellek ve SSD önbelleği kullanır.
  • Yerel HDFS (önerilen)

    • hdfs://mycluster yol.
    • SSD önbelleğe alma özelliğini kullanır.
    • Kümeyi sildiğinizde önbelleğe alınan veriler kaybolur ve önbellek yeniden derlenmesi gerekir.

Veri serileştirmesini iyileştirme

Spark işleri dağıtılır, bu nedenle uygun veri serileştirme en iyi performans için önemlidir. Spark için iki serileştirme seçeneği vardır:

  • Java serileştirme varsayılandır.
  • Kryo serileştirme daha yeni bir biçimdir ve Java'dan daha hızlı ve daha kısa serileştirmeye neden olabilir. Kryo , sınıfları programınıza kaydetmenizi gerektirir ve henüz tüm Serileştirilebilir türleri desteklemez.

Gruplandırmayı kullan

Demetleme, veri bölümlemeye benzer. Ancak her kova yalnızca bir sütun değeri yerine bir dizi sütun değerini barındırabilir. Bu yöntem, ürün tanımlayıcıları gibi büyük (milyonlarca veya daha fazla sayıda) değer üzerinde bölümleme için iyi çalışır. Satırın bucket anahtarının hashlenmesiyle bir bucket belirlenir. Demetlenmiş tablolar, demetleme ve sıralama ile ilgili meta verileri depoladıkları için benzersiz iyileştirmeler sunar.

Bazı gelişmiş demet oluşturma özellikleri şunlardır:

  • Kümeleme meta bilgilerini temel alan sorgu iyileştirmesi.
  • İyileştirilmiş agregasyonlar.
  • Optimizasyon yapılmış bağlantılar.

Bölümleme ve kümelemeyi aynı anda kullanabilirsiniz.

Sonraki adımlar