Pos blog ini dipublikasikan di Hortonworks.com sebelum merger dengan Cloudera. Beberapa tautan, sumber daya, atau referensi mungkin tidak lagi akurat.
Ini adalah yang pertama dari dua posting yang memeriksa penggunaan Hive untuk interaksi dengan tabel HBase. Postingan kedua ada di sini.
Salah satu hal yang sering saya tanyakan adalah cara menggunakan HBase dari Apache Hive. Bukan hanya bagaimana melakukannya, tetapi apa yang berhasil, seberapa baik kerjanya, dan bagaimana memanfaatkannya dengan baik. Saya telah melakukan sedikit riset di bidang ini, jadi semoga ini bermanfaat bagi orang lain selain saya. Ini adalah topik yang tidak kami bahas di HBase in Action, mungkin catatan ini akan menjadi dasar untuk edisi ke-2 Catatan ini berlaku untuk Hive 0.11.x yang digunakan bersama dengan HBase 0.94.x. Sebagian besar harus dapat diterapkan untuk 0.12.x + 0.96.x, meskipun saya belum menguji semuanya.
Hive project menyertakan library opsional untuk berinteraksi dengan HBase. Di sinilah lapisan jembatan antara kedua sistem diimplementasikan. Antarmuka utama yang Anda gunakan saat mengakses HBase dari kueri Hive disebut BaseStorageHandler
. Anda juga dapat berinteraksi dengan tabel HBase secara langsung melalui format Input dan Output, tetapi penangannya lebih sederhana dan berfungsi untuk sebagian besar penggunaan.
Tabel HBase dari Hive
Gunakan HBaseStorageHandler
untuk mendaftarkan tabel HBase dengan metastore Hive. Anda dapat secara opsional menentukan tabel HBase sebagai EXTERNAL
, dalam hal ini Hive tidak akan membuat untuk menjatuhkan tabel tersebut secara langsung – Anda harus menggunakan shell HBase untuk melakukannya.
[sql]
BUAT TABEL [EKSTERNAL] foo(…)
DISIMPAN OLEH 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
TBLPROPERTIES ('hbase.table.name' =' bar');
[/sql]
Pernyataan di atas mendaftarkan tabel HBase bernama bar
di metastore Hive, dapat diakses dari Hive dengan nama foo
.
Di bawah tenda, HBaseStorageHandler
mendelegasikan interaksi dengan tabel HBase keHiveHBaseTableInputFormat
dan HiveHBaseTableOutputFormat
. Anda dapat mendaftarkan tabel HBase di Hive menggunakan kelas tersebut secara langsung jika diinginkan. Pernyataan di atas kira-kira setara dengan:
[sql]
BUAT TABEL foo(…)
DISIMPAN SEBAGAI
INPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive .hbase.HiveHBaseTableOutputFormat'
TBLPROPERTIES ('hbase.table.name' ='bar');
[/sql]
Juga disediakan HiveHFileOutputFormat
yang berarti memungkinkan untuk menghasilkan HFile untuk pemuatan massal dari Hive juga. Dalam praktiknya, saya belum melakukannya secara menyeluruh (lihat HIVE-4627).
Pemetaan skema
Mendaftarkan tabel hanyalah langkah pertama. Sebagai bagian dari pendaftaran tersebut, Anda juga perlu menentukan pemetaan kolom. Ini adalah cara Anda menautkan nama kolom Hive ke baris dan kolom tabel HBase. Lakukan menggunakan hbase.columns.mapping
Properti SerDe.
[sql]
BUAT TABEL foo(rowkey STRING, a STRING, b STRING)
DISIMPAN OLEH 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
DENGAN SERDEPROPERTIES ('hbase.columns .mapping' =':key,f:c1,f:c2')
TBLPROPERTIES ('hbase.table.name' ='bar');
…
[/sql]
Nilai yang diberikan di properti pemetaan sesuai satu-untuk-satu dengan nama kolom dari tabel sarang. Nama kolom HBase sepenuhnya memenuhi syarat menurut kelompok kolom, dan Anda menggunakan token khusus :key
untuk mewakili kunci baris. Di atas
contoh membuat baris dari tabel HBase bar
tersedia melalui tabel Hive foo
. foo
kolom rowkey
memetakan ke rowkey tabel HBase, a
ke c1
di f
keluarga kolom, dan b
ke c2
, juga di f
keluarga.
Anda juga dapat mengaitkan MAP
Hi Hive struktur data untuk keluarga kolom HBase. Dalam hal ini, hanya STRING
Jenis sarang digunakan. Jenis Hive lainnya yang saat ini didukung adalah BINARY
. Lihat halaman wiki untuk lebih banyak contoh.
Berinteraksi dengan data
Dengan pemetaan kolom yang ditentukan, kini Anda dapat mengakses data HBase seperti halnya data Hive lainnya. Hanya predikat kueri sederhana yang saat ini didukung.
[sql]
PILIH * FROM foo WHERE …;
[/sql]
Anda juga dapat mengisi dan tabel HBase menggunakan Hive. Ini berfungsi dengan INTO
dan OVERWRITE
klausa.
[sql]
DARI source_hive_table INSERT INTO TABLE my_hbase_table
PILIH source_hive_table.* WHERE …;
[/sql]
Perlu diketahui bahwa ada regresi di Hive 0.12.0 yang merusak fitur ini, lihat HIVE-5515.
Dalam praktik
Masih ada sedikit kemahiran yang diperlukan untuk menyiapkan semuanya dengan benar saat runtime. Modul interaksi HBase sepenuhnya opsional, jadi Anda harus memastikannya dan dependensi HBasenya tersedia di classpath Hive.
[bash]
$ export HADOOP_CLASSPATH=…
$ hive -e “BUAT TABEL … DISIMPAN OLEH ‘org.apache…HBaseStorageHandler'”
[/bash]
Lingkungan penginstalan dapat melakukan pekerjaan yang lebih baik dalam menangani hal ini bagi pengguna, tetapi untuk saat ini Anda harus mengelolanya sendiri. Idealnya hive
bin script dapat mendeteksi keberadaan HBase dan secara otomatis membuat CLASSPATH
yang diperlukan penyesuaian. Penyempurnaan ini tampaknya dilacak di HIVE-2055. Mil terakhir disediakan oleh distribusi itu sendiri, memastikan variabel lingkungan disetel untuk hive
. Fungsi ini disediakan oleh BIGTOP-955.
Anda juga perlu memastikan stoples yang diperlukan dikirim ke tugas MapReduce saat Anda menjalankan pernyataan Hive. Hive menyediakan mekanisme untuk mengirimkan dependensi pekerjaan tambahan melalui fitur auxjars.
[bash]
$ export HIVE_AUX_JARS_PATH=…
$ hive -e “SELECT * FROM …”
[/bash]
Saya memang menemukan bug kecil di build HDP-1.3 yang menutupi nilai yang ditentukan pengguna dari HIVE_AUX_JARS_PATH
. Dengan hak administratif, ini mudah diperbaiki dengan memperbaiki baris di hive-env.sh
untuk menghormati nilai yang ada. Solusi
dalam skrip pengguna adalah dengan menggunakan SET
untuk memberikan nilai setelah Anda meluncurkan Hive CLI.
[bash]
SET hive.aux.jars.path =…
[/bash]
Hive harus dapat mendeteksi stoples mana yang diperlukan dan menambahkannya sendiri. HBase menyediakan TableMapReduceUtils#addDependencyJars
metode untuk tujuan ini. Tampaknya ini dilakukan di hive-0.12.0, setidaknya menurut HIVE-2379.
Pekerjaan di masa depan
Banyak yang telah dikatakan tentang dukungan yang tepat untuk penurunan predikat (HIVE-1643, HIVE-2854, HIVE-3617,
HIVE-3684) dan kesadaran tipe data (HIVE-1245, HIVE-2599). Ini berjalan seiring karena semantik predikat didefinisikan dalam hal jenis tempat mereka beroperasi. Lebih banyak yang dapat dilakukan untuk memetakan tipe data kompleks Hive seperti Maps dan Structs ke keluarga kolom HBase juga (HIVE-3211). Dukungan untuk stempel waktu HBase agak berantakan; mereka tidak tersedia untuk aplikasi Hive dengan tingkat perincian apa pun (HIVE-2828, HIVE-2306). Satu-satunya interaksi yang dimiliki pengguna adalah melalui setelan pengendali penyimpanan untuk menulis stempel waktu kustom dengan semua operasi.
Dari perspektif kinerja, ada beberapa hal yang dapat dilakukan Hive saat ini (yaitu, tidak bergantung pada tipe data) untuk memanfaatkan HBase. Ada juga kemungkinan HBase-aware Hive untuk menggunakan tabel HBase sebagai lokasi penyimpanan perantara (HIVE-3565), memfasilitasi penggabungan sisi peta terhadap tabel dimensi yang dimuat ke HBase. Hive dapat menggunakan struktur terindeks alami HBase (HIVE-3634, HIVE-3727), berpotensi menghemat pemindaian besar. Saat ini, pengguna tidak memiliki (ada?) kontrol atas pemindaian yang dijalankan. Konfigurasi per pekerjaan, atau setidaknya per tabel harus diaktifkan (HIVE-1233). Itu akan memungkinkan pengguna yang paham HBase untuk memberi Hive petunjuk tentang bagaimana seharusnya berinteraksi dengan HBase. Dukungan untuk pengambilan sampel terpisah tabel HBase (HIVE-3399) juga dapat dilakukan dengan mudah karena HBase sudah mengelola partisi tabel.
Saluran akses lainnya
Semua yang dibahas sejauh ini mengharuskan Hive untuk berinteraksi dengan HBase RegionServers online. Aplikasi dapat memperoleh throughput yang signifikan dan menikmati fleksibilitas yang lebih besar dengan berinteraksi langsung dengan data HBase yang disimpan ke HDFS. Hal ini juga bermanfaat untuk mencegah beban kerja Hive mengganggu aplikasi HBase terikat SLA online (setidaknya, hingga kami melihat peningkatan HBase dalam isolasi QOS antar tugas, HBASE-4441).
Seperti yang disebutkan sebelumnya, ada HiveHFileOutputFormat
. Menyelesaikan HIVE-4627 akan menjadikan Hive cara yang mudah untuk menghasilkan HFiles untuk pemuatan massal. Setelah Anda membuat HFiles menggunakan Hive, masih ada langkah terakhir untuk menjalankanLoadIncrementalHFiles
utilitas untuk menyalin dan mendaftarkannya di wilayah. Untuk ini, HiveStorageHandler
antarmuka akan memerlukan semacam pengait untuk memengaruhi rencana kueri saat dibuat, memungkinkannya untuk menambahkan langkah-langkah. Setelah terpasang, seharusnya SET
tanda waktu proses, mengganti INSERT
operasi untuk menggunakan muatan massal.
HBase baru-baru ini memperkenalkan fitur snapshot tabel. Hal ini memungkinkan pengguna untuk membuat tampilan titik-dalam-waktu yang bertahan dari tabel, yang dipertahankan ke HDFS. HBase dapat memulihkan tabel dari snapshot ke status sebelumnya, dan membuat tabel yang sama sekali baru dari snapshot yang ada. Hive saat ini tidak mendukung pembacaan dari snapshot HBase. Dalam hal ini, HBase belum mendukung tugas MapReduce melalui snapshot, meskipun fitur tersebut masih dalam proses (HBASE-8369).
Kesimpulan
Antarmuka antara HBase dan Hive masih muda, tetapi memiliki potensi yang bagus. Ada banyak buah gantung rendah yang bisa dipetik untuk mempermudah dan mempercepat. Masalah paling mencolok yang menghalangi pengembangan aplikasi nyata adalah ketidakcocokan impedansi antara skema padat yang diketik Hive dan skema jarang diketik dari HBase. Ini adalah masalah kognitif dan juga masalah teknis. Solusi di sini akan memungkinkan sejumlah peningkatan gagal, termasuk banyak cara peningkatan kinerja. Saya berharap terus berupaya untuk menambahkan jenis data ke HBase (HBASE-8089) dapat membantu menjembatani kesenjangan ini.
Operasi dasar sebagian besar berfungsi, setidaknya dengan cara yang belum sempurna. Anda dapat membaca data dari dan menulis data kembali ke HBase menggunakan Hive. Mengonfigurasi lingkungan merupakan proses yang tidak jelas dan manual, yang kemungkinan akan menghalangi pemula untuk mengadopsi alat tersebut. Ada juga pertanyaan tentang operasi massal – dukungan untuk menulis HFiles dan membaca snapshot HBase menggunakan Hive sama sekali tidak ada pada saat ini. Dan tentu saja, ada bug yang tersebar di seluruh. Peningkatan terbaru terbesar adalah penghentian antarmuka HCatalog, menghapus keputusan awal yang diperlukan terkait antarmuka mana yang akan digunakan.
Hive menyediakan antarmuka SQL yang sangat berguna selain HBase, yang terintegrasi dengan mudah ke banyak alur kerja ETL yang ada. Antarmuka tersebut memerlukan penyederhanaan beberapa semantik BigTable yang disediakan HBase, tetapi hasilnya adalah membuka HBase ke audiens pengguna yang jauh lebih luas. Interop Hive memuji pengalaman yang diberikan oleh Phoenix dengan sangat baik. Hive memiliki manfaat karena tidak memerlukan kerumitan penerapan yang saat ini diperlukan oleh sistem tersebut. Semoga definisi umum tentang tipe akan memungkinkan masa depan yang gratis.