Pengoptimalan penyimpanan data untuk Apache Spark
Artikel ini membahas strategi untuk mengoptimalkan penyimpanan data untuk eksekusi pekerjaan Apache Spark yang efisien di Azure HDInsight.
Gambaran Umum
Spark mendukung berbagai format, seperti csv, json, xml, parquet, orc, dan avro. Spark dapat diperluas untuk mendukung lebih banyak format dengan sumber data eksternal - untuk informasi selengkapnya, lihat paket Apache Spark.
Format terbaik untuk performa adalah parquet dengan kompresi tajam, yang merupakan default dalam Spark 2.x. Parket menyimpan data dalam format kolom, dan sangat dioptimalkan dalam Spark.
Pilih abstraksi data
Versi Spark sebelumnya menggunakan RDD untuk mengabstraksi data, Spark 1.3, dan 1.6 memperkenalkan masing-masing DataFrames dan DataSet. Pertimbangkan manfaat relatif berikut:
-
DataFrames
- Pilihan terbaik dalam sebagian besar situasi.
- Menyediakan pengoptimalan kueri melalui Catalyst.
- Pembuatan kode seluruh tahap.
- Akses memori langsung.
- Overhead pengumpulan sampah (garbage collection atau GC) rendah.
- Tidak ramah pengembang seperti DataSets, karena tidak ada pemeriksaan waktu kompilasi atau pemrograman objek domain.
-
DataSets
- Berjalan dengan baik dalam alur ETL kompleks di mana dampak performa dapat diterima.
- Tidak berjalan dengan baik dalam agregasi di mana dampak performa mungkin cukup besar.
- Menyediakan pengoptimalan kueri melalui Catalyst.
- Ramah pengembang dengan menyediakan pemrograman objek domain dan pemeriksaan waktu kompilasi.
- Menambahkan serialisasi/deserialisasi overhead.
- Overhead GC tinggi.
- Memecahkan seluruh tahap pembuatan kode.
-
RDD
- Anda tidak perlu menggunakan RDD, kecuali Anda perlu membuat RDD kustom baru.
- Tidak ada pengoptimalan kueri melalui Catalyst.
- Tidak ada pembuatan kode seluruh tahap.
- Overhead GC tinggi.
- Harus menggunakan API warisan Spark 1.x.
Pilih penyimpanan default
Saat membuat kluster Spark baru, Anda dapat memilih Azure Blob Storage atau Azure Data Lake Storage sebagai penyimpanan default kluster Anda. Kedua opsi memberi Anda manfaat penyimpanan jangka panjang untuk kluster sementara. Jadi, data Anda tidak dihapus secara otomatis saat Anda menghapus kluster. Anda dapat membuat ulang kluster sementara dan tetap dapat mengakses data Anda.
Tipe Penyimpanan | Sistem File | Kecepatan | Perubahan sementara | Kasus Penggunaan |
---|---|---|---|---|
Azure Blob Storage | wasb: //url/ | Standard | Ya | Kluster sementara |
Azure Blob Storage (aman) | wasbs: //url/ | Standard | Ya | Kluster sementara |
Azure Data Lake Storage Gen 2 | abfs: //url/ | Lebih Cepat | Ya | Kluster sementara |
Azure Data Lake Storage Gen 1 | adl: //url/ | Lebih Cepat | Ya | Kluster sementara |
HDFS lokal | hdfs: //url/ | Tercepat | Tidak | Kluster interaktif 24/7 |
Untuk deskripsi lengkap opsi penyimpanan, lihat opsi Membandingkan penyimpanan untuk digunakan dengan kluster Azure HDInsight.
Gunakan cache
Spark menyediakan mekanisme penembolokan aslinya sendiri, yang dapat digunakan melalui metode yang berbeda seperti .persist()
, .cache()
, dan CACHE TABLE
. Penembolokan asli ini efektif dengan himpunan data kecil dan dalam saluran ETL tempat Anda perlu melakukan cache hasil menengah. Namun, penembolokan asli Spark saat ini tidak berfungsi dengan baik dengan partisi, karena tabel cache tidak menyimpan data partisi. Teknik penembolokan yang lebih umum dan andal adalah cache lapisan penyimpanan.
Penembolokan asli Spark (tidak disarankan)
- Berjalan dengan baik untuk database kecil.
- Tidak berfungsi dengan partisi, yang dapat berubah dalam perilisan Spark pada masa mendatang.
Penembolokan tingkat penyimpanan (disarankan)
- Dapat diimplementasikan pada HDInsight menggunakan fitur IO Cache.
- Menggunakan penembolokan dalam memori dan SSD.
HDFS lokal (disarankan)
-
hdfs://mycluster
jalur. - Menggunakan penembolokan SSD.
- Data cache akan hilang saat Anda menghapus kluster, yang memerlukan pembuatan kembali cache.
-
Optimalkan serialisasi data
Pekerjaan spark didistribusikan, sehingga serialisasi data yang sesuai penting untuk performa terbaik. Ada dua opsi serialisasi untuk Spark:
- Serialisasi Java adalah pengaturan defaultnya.
-
Kryo
serialisasi adalah format yang lebih baru dan dapat menghasilkan serialisasi yang lebih cepat dan lebih ringkas daripada Java.Kryo
mengharuskan Anda mendaftarkan kelas dalam program Anda, dan belum mendukung semua jenis Serializable.
Gunakan pengelompokan
Bucketing atau pengelompokan mirip dengan partisi data. Tetapi setiap bucket dapat menampung sekumpulan nilai kolom alih-alih hanya satu nilai kolom. Metode ini bekerja dengan baik untuk partisi pada jumlah nilai besar (dalam jutaan atau lebih), seperti pengidentifikasi produk. Bucket ditentukan dengan hashing kunci bucket baris. Tabel dengan bucket menawarkan pengoptimalan unik karena menyimpan metadata tentang cara proses pengelompokan dan pengurutan.
Beberapa fitur pengelompokan lanjutan adalah:
- Pengoptimalan kueri berdasarkan meta-informasi bucketing.
- Agregasi yang dioptimalkan.
- Gabungan yang dioptimalkan.
Anda dapat menggunakan partisi dan bucketing secara bersamaan.