Ada berbagai cara untuk mengakses dan berinteraksi dengan Apache HBase. Java API menyediakan fungsionalitas paling banyak, tetapi banyak orang ingin menggunakan HBase tanpa Java.
Ada dua pendekatan utama untuk melakukannya: Salah satunya adalah antarmuka Hemat, yang lebih cepat dan lebih ringan dari dua opsi. Cara lain untuk mengakses HBase adalah menggunakan antarmuka REST, yang menggunakan kata kerja HTTP untuk melakukan suatu tindakan, memberikan pengembang banyak pilihan bahasa dan program untuk digunakan.
Rangkaian panduan ini akan membahas antarmuka REST dan memberikan contoh kode Python untuk mengaksesnya. Posting pertama akan mencakup HBase REST, beberapa peringatan Python, dan administrasi tabel. Postingan kedua akan menjelaskan cara menyisipkan beberapa baris sekaligus menggunakan XML dan JSON. Posting ketiga akan menunjukkan cara mendapatkan banyak baris menggunakan XML dan JSON. Contoh kode lengkap dapat ditemukan di akun GitHub saya.
Dasar-dasar HBase REST
Agar Thrift dan REST berfungsi, daemon HBase lain perlu dijalankan untuk menangani permintaan ini. Daemon ini dapat diinstal dalam paket hbase-thrift dan hbase-rest. Diagram di bawah ini menggambarkan di mana Thrift dan REST ditempatkan dalam cluster. Perhatikan bahwa klien Thrift dan REST biasanya tidak menjalankan layanan layanan lain seperti DataNode atau RegionServers untuk menjaga beban tetap rendah, dan responsivitas tinggi, untuk interaksi REST.
Pastikan untuk menginstal dan memulai daemon ini pada node yang memiliki akses ke cluster Hadoop dan server aplikasi web. Antarmuka REST tidak memiliki penyeimbangan beban bawaan; yang perlu dilakukan dengan perangkat keras atau dalam kode. Cloudera Manager membuatnya sangat mudah untuk menginstal dan mengelola layanan HBase REST dan Thrift. (Anda dapat mengunduh dan mencobanya secara gratis!) Kelemahan REST adalah bobotnya jauh lebih berat daripada Thrift atau Java.
Antarmuka REST dapat menggunakan berbagai format data:XML, JSON, dan protobuf. Dengan menentukan Accept
dan Content-Type
header, Anda dapat memilih format yang ingin Anda sampaikan atau terima kembali.
Untuk mulai menggunakan antarmuka REST, Anda perlu mencari tahu port mana yang digunakannya. Port default untuk CDH adalah port 8070. Untuk postingan ini, Anda akan melihat baseurl
variabel yang digunakan, dan inilah nilai yang akan saya gunakan::
baseurl = "http://localhost:8070"
Antarmuka REST dapat diatur untuk menggunakan kredensial Kerberos guna meningkatkan keamanan.
Untuk kode Anda, Anda harus menggunakan alamat IP atau DNS nama domain yang sepenuhnya memenuhi syarat dari node yang menjalankan daemon REST. Juga, konfirmasikan bahwa port sudah benar. Saya sangat menyarankan untuk menjadikan URL ini sebagai variabel, karena dapat berubah dengan perubahan jaringan.
Solusi Bug Python dan HBase
Ada dua bug dan solusi yang perlu ditangani. Bug pertama adalah modul Python bawaan tidak mendukung semua kata kerja HTTP. Yang kedua adalah bug HBase REST saat bekerja dengan JSON.
Modul Python bawaan untuk interaksi REST tidak dengan mudah mendukung semua kata kerja HTTP yang diperlukan untuk HBase REST. Anda harus menginstal modul permintaan Python. Modul permintaan juga membersihkan kode dan membuat semua interaksi menjadi lebih mudah.
Antarmuka HBase REST memiliki bug saat menambahkan data melalui JSON:kolom harus mempertahankan urutan yang tepat. dict
Python Python bawaan type tidak mendukung fitur ini, jadi untuk mempertahankan pesanan, kita harus menggunakan OrderedDict
kelas. (Mereka yang menggunakan Python 2.6 dan yang lebih lama perlu menginstal modul orderdict.) Saya juga akan membahas bug dan solusinya nanti di postingan.
Itu juga sulit untuk menggunakan base64 encode dan decode bilangan bulat, jadi saya menulis beberapa kode untuk melakukan itu:
# Method for encoding ints with base64 encoding def encode(n): data = struct.pack("i", n) s = base64.b64encode(data) return s # Method for decoding ints with base64 encoding def decode(s): data = base64.b64decode(s) n = struct.unpack("i", data) return n[0]
Untuk membuat segalanya lebih mudah, saya menulis sebuah metode untuk mengonfirmasi bahwa respons HTTP kembali pada tahun 200-an, yang menunjukkan bahwa operasi itu berhasil. Kode sampel menggunakan metode ini untuk memeriksa keberhasilan panggilan sebelum melanjutkan. Ini caranya:
# Checks the request object to see if the call was successful def issuccessful(request): if 200
Bekerja Dengan Tabel
Menggunakan antarmuka REST, Anda dapat membuat atau menghapus tabel. Mari kita lihat kode untuk membuat tabel.
content = '' content += '' content += ' ' content += '' request = requests.post(baseurl + "/" + tablename + "/schema", data=content, headers={"Content-Type" : "text/xml", "Accept" : "text/xml"})
Dalam cuplikan ini, kami membuat dokumen XML kecil yang mendefinisikan skema tabel dalam variabel konten. Kita perlu memberikan nama tabel dan nama keluarga kolom. Jika ada beberapa keluarga kolom, Anda membuat beberapa lagi ColumnSchema
node.
Selanjutnya, kita menggunakan modul request untuk POST
XML ke URL yang kita buat. URL ini harus menyertakan nama tabel baru. Perhatikan juga bahwa kita sedang menyetel header untuk POST
ini panggilan. Kami menunjukkan bahwa kami mengirim dalam XML dengan Content-Type
set ke “text/xml” dan kami ingin XML kembali dengan Accept
setel ke “teks/xml”.
Menggunakan request.status_code
, Anda dapat memeriksa apakah pembuatan tabel berhasil. Antarmuka REST menggunakan kode kesalahan HTTP yang sama untuk mendeteksi apakah panggilan berhasil atau salah. Kode status di tahun 200-an berarti semuanya bekerja dengan benar.
Kita dapat dengan mudah memeriksa apakah ada tabel menggunakan kode berikut:
request = requests.get(baseurl + "/" + tablename + "/schema")
Panggilan menggunakan GET
kata kerja untuk memberi tahu antarmuka REST bahwa kami ingin mendapatkan informasi skema tentang tabel di URL. Sekali lagi, kita dapat menggunakan kode status untuk melihat apakah tabel tersebut ada. Kode status di tahun 200-an berarti memang ada dan nomor lain berarti tidak ada.
Menggunakan curl
perintah, kita dapat memeriksa keberhasilan operasi REST tanpa menulis kode. Perintah berikut akan mengembalikan 200 yang menunjukkan keberhasilan panggilan karena messagestable
tabel memang ada di HBase. Berikut adalah panggilan dan outputnya:
[user@localhost]$ curl -I -H "Accept: text/xml" http://localhost:8070/messagestable/schema HTTP/1.1 200 OK Content-Length: 0 Cache-Control: no-cache Content-Type: text/xml
Panggilan REST ini akan error karena tablenotthere
tabel tidak ada di HBase. Berikut adalah panggilan dan outputnya:
[user@localhost]$ curl -I -H "Accept: text/xml" http://localhost:8070/tablenotthere/schema HTTP/1.1 500 org.apache.hadoop.hbase.TableNotFoundException: tablenotthere Content-Type: text/html; charset=iso-8859-1 Cache-Control: must-revalidate,no-cache,no-store Content-Length: 10767
Kita dapat menghapus tabel menggunakan kode berikut:
request = requests.delete(baseurl + "/" + tablename + "/schema")
Panggilan ini menggunakan DELETE
kata kerja untuk memberi tahu antarmuka REST bahwa kita ingin menghapus tabel. Menghapus tabel melalui antarmuka REST tidak mengharuskan Anda untuk menonaktifkannya terlebih dahulu. Seperti biasa, kami dapat mengonfirmasi keberhasilan dengan melihat kode status.
Di postingan berikutnya dalam seri ini, kita akan membahas penyisipan baris.
Jesse Anderson adalah seorang instruktur di Universitas Cloudera.
Jika Anda tertarik dengan HBase, pastikan untuk mendaftar ke HBaseCon 2013 (13 Juni, San Francisco) – ACARA komunitas untuk kontributor, pengembang, admin, dan pengguna HBase. Pendaftaran Early Bird dibuka hingga 23 April.