Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Apache Spark küme yapılandırmasını belirli bir iş yükünüz için nasıl iyileştireceğinizi öğrenin. En yaygın zorluk hatalı yapılandırmalardan (özellikle yanlış boyutlandırılmış yürütücüler), uzun süre çalışan işlemlerden ve Kartezyen işlemlerle sonuçlanan görevlerden kaynaklanan bellek baskısıdır. Uygun önbelleğe alma ile ve veri dengesizliği sağlayarak işleri hızlandırabilirsiniz. En iyi performans için uzun süre çalışan ve kaynak tüketen Spark iş yürütmelerini izleyin ve gözden geçirin.
Aşağıdaki bölümlerde yaygın Spark işi iyileştirmeleri ve önerileri açıklanmaktadır.
Veri soyutlamasını 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.
- Dataset
- 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.
- Etki alanı nesne programlama ve derleme zamanı denetimleri sağlayarak geliştirici dostudur.
- Serileştirme/seri durumdan çı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şturmanız gerekmediği sürece RDD kullanmanız gerekmez.
- Catalyst aracılığıyla sorgu iyileştirmesi yok.
- Tam aşamalı kod oluşturma yok.
- Yüksek GC yükü.
- Spark 1.x eski API'lerini kullanmalıdır.
En iyi veri biçimini kullanma
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 biçim, Spark 2.x'te varsayılan olan tutturma sıkıştırmalı parkedir. Parquet verileri sütun biçiminde depolar ve Spark'ta yüksek oranda iyileştirilmiştir. Buna ek olarak, hızlı sıkıştırma gzip sıkıştırması den daha büyük dosyalara neden olabilir. Bu dosyaların bölünebilir yapısı nedeniyle, daha hızlı açılır.
Önbelleği kullanma
Spark, , .cache()ve CACHE TABLEgibi .persist()farklı yöntemlerle kullanılabilen kendi yerel önbelleğe alma mekanizmalarını sağlar. Bu yerel önbelleğe alma, hem küçük veri kümelerinde hem de 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.
Belleği verimli kullanma
Spark, verileri belleğe yerleştirerek çalışır, bu nedenle bellek kaynaklarını yönetmek Spark işlerinin yürütülmesini iyileştirmenin önemli bir yönüdür. Kümenizin belleğini verimli bir şekilde kullanmak için uygulayabileceğiniz çeşitli teknikler vardır.
Daha küçük veri bölümlerini tercih edin ve bölümleme stratejinizde veri boyutu, türleri ve dağıtımı için hesap oluşturun.
Synapse Spark'ta (Çalışma Zamanı 3.1 veya üzeri), Kryo veri serileştirmesi varsayılan olarak Kryo veri serileştirmesi etkindir.
spark yapılandırmasını kullanarak iş yükü gereksinimlerinize göre kryoserializer arabellek boyutunu özelleştirebilirsiniz:
// Set the desired property spark.conf.set("spark.kryoserializer.buffer.max", "256m")Spark yapılandırma ayarlarını izleyin ve ayarlayın.
Başvurunuz için Spark bellek yapısı ve bazı anahtar yürütücü bellek parametreleri sonraki görüntüde gösterilir.
Spark bellekle ilgili dikkat edilmesi gerekenler
Azure Synapse'te Apache Spark YARN Apache Hadoop YARN kullanır, YARN her Spark düğümündeki tüm kapsayıcılar tarafından kullanılan maksimum bellek toplamını denetler. Aşağıdaki diyagramda anahtar nesneler ve bunların ilişkileri gösterilmektedir.

'Bellek yetersiz' iletilerini ele almak için şunları deneyin:
- DAG Yönetim Karıştırmalarını gözden geçirin. Harita tarafı azaltma, önceden bölümleme (veya demetleme) kaynak verilerine göre azaltma, tek karıştırmaları en üst düzeye çıkarma ve gönderilen veri miktarını azaltma.
- Toplamalar, pencereleme ve diğer işlevler sağlayan ancak ilişkisiz bellek sınırına sahip olan sabit bellek sınırı
GroupByKeyile tercih edinReduceByKey. TreeReduceYürütücüler veya bölümler üzerinde daha fazla iş yapan öğesini tercih edinReduce; bu da sürücüde çalışır.- Alt düzey RDD nesneleri yerine DataFrame'lerden yararlanın.
- "İlk N", çeşitli toplamalar veya pencereleme işlemleri gibi eylemleri kapsülleyen ComplexType'lar oluşturun.
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
- Kryo serileştirme varsayılandır. Daha yeni bir biçimdir ve Java'dan daha hızlı ve daha kısa serileştirmeye neden olabilir. Kryo, dersleri programınıza kaydetmenizi gerektirir ve henüz tüm Serileştirilebilir türleri desteklemez.
Gruplandırmayı kullanma
Demetleme, veri bölümlemeye benzer, ancak her demet yalnızca bir sütun değeri yerine bir dizi sütun değerini barındırabilir. Demetleme, ü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 sonuç verir. Demet, satırın demet anahtarı karma olarak 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:
- Demet meta bilgilerini temel alan sorgu iyileştirmesi.
- İyileştirilmiş toplamalar.
- İyileştirilmiş birleşimler.
Bölümleme ve demeti aynı anda kullanabilirsiniz.
Birleştirmeleri ve karıştırmaları iyileştirme
Birleştirme veya Karıştırmada yavaş işleriniz varsa, bunun nedeni büyük olasılıkla iş verilerinizde asimetri olan veri dengesizliğidir. Örneğin, bir eşleme işi 20 saniye sürebilir, ancak verilerin birleştirildiği veya karıştırıldığı bir işi çalıştırmak saatler sürer. Veri dengesizliklerini düzeltmek için anahtarın tamamını tuzlamalısınız veya anahtarların yalnızca bir alt kümesi için yalıtılmış bir tuz kullanmalısınız. Yalıtılmış bir tuz kullanıyorsanız, harita birleştirmelerinde tuzlanmış anahtar alt kümenizi yalıtmak için daha fazla filtreleme yapmanız gerekir. Bir diğer seçenek demet sütununu ve önceden toplamayı önce demetlere eklemektir.
Yavaş birleştirmelere neden olan bir diğer faktör de birleştirme türü olabilir. Spark varsayılan olarak birleştirme türünü kullanır SortMerge . Bu birleştirme türü büyük veri kümeleri için en uygun yöntemdir, ancak birleştirmeden önce verilerin sol ve sağ taraflarını sıralaması gerektiğinden hesaplama açısından pahalıdır.
Birleştirme Broadcast , daha küçük veri kümeleri için veya birleştirmenin bir tarafının diğer taraftan çok daha küçük olması için uygundur. Bu tür bir birleşim yayını tüm yürütücülere tek taraflı yayınlar ve bu nedenle genel olarak yayınlar için daha fazla bellek gerektirir.
ayarıyla spark.sql.autoBroadcastJoinThresholdyapılandırmanızdaki birleştirme türünü değiştirebilir veya DataFrame API'lerini (dataframe.join(broadcast(df2)) ) kullanarak birleştirme ipucu ayarlayabilirsiniz.
// Option 1
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", 1*1024*1024*1024)
// Option 2
val df1 = spark.table("FactTableA")
val df2 = spark.table("dimMP")
df1.join(broadcast(df2), Seq("PK")).
createOrReplaceTempView("V_JOIN")
sql("SELECT col1, col2 FROM V_JOIN")
Demetlenmiş tablolar kullanıyorsanız üçüncü bir birleştirme türüne (birleştirme) Merge sahip olursunuz. Doğru şekilde önceden bölümlenmiş ve önceden sıralanmış bir veri kümesi, birleştirmeden SortMerge pahalı sıralama aşamasını atlar.
Birleştirmelerin sırası, özellikle daha karmaşık sorgularda önemlidir. En seçmeli birleşimlerle başlayın. Ayrıca, mümkün olduğunda toplamalardan sonra satır sayısını artıran birleşimleri taşıyın.
Kartezyen birleşimleri için paralelliği yönetmek için iç içe yapılar ekleyebilir, pencereleyebilir ve Spark İşinizde bir veya daha fazla adımı atlayabilirsiniz.
Doğru yürütücü boyutunu seçin
Yürütücü yapılandırmanıza karar verirken Java çöp toplama (GC) ek yükünü göz önünde bulundurun.
Yürütücü boyutunu küçültmek için faktörler:
- GC ek yükünü < %10 korumak için yığın boyutunu 32 GB'ın altına düşürün.
- GC ek yükünü < %10 korumak için çekirdek sayısını azaltın.
Yürütücü boyutunu artırmaya yönelik faktörler:
- Yürütücüler arasındaki iletişim yükünü azaltın.
- Daha büyük kümelerde yürütücüler (N2) arasındaki açık bağlantı sayısını azaltın (>100 yürütücü).
- Yoğun bellek kullanan görevlere uyum sağlamak için yığın boyutunu artırın.
- İsteğe bağlı: Yürütücü başına bellek yükünü azaltın.
- İsteğe bağlı: CPU'ya fazla abone olarak kullanımı ve eşzamanlılığı artırın.
Yürütücü boyutunu seçerken genel bir kural olarak:
- Yürütücü başına 30 GB ile başlayın ve kullanılabilir makine çekirdeklerini dağıtabilirsiniz.
- Daha büyük kümeler için yürütücü çekirdeği sayısını artırın (> 100 yürütücü).
- Boyutu hem deneme çalıştırmalarına hem de GC ek yükü gibi önceki faktörlere göre değiştirin.
Eşzamanlı sorgular çalıştırırken aşağıdakileri göz önünde bulundurun:
- Yürütücü ve tüm makine çekirdekleri başına 30 GB ile başlayın.
- CPU'ya fazla abone yaparak (yaklaşık %30 gecikme süresi iyileştirmesi) birden çok paralel Spark uygulaması oluşturun.
- Sorguları paralel uygulamalar arasında dağıtma.
- Boyutu hem deneme çalıştırmalarına hem de GC ek yükü gibi önceki faktörlere göre değiştirin.
Zaman çizelgesi görünümüne, SQL grafiğine, iş istatistiklerine vb. bakarak aykırı değerler veya diğer performans sorunları için sorgu performansınızı izleyin. Bazen yürütücülerden biri veya birkaçı diğerlerinden daha yavaştır ve görevlerin yürütülmesi çok daha uzun sürer. Bu genellikle büyük kümelerde (> 30 düğüm) gerçekleşir. Bu durumda, zamanlayıcının yavaş görevleri telafi edebilmesi için çalışmayı daha fazla sayıda görev olarak bölün.
Örneğin, uygulamadaki yürütücü çekirdeği sayısının en az iki katı kadar görevi vardır. Ayrıca ile conf: spark.speculation = truegörevlerin tahmini yürütülmesini etkinleştirebilirsiniz.
İş yürütmeyi iyileştirme
- Gerekirse önbelleğe alın, örneğin verileri iki kez kullanıyorsanız önbelleğe alın.
- Değişkenleri tüm yürütücülere yayınlar. Değişkenler yalnızca bir kez seri hale getirilerek daha hızlı aramalar elde edilir.
- Sürücüdeki iş parçacığı havuzunu kullanın; bu da birçok görev için daha hızlı işlemle sonuçlanır.
Spark 2.x sorgu performansının anahtarı, tam aşamalı kod oluşturma işlemine bağlı olan Tungsten altyapısıdır. Bazı durumlarda, tam aşamalı kod oluşturma devre dışı bırakılabilir.
Örneğin, toplama ifadesinde sabit olmayan bir tür (string) kullanıyorsanız yerine SortAggregate görüntülenir HashAggregate. Örneğin, daha iyi performans için aşağıdakileri deneyin ve ardından kod oluşturmayı yeniden etkinleştirin:
MAX(AMOUNT) -> MAX(cast(AMOUNT as DOUBLE))