Aracılığıyla paylaş


Apache Spark için veri işleme iyileştirmesi

Bu makalede, Azure HDInsight'ta en iyi performans için Apache Spark kümenizin yapılandırmasını iyileştirme adımları anlatılmaktadır.

Genel Bakış

Join veya Shuffle üzerinde yavaş işleriniz varsa, bunun nedeni büyük olasılıkla veri dengesizliğidir. Veri dengesizliği, iş verilerinizde asimetridir. Örneğin, bir harita işi 20 saniye sürebilir. Ancak verilerin birleştirildiği veya karıştırıldığı bir işin çalıştırılması 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 filtre uygulamanız gerekir. Bir diğer seçenek de demet sütunu eklemek ve önce demetlerde önceden toplama yapmaktır.

Yavaş birleştirmelere neden olan bir diğer faktör de birleştirme türü olabilir. Varsayılan olarak Spark birleştirme türünü kullanır SortMerge . Bu birleştirme türü büyük veri kümeleri için en uygun olanıdır. Ancak, verileri birleştirmeden önce önce sol ve sağ taraflarını sıralaması gerektiğinden hesaplama açısından pahalıdır.

Broadcast Birleşim, 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 idealdir. Bu birleşim türü, yayınları tüm yürütücülere tek taraflı olarak sağlar ve bu nedenle yayınlar için genel olarak 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ü birleşim türü olan birleştirmeye Merge sahip olursunuz. Doğru şekilde önceden bölümlenmiş ve önceden sıralanmış bir veri kümesi, bir birleştirmeden SortMerge pahalı sıralama aşamasını atlar.

Birleştirme 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ştirmeleri taşıyın.

Kartezyen birleşimlerinde paralelliği yönetmek için iç içe yapılar, pencereleme ekleyebilir ve Spark İşinizde bir veya daha fazla adımı atlayabilirsiniz.

İş yürütmeyi iyileştirme

  • Gerektiğinde ö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ınlama. 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.

Performans sorunları için çalışan işlerinizi düzenli olarak izleyin. Belirli sorunlarla ilgili daha fazla içgörüye ihtiyacınız varsa aşağıdaki performans profili oluşturma araçlarından birini göz önünde bulundurun:

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 değiştirilebilir 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))

Sonraki adımlar