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 kinerja adalah parket 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 DataSet, karena tidak ada pemeriksaan waktu kompilasi atau pemrograman objek domain.
  • DataSets
    • Berjalan dengan baik dalam saluran ETL kompleks di mana dampak kinerja dapat diterima.
    • Tidak berjalan dengan baik dalam agregasi di mana dampak kinerja 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 kinerja 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 diurutkan.

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.

Langkah berikutnya