Bagikan melalui


Pengoptimalan pemrosesan data untuk Apache Spark

Artikel ini membahas cara mengoptimalkan konfigurasi kluster Apache Spark Anda untuk performa terbaik di Microsoft Azure HDInsight.

Gambaran Umum

Jika Anda memiliki pekerjaan yang berjalan lambat pada Join atau Shuffle, penyebabnya mungkin kemiringan data. Kemiringan data adalah asimetri dalam data pekerjaan Anda. Contohnya, pekerjaan pemetaan bisa memakan waktu 20 detik. Tetapi menjalankan pekerjaan di mana data digabungkan atau diacak membutuhkan waktu berjam-jam. Untuk memperbaiki kemiringan data, Anda harus memberikan salt ke seluruh kunci, atau menggunakan salt terisolasi untuk beberapa subset kunci saja. Jika Anda menggunakan salt terisolasi, Anda harus memfilter lebih lanjut untuk mengisolasi subset kunci Anda yang diberi salt di gabungan peta. Pilihan lain adalah memasukkan kolom wadah dan pra-agregat dalam wadah terlebih dahulu.

Faktor lain yang menyebabkan gabungan lambat mungkin saja dikarenakan jenis gabungan. Secara default, Spark menggunakan jenis gabungan SortMerge. Jenis gabungan ini paling cocok untuk set data besar. Tetapi juga secara komputasi mahal karena harus terlebih dahulu mengurutkan sisi kiri dan kanan data sebelum menggabungkannya.

Gabungan Broadcast paling cocok untuk set data yang lebih kecil, atau di mana satu sisi gabungan jauh lebih kecil daripada sisi lain. Jenis gabungan ini menyiarkan satu sisi ke semua eksekutor, sehingga membutuhkan lebih banyak memori untuk siaran secara umum.

Anda dapat mengubah jenis gabungan dalam konfigurasi Anda dengan mengatur spark.sql.autoBroadcastJoinThreshold, atau Anda dapat mengatur petunjuk gabungan menggunakan DataFrame API (dataframe.join(broadcast(df2))).

// 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")

Jika menggunakan tabel yang dengan bucket, Anda memiliki jenis gabungan ketiga, gabungan Merge. Set data yang sebelumnya dipartisi dan diurutkan dengan benar akan melewatkan fase pengurutan mahal dari gabungan SortMerge.

Urutan gabungan merupakan hal yang penting, terutama dalam kueri yang lebih kompleks. Mulailah dengan gabungan yang paling selektif. Selain itu, pindahkan gabungan yang meningkatkan jumlah baris setelah agregasi jika memungkinkan.

Untuk mengelola paralelisme untuk gabungan Cartesian, Anda dapat menambahkan struktur bersarang, windowing, dan mungkin melewatkan satu atau beberapa langkah dalam Spark Job Anda.

Optimalkan pelaksanaan pekerjaan

  • Tembolokkan seperlunya, misalnya jika Anda menggunakan data dua kali, lalu tembolokkan.
  • Siarkan variabel ke semua eksekutor. Variabel hanya diserialkan sekali, menghasilkan pencarian yang lebih cepat.
  • Gunakan kumpulan rangkaian pada driver, yang menghasilkan operasi yang lebih cepat untuk banyak tugas.

Pantau pekerjaan Anda yang sedang berjalan secara teratur untuk masalah kinerja. Jika Anda memerlukan lebih banyak wawasan tentang masalah tertentu, pertimbangkan salah satu alat pembuatan profil kinerja berikut:

Kunci untuk kinerja kueri Spark 2.x adalah mesin Tungsten, yang bergantung pada pembuatan kode seluruh tahap. Dalam beberapa kasus, pembuatan kode seluruh tahap dapat dinonaktifkan. Contohnya, jika Anda menggunakan jenis yang tidak dapat berubah (string) dalam ekspresi agregasi, SortAggregate yang muncul dan bukan HashAggregate. Contohnya, untuk performa yang lebih baik, cobalah hal berikut ini lalu aktifkan ulang pembuatan kode:

MAX(AMOUNT) -> MAX(cast(AMOUNT as DOUBLE))

Langkah berikutnya