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ştirmek için stratejiler 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 sayıda daha fazla biçim desteklemek için genişletilebilir. daha fazla bilgi için bkz. Apache Spark paketleri.
Performans için en iyi biçim, Spark 2. x içinde varsayılan değer olan Snappy sıkıştırması ile birlikte Parquet 'tir. Parquet, verileri sütunlu biçimde depolar ve Spark 'ta çok iyileştirilir.
Veri soyutlama seçin
Önceki Spark sürümleri, verileri, Spark 1,3 ve 1,6 ' nin sırasıyla veri çerçeveleri ve veri kümelerini kullanıma sunmuştur. Aşağıdaki göreli birleşmenizi 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 atık toplama (GC) ek yükü.
- Derleme zamanı denetimleri veya etki alanı nesne programlaması olmadığı için geliştirici kullanımı, veri kümeleri olarak kolay değildir.
- Kümelerinin
- Performans etkisinin kabul edilebilir olduğu karmaşık ETL işlem hatları ile iyidir.
- Performans etkisinin önemli ölçüde önemli olabileceği toplamalar iyi değildir.
- Catalyst aracılığıyla sorgu iyileştirmesi sağlar.
- Etki alanı nesne programlama ve derleme zamanı denetimleri sunarak kolayca geliştirme.
- Serileştirme/seri kaldırma ek yükü ekler.
- Yüksek GC ek yükü.
- Tüm kod üretimini keser.
- RDD'ler
- Yeni bir özel RDD oluşturmanız gerekmedikçe, RDDs kullanmanız gerekmez.
- Catalyst aracılığıyla sorgu iyileştirmesi yok.
- Tamamen aşamalı kod üretimi yok.
- Yüksek GC ek yükü.
- Spark 1. x eski API 'Leri kullanılmalı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 veya Azure Data Lake Storage seçebilirsiniz. Her iki seçenek de, geçici kümeler için uzun süreli depolamanın avantajını 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||Larsa||Kullanım Örnekleri|
|Azure Blob Depolama||fazla b://||Standart||Yes||Geçici küme|
|Azure Blob depolama (güvenli)||fazla BS://||Standart||Yes||Geçici küme|
|Azure Data Lake Storage 2. Nesil||ABFS://||Lýdýr||Yes||Geçici küme|
|Azure Data Lake Storage 1. Nesil||adl://||Lýdýr||Yes||Geçici küme|
|Yerel olarak||Bu ://||En hızlı||No||Etkileşimli 24/7 kümesi|
Depolama seçeneklerinin tam açıklaması için bkz. Azure HDInsight kümeleri ile kullanım için depolama seçeneklerini karşılaştırma.
Önbelleği kullanma
Spark,, ve gibi farklı yöntemler aracılığıyla kullanılabilecek kendi yerel önbelleğe alma mekanizmalarını sağlar
.persist()
.cache()
CACHE TABLE . Bu yerel önbelleğe alma, küçük veri kümeleri ve ara sonuçları önbelleğe almanız gereken ETL işlem hatları ile etkilidir. Ancak, bir önbelleğe alınmış tablo bölümleme verilerini tutduğundan Spark Native Caching Şu anda bölümlendirme ile iyi çalışmaz. Daha genel ve güvenilir önbelleğe alma tekniği, depolama katmanı önbelleğe alma tekniğidir.
Yerel Spark önbelleğe alma (önerilmez)
- Küçük veri kümeleri için iyi.
- Bölümlendirme ile çalışmaz ve bu, gelecekteki Spark sürümlerinde değişebilir.
Depolama düzeyi önbelleğe alma (önerilir)
- , GÇ önbelleği özelliği kullanılarak HDInsight üzerinde uygulanabilir.
- Bellek içi ve SSD önbelleği kullanır.
Yerel olarak (önerilir)
hdfs://myclusterYolun.
- SSD önbelleği kullanır.
- Önbelleğe alınmış veriler, kümeyi sildiğinizde, önbellek yeniden oluşturması gerekmeden kaybedilir.
-
Veri serileştirmesini iyileştirme
Spark işleri dağıtılır, bu nedenle en iyi performans için uygun veri serileştirme önem taşır. Spark için iki serileştirme seçeneği vardır:
- Java serileştirme varsayılandır.
Kryoserileştirme daha yeni bir biçimdir ve Java 'dan daha hızlı ve daha küçük seri hale getirme oluşmasına neden olabilir.
Kryo, sınıfları programınıza kaydetmenizi gerektirir ve henüz tüm serileştirilebilir türleri desteklemez.
Gruplandırmayı kullanma
Demetlenmesidir, veri bölümlemeye benzer. Ancak her demet yalnızca bir tane yerine bir sütun değerleri kümesi tutabilir. Bu yöntem, ürün tanımlayıcıları gibi büyük (milyonlarca veya daha fazla) değer üzerinde bölümlendirme için iyi bir sonuç verir. Bir demet, satırın demet anahtarı karma tarafından belirlenir. Bulaştırılmış tablolar, verilerin nasıl kullanıldığı ve sıralandığı hakkında meta verileri depoladıklarından benzersiz iyileştirmeler sunmaktadır.
Bazı gelişmiş demetlenmesidir özellikleri şunlardır:
- Demetlenmesidir meta bilgilerine dayalı sorgu iyileştirmesi.
- İyileştirilmiş toplamalar.
- İyileştirilmiş birleşimler.
Bölümleme ve demetlenmesidir 'ı aynı anda kullanabilirsiniz.