HBase
 sql >> Teknologi Basis Data >  >> NoSQL >> HBase

Menggunakan Hive untuk berinteraksi dengan HBase, Bagian 1

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 ke
HiveHBaseTableInputFormat 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 menjalankan
LoadIncrementalHFiles 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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. jadi HBase Anda rusak

  2. Menggunakan COD dan CML untuk membangun aplikasi yang memprediksi data stok

  3. How-to:Gunakan Antarmuka Apache HBase REST, Bagian 3

  4. Hadoop – Tutorial Apache Hadoop untuk Pemula

  5. Membangun Proses yang Dapat Diskalakan Menggunakan NiFi, Kafka, dan HBase di CDP