Partisi & Ember Sarang dengan Contoh

⚡ Ringkasan Cerdas

Partisi dan bucket adalah dua cara Apache Hive membagi data tabel pada disk: partisi membuat satu direktori per nilai kunci, sedangkan bucket membagi baris menjadi sejumlah file tetap.

  • Partisi adalah sebuah direktori: Setiap nilai unik dari kunci partisi akan menjadi subdirektori tersendiri di bawah folder tabel di HDFS.
  • Pemangkasan partisi: Kueri yang memfilter berdasarkan kunci partisi hanya membaca direktori yang cocok, bukan memindai seluruh tabel.
  • ⚙️ Mode dinamis diperlukan: Memuat banyak partisi dari sebuah perintah SELECT memerlukan pengaturan hive.exec.dynamic.partition.mode ke nonstrict.
  • 🧮 Bucket adalah sebuah file: CLUSTERED BY melakukan hashing pada kolom yang dipilih dan menulis setiap baris ke dalam salah satu dari sejumlah file yang telah ditentukan.
  • 🔍 Pengambilan sampel dan penggabungan: Tabel berbasis bucket mendukung pembacaan TABLESAMPLE yang efisien dan penggabungan bucket di sisi peta yang tidak dapat dilakukan oleh tabel biasa.
  • 📐 Pilih berdasarkan kardinalitas: Lakukan partisi berdasarkan kolom dengan kardinalitas rendah seperti negara bagian atau tanggal, dan kelompokkan kolom dengan kardinalitas tinggi seperti pengidentifikasi pengguna.

Penjelasan tentang partisi dan bucket Hive beserta contoh praktis.

Tabel, Partisi, dan Bucket adalah bagian-bagian dari pemodelan data Hive. Sebuah tabel mendefinisikan skema, sebuah partisi membagi tabel tersebut ke dalam direktori di disk, dan sebuah bucket membagi data di dalam direktori ke dalam sejumlah file tetap.

Apa itu Partisi?

Partisi Hive adalah cara untuk mengatur tabel ke dalam partisi dengan membagi tabel menjadi beberapa bagian berdasarkan kunci partisi. Secara fisik, setiap partisi adalah subdirektori terpisah di bawah folder tabel di HDFS, yang memungkinkan Hive untuk melewati data yang tidak dibutuhkannya.

Partisi berguna ketika tabel memiliki satu atau lebih kunci partisi. Kunci partisi adalah elemen dasar untuk menentukan bagaimana data disimpan dalam tabel. Kunci partisi tidak disimpan di dalam file data itu sendiri – nilainya dikodekan dalam nama direktori, sehingga kueri yang memfilter berdasarkan kunci tersebut dapat membuang seluruh direktori sebelum baris apa pun dibaca. Ini disebut pemangkasan partisi.

Misalnya: -

“Klien memiliki beberapa data e-commerce yang berkaitan dengan operasional di India, di mana operasional setiap negara bagian (38 negara bagian) disebutkan secara keseluruhan. Jika kita menggunakan kolom negara bagian sebagai kunci partisi dan melakukan partisi pada data India secara keseluruhan, kita dapat memperoleh sejumlah partisi (38 partisi) yang sama dengan jumlah negara bagian (38) yang ada di India. Sehingga data setiap negara bagian dapat dilihat secara terpisah dalam tabel partisi.”

Pengiriman Code Cuplikan kode untuk partisi

Enam pernyataan di bawah ini dijalankan secara berurutan di shell Hive. Masing-masing merupakan langkah terpisah, dan tangkapan layar berikut menunjukkan urutan yang sama dieksekusi pada klaster yang sedang berjalan.

  1. Pembuatan tabel allstates
    create table allstates(state string, District string,Enrolments string)
    
    row format delimited
    
    fields terminated by ',';
    
  2. Memuat data ke dalam tabel allstates yang telah dibuat.
    Load data local inpath '/home/hduser/Desktop/AllStates.csv' into table allstates;
  3. Pembuatan tabel partisi
    create table state_part(District string,Enrolments string) PARTITIONED BY(state string);
  4. Untuk partisi kita harus mengatur properti ini
    set hive.exec.dynamic.partition.mode=nonstrict
  5. Memuat data ke dalam tabel partisi
    INSERT OVERWRITE TABLE state_part PARTITION(state)
    SELECT district,enrolments,state from  allstates;
  6. Pemrosesan aktual dan pembentukan tabel partisi berdasarkan status sebagai kunci partisi

Akan ada 38 output partisi di penyimpanan HDFS dengan nama file sebagai nama status. Kita akan memeriksanya pada langkah ini.

Berikut ini adalah tangkapan layar yang menunjukkan eksekusi kode yang disebutkan di atas.

Pada layar pertama, langkah 1 berjalan pada sarang lebah> perintah dan menciptakan semua negara bagian tabel dengan tiga kolom dan koma sebagai pemisah kolom.

Shell Hive membuat tabel allstates dengan tiga kolom yang dipisahkan oleh pembatas.

Layar berikutnya mencakup langkah 2 dan 3: file AllStates.csv dimuat ke dalam semua negara bagian, dan tabel yang dipartisi bagian negara dibuat dengan status yang dideklarasikan sebagai kunci partisi.

Memuat file AllStates.csv ke dalam tabel allstates dan membuat tabel partisi state_part.

Langkah 4 dan 5 muncul selanjutnya. Mode partisi dinamis diatur ke nonstrict, dan pernyataan INSERT OVERWRITE meluncurkan pekerjaan MapReduce yang baris log-nya menunjukkan satu partisi dimuat untuk setiap nilai status.

Output pekerjaan MapReduce memuat satu partisi Hive per nilai status.

Mencantumkan direktori gudang di HDFS mengkonfirmasi hasil langkah 6 – shell melaporkan 38 item, satu bagian_negara bagian/negara bagian= direktori per negara bagian.

Daftar HDFS yang menunjukkan 38 direktori partisi state_part di gudang Hive.

Dari kode di atas, kita melakukan hal-hal berikut

  1. Pembuatan tabel allstates dengan 3 nama kolom seperti state, district, dan enrolments.
  2. Memuat data ke dalam tabel allstates
  3. Pembuatan tabel partisi dengan status sebagai kunci partisi
  4. Pada langkah ini, atur mode partisi sebagai non-ketat (mode ini akan mengaktifkan mode partisi dinamis).
  5. Memuat data ke dalam tabel partisi state_part
  6. Pemrosesan aktual dan pembentukan tabel partisi berdasarkan status sebagai kunci partisi
  7. Akan ada 38 output partisi di penyimpanan HDFS dengan nama file sebagai nama status. Pada langkah ini, kita melihat 38 output partisi di HDFS.

Partisi Statis vs Dinamis di Hive

Contoh yang diberikan di atas menggunakan partisi dinamis, tetapi Hive mendukung dua gaya pemuatan dan perbedaannya menentukan seberapa banyak tipe data yang dibutuhkan.ping – dan seberapa besar risiko yang ditimbulkan oleh setiap muatan.

Partisi statis Pernyataan tersebut menyebutkan nilai partisi dalam pernyataan itu sendiri, sehingga nilainya harus diketahui sebelum proses pemuatan dijalankan dan satu pernyataan hanya mengisi tepat satu partisi. Partisi dinamis Ini memungkinkan Hive membaca nilai partisi dari kolom terakhir daftar SELECT dan membuat direktori saat runtime, itulah sebabnya contoh ini hanya membutuhkan satu perintah INSERT untuk menghasilkan 38 direktori.

Aspek Partisi statis Partisi dinamis
Nilai partisi Disediakan secara langsung dalam klausul PEMBAGIAN Dibaca saat runtime dari kolom SELECT
Partisi per pernyataan Satu Banyak
konfigurasi Berfungsi dalam mode ketat default. Membutuhkan hive.exec.dynamic.partition.mode yang diatur ke nonstrict.
Kecepatan muat Lebih cepat, karena tidak memerlukan pemindaian nilai. Lebih lambat, karena pekerjaan tersebut mengelompokkan baris berdasarkan kunci.
Paling cocok untuk Kumpulan data kecil dan sudah diketahui, seperti beban harian. Kumpulan kunci yang besar atau tidak dikenal, seperti 38 negara bagian.

Beban dinamis juga dibatasi. Hive membatasi jumlah partisi yang dapat dibuat oleh satu pekerjaan – secara default 100 per mapper atau reducer dan 1000 untuk keseluruhan pernyataan – dan pekerjaan akan gagal setelah salah satu batas tersebut terlampaui, sehingga kunci dengan kardinalitas sangat tinggi memerlukan peningkatan batasan tersebut atau desain yang berbeda.

Apa itu Bucket?

Bucket di Hive digunakan untuk memisahkan data tabel Hive ke dalam beberapa file atau direktori. Bucket digunakan untuk kueri yang efisien, dan tidak seperti partisi, jumlah bucket tetap saat tabel dibuat, sehingga tidak pernah bertambah seiring dengan data.

  • Data yang terdapat dalam partisi tersebut dapat dibagi lagi menjadi beberapa bucket.
  • Pembagian dilakukan berdasarkan hash dari kolom-kolom tertentu yang telah kita pilih dalam tabel.
  • Bucket menggunakan semacam algoritma hashing di bagian belakang untuk membaca setiap catatan dan menempatkannya ke dalam bucket.
  • Kategori tempat suatu baris berada ditentukan oleh hash_function(bucketing_column) mod num_buckets, sehingga nilai yang sama selalu masuk ke dalam file yang sama.
  • Pada Hive 0.x dan 1.x, pengelompokan (bucketing) harus diaktifkan dengan set hive.enforce.bucketing=true; sebelum sisipan

Pengaturan terakhir itu sudah menjadi sejarah pada klaster saat ini: manual Apache Hive Catatan ini tidak diperlukan lagi mulai dari Hive 2.x ke atas, karena mesin sekarang secara otomatis mengambil jumlah reducer dan kolom cluster-by dari definisi tabel.

Langkah 1) Membuat Bucket seperti gambar di bawah ini.

Layar di bawah ini menunjukkan pernyataan CREATE TABLE untuk ember sampel, dengan klausa CLUSTERED BY di bagian bawah yang menetapkan jumlah bucket.

Pernyataan Hive CREATE TABLE mengelompokkan samplebucket menjadi empat bucket

Dari tangkapan layar di atas

  • Kami membuat samplebucket dengan nama kolom seperti first_name, job_id, department, salary, dan country.
  • Kami sedang membuat 4 ember di sini.
  • Setelah data dimuat, data tersebut secara otomatis ditempatkan ke dalam 4 bucket.
  • Kolom negara adalah kolom pengelompokan, sehingga setiap baris untuk satu negara ditulis ke dalam file bucket yang sama.

Langkah 2) Memuat data ke dalam tabel samplebucket

Dengan asumsi bahwa tabel "employees" sudah dibuat di sistem Hive, pada langkah ini kita akan melihat proses pemuatan data dari tabel employees ke dalam tabel samplebucket.

Sebelum kita mulai memindahkan data karyawan ke dalam bucket, pastikan data tersebut terdiri dari nama kolom seperti first_name, job_id, department, salary, dan country.

Di sini kita memuat data ke dalam samplebucket dari tabel employees – tangkapan layar di bawah menunjukkan pernyataan INSERT OVERWRITE yang melakukan penyalinan.

Pernyataan INSERT OVERWRITE menyalin baris karyawan ke dalam tabel samplebucket.

Langkah 3) Menampilkan 4 bucket yang dibuat pada Langkah 1

Mencantumkan direktori tabel di HDFS menunjukkan hasil fisiknya: empat file data bernomor, bukan satu.

Daftar HDFS dari empat file bucket yang dibuat di bawah direktori samplebucket

Dari tangkapan layar di atas, kita dapat melihat bahwa data dari tabel karyawan ditransfer ke dalam 4 bucket yang dibuat pada langkah 1.

Pemartisian Hive vs Pengelompokan (Bucketing): Perbedaan Utama

Kedua fitur tersebut membagi tabel menjadi bagian-bagian yang lebih kecil, tetapi mereka melakukannya pada tingkat sistem file yang berbeda dan mereka menjawab masalah yang berbeda. Tabel di bawah ini menyajikan keduanya secara berdampingan.

Titik perbandingan Partisi Ember
Unit dibuat Direktori per nilai kunci Satu file per bucket hash.
Dinyatakan dengan DIPISAHKAN OLEH DIKUMPULKAN OLEH … KE DALAM n EMBER
Jumlah potongan Bertambah seiring dengan jumlah nilai yang berbeda. Diperbaiki saat pembuatan tabel
Kolom tersimpan dalam file data Tidak – nilainya terdapat dalam nama direktori. Ya – kolom tersebut tetap menjadi kolom biasa.
Jenis kolom terbaik Kardinalitas rendah, seperti negara bagian, tahun, atau negara. Kardinalitas tinggi, seperti user_id atau transaction_id
Manfaat utama Pemangkasan partisi melewati direktori yang tidak dibutuhkan Ukuran file yang seragam, pengambilan sampel yang murah, dan penggabungan di sisi peta.

Keduanya bukanlah saingan. Tata letak produksi umum mempartisi tabel fakta berdasarkan tanggal dan kemudian mengelompokkan setiap hari berdasarkan kunci gabungan, sehingga kueri memangkas ke satu direktori dan kemudian menggabungkan antar-kelompok di dalamnya.

Kapan Menggunakan Partisi, Pengelompokan, atau Keduanya?

Memilih di antara keduanya dimulai dengan kardinalitas kolom dan bentuk kueri yang akan membaca tabel tersebut.

  • sekat ketika kueri hampir selalu memfilter berdasarkan kolom dengan kardinalitas rendah yang sama, dan ketika jumlah nilai unik tetap berada di angka ratusan dan bukan jutaan.
  • Ember ketika kolom yang berguna memiliki terlalu banyak nilai berbeda untuk menjadi direktori, atau ketika tabel digabungkan atau diambil sampelnya berulang kali pada kolom tersebut.
  • Gunakan keduanya Untuk tabel fakta yang besar: partisi berdasarkan tanggal, lalu buat bucket di dalam setiap partisi berdasarkan kunci gabungan.

Mode kegagalan yang perlu diwaspadai adalah masalah file kecil. Pemartisian pada kolom dengan kardinalitas sangat tinggi – stempel waktu atau pengidentifikasi pelanggan – menghasilkan ribuan direktori kecil, masing-masing berisi file yang jauh di bawah ukuran blok HDFS. Hal itu meningkatkan penggunaan memori NameNode dan memperlambat setiap pemindaian, yang justru merupakan hasil yang ingin dicegah oleh pemartisian. Penggunaan bucket menghindari hal ini karena jumlah file dibatasi oleh definisi tabel.

Penggunaan bucket memiliki kelemahan tersendiri: tata letak hanya benar jika setiap penulis mematuhinya. Jumlah bucket yang dideklarasikan saat pembuatan adalah metadata, jadi pekerjaan yang menulis ke tabel tanpa pengelompokan yang benar dapat meninggalkan file yang tidak sesuai dengan tata letak yang dideklarasikan, dan pengambilan sampel atau penggabungan bucket selanjutnya akan membaca baris yang salah.

Pertanyaan Umum Demo Slot

Jalankan perintah SHOW PARTITIONS table_name di shell Hive. Perintah ini membaca metastore dan mencetak satu baris per direktori partisi, yang lebih cepat daripada mencantumkan jalur gudang data di HDFS dan juga memastikan metastore sinkron.

Perintah `ALTER TABLE table_name ADD PARTITION (state='Goa')` mendaftarkan direktori baru, dan `ALTER TABLE table_name DROP PARTITION (state='Goa')` menghapusnya. Perintah `Drop`ping Partisi terkelola menghapus datanya, sedangkan penghapusan (drop)ping Yang eksternal hanya menghapus entri metastore.

Secara default, Hive membatasi partisi dinamis hingga 100 per node dan 1000 per pernyataan. Kunci dengan nilai yang lebih banyak akan melampaui batas dan menghentikan proses. Tingkatkan hive.exec.max.dynamic.partitions.pernode dan hive.exec.max.dynamic.partitions, atau pilih kunci yang lebih longgar.

Tidak. Itu diperlukan pada Hive 0.x dan 1.x untuk memaksa jumlah reducer agar sesuai dengan jumlah bucket. HIVE-12331 menghapusnya di Hive 2.0, dan mesin sekarang mendapatkan jumlah reducer dan kolom cluster-by dari tabel.

TABLESAMPLE(BUCKET x OUT OF y ON column) hanya membaca file bucket yang cocok, bukan memindai semuanya. Karena baris di-hash pada kolom yang sama saat penulisan, sampelnya dapat diulang dan jauh lebih murah daripada filter baris acak.

Memecah tabel menjadi ribuan file kecil akan memboroskan memori NameNode dan memulai satu tugas per file, sehingga pemindaian menjadi lambat. Biasanya hal ini terjadi setelah kunci partisi dengan kardinalitas yang sangat tinggi. Kunci yang lebih kasar, pengelompokan (bucketing), atau pemadatan file dapat memperbaikinya.

Ya. Analisis log kueri dan model pembelajaran mesin dalam alat seperti Cloudera Workload XM memberi peringkat kolom berdasarkan frekuensi filter, kemiringan, dan kardinalitas, lalu menyarankan tata letak. Saran tersebut masih perlu ditinjau, karena tidak dapat melihat beban kerja yang direncanakan.

Copilot membuat draf pernyataan PARTITIONED BY dan CLUSTERED BY dengan cepat dari sebuah komentar, dan asisten agen dapat menghasilkan seluruh skrip pemuatan. Selalu periksa jumlah bucket dan kunci yang dihasilkan terhadap kardinalitas sebenarnya, karena model hanya menebak dari nama saja.

Ringkaslah postingan ini dengan: