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.
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.
- Pembuatan tabel allstates
create table allstates(state string, District string,Enrolments string) row format delimited fields terminated by ',';
- Memuat data ke dalam tabel allstates yang telah dibuat.
Load data local inpath '/home/hduser/Desktop/AllStates.csv' into table allstates;
- Pembuatan tabel partisi
create table state_part(District string,Enrolments string) PARTITIONED BY(state string);
- Untuk partisi kita harus mengatur properti ini
set hive.exec.dynamic.partition.mode=nonstrict - Memuat data ke dalam tabel partisi
INSERT OVERWRITE TABLE state_part PARTITION(state) SELECT district,enrolments,state from allstates;
- 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.
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.
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.
Mencantumkan direktori gudang di HDFS mengkonfirmasi hasil langkah 6 – shell melaporkan 38 item, satu bagian_negara bagian/negara bagian= direktori per negara bagian.
Dari kode di atas, kita melakukan hal-hal berikut
- Pembuatan tabel allstates dengan 3 nama kolom seperti state, district, dan enrolments.
- Memuat data ke dalam tabel allstates
- Pembuatan tabel partisi dengan status sebagai kunci partisi
- Pada langkah ini, atur mode partisi sebagai non-ketat (mode ini akan mengaktifkan mode partisi dinamis).
- Memuat data ke dalam tabel partisi state_part
- 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. 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.
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.
Langkah 3) Menampilkan 4 bucket yang dibuat pada Langkah 1
Mencantumkan direktori tabel di HDFS menunjukkan hasil fisiknya: empat file data bernomor, bukan satu.
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.








