Pengoptimalan penyimpanan data untuk Apache Spark

Artikel ini membahas strategi untuk mengoptimalkan penyimpanan data untuk eksekusi pekerjaan Apache Spark yang efisien di Azure HDInsight.

Ikhtisar

Spark mendukung banyak 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 parquet dengan kompresi snappy, yang merupakan default dalam Spark 2.x. Parquet menyimpan data dalam format kolom, dan sangat dioptimalkan di Spark.

Pilih abstraksi data

Versi Spark sebelumnya menggunakan RDD untuk mengabstraksi data, Spark 1.3, dan 1.6 yang masing-masing memperkenalkan DataFrames dan Himpunan Data. Pertimbangkan manfaat relatif berikut:

  • DataFrame
    • Pilihan terbaik dalam sebagian besar situasi.
    • Menyediakan pengoptimalan kueri melalui Catalyst.
    • Pembuatan kode berbasis seluruh tahap.
    • Akses memori langsung.
    • Rendah overhead pengumpulan sampah (GC).
    • Tidak ramah pengembang sebagai Himpunan Data, karena tidak ada pemeriksaan waktu kompilasi atau pemrograman objek domain.
  • DataSets
    • Baik dalam alur ETL kompleks di mana dampak performa dapat diterima.
    • Tidak baik dalam agregasi di mana dampak performa dapat cukup besar.
    • Menyediakan pengoptimalan kueri melalui Catalyst.
    • Ramah pengembang dengan menyediakan pemrograman objek domain dan pemeriksaan waktu kompilasi.
    • Menambahkan overhead serialisasi/deserialisasi.
    • Overhead GC tinggi.
    • Menghentikan generasi kode seluruh tahap.
  • RDDs
    • Anda tidak perlu menggunakan RDD, kecuali Anda perlu membangun 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. Anda dapat membuat ulang kluster sementara dan masih mengakses data Anda.

Jenis Toko Sistem Berkas Kecepatan Transient Kasus Penggunaan
Azure Blob Storage wasb://url/ Standar Yes Kluster sementara
Azure Blob Storage (terjamin keamanannya) wasbs://url/ Standar Yes Kluster sementara
Azure Data Lake Storage Gen 2 abfs://url/ Cepat Yes Kluster sementara
Azure Data Lake Storage Gen 1 adl://url/ Cepat Yes Kluster sementara
HDFS Lokal hdfs://url/ tercepat No Kluster interaktif 24/7

Untuk deskripsi lengkap opsi penyimpanan, lihat Membandingkan opsi penyimpanan untuk digunakan dengan kluster Azure HDInsight.

Menggunakan cache

Spark menyediakan mekanisme penembolokan aslinya sendiri, yang dapat digunakan melalui metode yang berbeda seperti .persist(), .cache(), dan CACHE TABLE. Penyimpanan sementara ini efektif dengan himpunan data kecil dan dalam alur ETL di mana Anda perlu mencache hasil perantara. Namun, native caching Spark saat ini tidak berfungsi dengan baik dengan partisi, karena tabel yang di-cache tidak menyimpan data partisi. Teknik cache yang lebih umum dan andal adalah cache pada lapisan penyimpanan.

  • Penembolokan Spark asli (tidak disarankan)

    • Baik untuk himpunan data kecil.
    • Tidak berfungsi dengan pemartisian, yang dapat berubah dalam rilis Spark di masa mendatang.
  • Penembolokan tingkat penyimpanan (disarankan)

    • Dapat diimplementasikan pada HDInsight menggunakan fitur IO Cache .
    • Menggunakan caching dalam memori dan SSD.
  • HDFS lokal (disarankan)

    • hdfs://mycluster Jalan.
    • Menggunakan caching SSD.
    • Data yang di-cache akan hilang saat Anda menghapus kluster, memerlukan pembangunan kembali cache.

Mengoptimalkan serialisasi data

Pekerjaan Spark didistribusikan, jadi serialisasi data yang sesuai penting untuk performa terbaik. Ada dua opsi serialisasi untuk Spark:

  • Serialisasi Java adalah default.
  • 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 tipe Serializable.

Menggunakan pengelompokan

Bucketing mirip dengan pemartisian data. Tetapi setiap wadah dapat menyimpan sekumpulan nilai kolom daripada hanya satu. Metode ini berfungsi dengan baik untuk pemartisian pada jumlah nilai besar (dalam jutaan atau lebih), seperti pengidentifikasi produk. Bucket ditentukan dengan melakukan hashing pada kunci bucket baris. Tabel bucket menawarkan pengoptimalan unik karena mereka menyimpan metadata tentang bagaimana tabel tersebut di-bucket dan diurutkan.

Beberapa fitur bucketing tingkat lanjut adalah:

  • Pengoptimalan kueri berdasarkan meta-informasi pengelompokan.
  • Agregasi yang dioptimalkan.
  • Gabungan yang dioptimalkan.

Anda dapat menggunakan partisi dan bucketing secara bersamaan.

Langkah berikutnya