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

How-to:Gunakan Antarmuka Hemat HBase, Bagian 1

Ada berbagai cara untuk mengakses dan berinteraksi dengan Apache HBase. Terutama, Java API menyediakan fungsionalitas paling banyak. Tetapi beberapa orang ingin menggunakan HBase tanpa Java.

Orang-orang tersebut memiliki dua opsi utama:Salah satunya adalah antarmuka Hemat (lebih ringan dan karenanya lebih cepat dari dua opsi), dan yang lainnya adalah antarmuka REST (alias Stargate). Antarmuka REST menggunakan kata kerja HTTP untuk melakukan suatu tindakan. Dengan menggunakan HTTP, antarmuka REST menawarkan susunan bahasa dan program yang jauh lebih luas yang dapat mengakses antarmuka. (Jika Anda menginginkan informasi lebih lanjut tentang antarmuka REST, Anda dapat mengunjungi rangkaian panduan saya tentangnya.)

Dalam rangkaian panduan ini, Anda akan mempelajari cara menggunakan antarmuka Thrift dan menjelajahi contoh kode Python untuk melakukannya. Posting pertama ini akan membahas HBase Thrift, bekerja dengan Thrift, dan beberapa kode boilerplate untuk menghubungkan ke Thrift. Posting kedua akan menunjukkan cara menyisipkan dan mendapatkan beberapa baris sekaligus. Postingan ketiga akan menjelaskan cara menggunakan scan dan beberapa pertimbangan saat memilih antara REST dan Thrift.

Contoh kode lengkap dapat ditemukan di akun GitHub saya.

Hbase Hemat

Hemat adalah kerangka kerja perangkat lunak yang memungkinkan Anda membuat ikatan lintas bahasa. Dalam konteks HBase, Java adalah satu-satunya warga kelas satu. Namun, antarmuka Thrift HBase memungkinkan bahasa lain untuk mengakses HBase melalui Thrift dengan menghubungkan ke server Thrift yang berinteraksi dengan klien Java.

Agar Thrift dan REST berfungsi, daemon HBase lain perlu dijalankan untuk menangani permintaan ini. Daemon ini dapat diinstal dengan paket hbase-thrift dan hbase-rest. Diagram di bawah ini menunjukkan bagaimana Thrift dan REST ditempatkan di cluster.

Perhatikan bahwa host klien Thrift dan REST biasanya tidak menjalankan layanan lain (seperti DataNodes atau RegionServers) untuk menjaga overhead tetap rendah dan responsivitas tinggi untuk interaksi REST atau Thrift.

Pastikan untuk menginstal dan memulai daemon ini pada node yang memiliki akses ke cluster Hadoop dan aplikasi yang memerlukan akses ke HBase. Antarmuka Hemat tidak memiliki penyeimbangan beban bawaan, jadi semua penyeimbangan beban perlu dilakukan dengan alat eksternal seperti round-robin DNS, alamat IP virtual, atau dalam kode. Cloudera Manager juga membuatnya sangat mudah untuk menginstal dan mengelola layanan HBase REST dan Thrift. Anda dapat mengunduh dan mencobanya secara gratis di Cloudera Standard!

Kelemahan dari Thrift adalah lebih sulit diatur daripada REST. Anda perlu mengkompilasi Thrift dan menghasilkan binding khusus bahasa. Binding ini bagus karena memberi Anda kode untuk bahasa yang Anda gunakan — tidak perlu mengurai XML atau JSON seperti di REST; alih-alih, antarmuka Hemat memberi Anda akses langsung ke data baris. Fitur bagus lainnya adalah protokol Thrift memiliki transport biner asli; Anda tidak perlu menyandikan dan mendekode data base64.

Untuk mulai menggunakan antarmuka Thrift, Anda perlu mencari tahu port mana yang digunakannya. Port default untuk CDH adalah port 9090.  Untuk postingan ini, Anda akan melihat variabel host dan port yang digunakan, berikut adalah nilai yang akan kami gunakan:

host ="localhost"port ="9090"

Anda dapat menyiapkan antarmuka Thrift untuk menggunakan kredensial Kerberos demi keamanan yang lebih baik.

Untuk kode Anda, Anda harus menggunakan alamat IP atau nama domain yang sepenuhnya memenuhi syarat dari node dan port yang menjalankan daemon Thrift. Saya sangat menyarankan untuk menjadikan URL ini sebagai variabel karena dapat berubah dengan perubahan jaringan.

Pengikatan Bahasa

Sebelum Anda dapat membuat binding Thrift, Anda harus mengunduh dan mengkompilasi Thrift. Tidak ada paket biner untuk Thrift yang dapat saya temukan, kecuali di Windows. Anda harus mengikuti petunjuk Thrift untuk penginstalan pada platform pilihan Anda.

Setelah Thrift diinstal, Anda perlu menemukan file Hbase.thrift. Untuk menentukan layanan dan tipe data di Thrift, Anda harus membuat file IDL. Untungnya, para pengembang HBase telah membuatkannya untuk kami. Sayangnya, file tersebut tidak didistribusikan sebagai bagian dari paket biner CDH. (Kami akan memperbaikinya dalam rilis CDH mendatang.) Anda perlu mengunduh paket sumber dari versi HBase yang Anda gunakan. Pastikan untuk menggunakan versi HBase yang benar karena IDL ini dapat berubah. Dalam file terkompresi, jalur ke IDL adalah hbase-VERSION/src/main/resources/org/Apache/hadoop/hbase/thrift/Hbase.thrift.

Hemat mendukung menghasilkan binding bahasa untuk lebih dari 14 bahasa termasuk Java, C++, Python, PHP, Ruby, dan C#. Untuk menghasilkan binding untuk Python, Anda akan menggunakan perintah berikut:

thrift -gen py /path/to/hbase/source/hbase-VERSION/src/main/resources/org/Apache/hadoop/hbase/thrift/Hbase.thrift

Selanjutnya, Anda perlu mendapatkan kode Hemat untuk bahasa Anda yang berisi semua kelas untuk koneksi ke Hemat dan protokolnya. Kode ini dapat ditemukan di /path/to/thrift/thrift-0.9.0/lib/py/src/.

Berikut adalah perintah yang saya jalankan untuk membuat proyek Python menggunakan HBase Thrift:

$ mkdir HBaseThrift$ cd HBaseThrift/$ thrift -gen py ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/Apache/hadoop/hbase/thrift/Hbase.thrift$ mv gen-py/* . $ rm -rf gen-py/$ mkdir thrift$ cp -rp ~/Downloads/thrift-0.9.0/lib/py/src/* ./thrift/

Saya suka menyimpan salinan file Hbase.thrift dalam proyek untuk dirujuk kembali. Ini memiliki banyak "Javadoc" pada berbagai panggilan, objek data, dan objek kembali.

$ cp ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/Apache/hadoop/hbase/thrift/Hbase.thrift

Kode Boilerplate

Anda akan menemukan bahwa semua skrip Python Thrift Anda akan terlihat sangat mirip. Mari kita bahas setiap bagiannya.

dari thrift.transport import TSocketfrom thrift.protocol import TBinaryProtocolfrom thrift.transport import TTransportfrom hbase import Hbase

Ini akan mengimpor modul Thrift dan HBase yang Anda butuhkan.

# Hubungkan ke HBase Thrift servertransport =TTransport.TBufferedTransport(TSocket.TSocket(host, port))protocol =TBinaryProtocol.TBinaryProtocolAccelerated(transport)

Ini menciptakan transport soket dan protokol jalur dan memungkinkan klien Thrift untuk terhubung dan berbicara dengan server Thrift.

# Membuat dan membuka koneksi klienclient =Hbase.Client(protocol)transport.open()

Baris-baris ini membuat objek Klien yang akan Anda gunakan untuk berinteraksi dengan HBase. Dari objek klien ini, Anda akan mengeluarkan semua Gets dan Puts Anda. Selanjutnya, buka soket ke server Thrift.

# Lakukan Sesuatu

Selanjutnya Anda akan benar-benar bekerja dengan klien HBase. Semuanya dibangun, diinisialisasi, dan terhubung. Pertama, mulai gunakan klien.

transport.close()

Terakhir, tutup transportasi. Ini menutup soket dan membebaskan sumber daya di server Thrift. Berikut kode lengkapnya agar mudah disalin dan ditempel:

dari thrift.transport import TSocketfrom thrift.protocol import TBinaryProtocolfrom thrift.transport import TTransportfrom hbase import Hbase# Hubungkan ke HBase Thrift servertransport =TTransport.TBufferedTransport(TSocket.TSocket(host, port))protocol =TBinaryProtocol # Buat dan buka koneksi klienclient =Hbase.Client(protocol)transport.open()# Lakukan Sesuatutransport.close()

Dalam implementasi Python HBase Thrift, semua nilai dilewatkan sebagai string. Ini termasuk data biner seperti bilangan bulat. Semua nilai kolom disimpan di objek TCell. Berikut adalah definisi dalam file Hbase.thrift:

struct TCell{  1:Nilai byte,  2:i64 timestamp}

Perhatikan perubahan pada string saat kode Python dibuat:

thrift_spec =(    Tidak ada, # 0    (1, TType.STRING, 'value', None, None, ), # 1    (2, TType.I64, 'timestamp', None, None, ), # 2) 

Saya menulis metode pembantu untuk mempermudah menangani bilangan bulat 32-bit. Untuk mengubah bilangan bulat bolak-balik antara string, Anda menggunakan dua metode ini.

# Metode untuk menyandikan int dengan string Thrift encodingdef encode(n):     return struct.pack("i", n)# Metode untuk mendekode int dengan string Thrift's encodingdef decode(s):     return struct.unpack('i' , s)[0]

Ingatlah peringatan ini saat Anda bekerja dengan data biner di Thrift. Anda perlu mengonversi data biner menjadi string dan sebaliknya.

Terjadi Kesalahan

Tidak semudah memahami kesalahan di antarmuka Hemat. Misalnya, inilah kesalahan yang keluar dari Python ketika tabel tidak ditemukan:

Traceback (panggilan terakhir terakhir):  File "./get.py", baris 17, di     rows =client.getRow(tablename, "shakespeare-comedies-000001")  File "/mnt/hgfs/ jesse/repos/DevHivePigHBaseVM/training_materials/hbase/exercises/python_bleets_thrift/hbase/Hbase.py", baris 1038, di getRow    return self.recv_getRow()  File "/mnt/hgfs/jesse/repos/DevHivePigHbases /python_bleets_thrift/hbase/Hbase.py", baris 1062, di recv_getRow    meningkatkan hasil.iohbase.ttypes.IOError:IOError(_message='doesnotexist')

Semua tidak hilang meskipun karena Anda dapat melihat file log HBase Thrift. Pada CDH, file ini terletak di /var/log/hbase/hbase-hbase-thrift-localhost.localdomain.log. Dalam contoh tabel yang hilang, Anda akan melihat kesalahan di log barang bekas yang mengatakan bahwa tabel tidak ada. Ini tidak nyaman, tetapi Anda dapat men-debug dari sana.

Dalam angsuran berikutnya, saya akan membahas penyisipan dan mendapatkan baris.

Jesse Anderson adalah instruktur untuk Universitas Cloudera.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. 20 Perbedaan Penting Antara Hadoop 2.x vs Hadoop 3.x

  2. cepat buat contoh tabel hbase

  3. Mengonversi kebijakan HBase ACL ke Ranger

  4. Apache Phoenix untuk CDH

  5. Bagaimana Penskalaan Benar-Benar Bekerja di Apache HBase