6.1 Siapa yang menemukan HBase dan mengapa
Dalam kuliah ini, kita akan berbicara tentang alat luar biasa seperti Hbase, yang baru-baru ini mendapatkan popularitas besar: misalnya, Facebook menggunakannya sebagai dasar sistem perpesanannya, dan ini sudah menjelaskan banyak hal.
Kuliah akan berbicara tentang konsep Big Table dan implementasi gratisnya, fitur kerja dan perbedaan dari database relasional klasik (seperti MySQL dan Oracle) dan penyimpanan nilai kunci seperti Redis, Aerospike, dan memcached. Seperti biasa, mari kita mulai dengan sejarah masalah ini. Seperti banyak proyek BigData lainnya, Hbase lahir dari konsep yang dikembangkan oleh Google. Prinsip-prinsip di balik Hbase dijelaskan dalam artikel Bigtable: A Distributed Storage System for Structured Data .
Seperti yang telah kita diskusikan di kuliah sebelumnya, file biasa cukup cocok untuk pemrosesan data batch menggunakan paradigma MapReduce. Di sisi lain, informasi yang disimpan dalam file agak tidak nyaman untuk diperbarui; File juga kehilangan kemungkinan akses acak. Untuk pekerjaan cepat dan nyaman dengan akses acak, ada kelas sistem nosql seperti penyimpanan nilai kunci, seperti Aerospike, Redis, Couchbase, Memcached. Namun, pemrosesan batch biasanya sangat merepotkan dalam sistem ini. Hbase adalah upaya untuk menggabungkan kemudahan pemrosesan batch dengan kemudahan pembaruan dan akses acak.
![](https://cdn.codegym.cc/images/article/54d64a29-4642-4c59-8211-2b143dfcd48a/512.jpeg)
6.2 Model data
HBase adalah basis data nilai kunci multiversi terdistribusi, berorientasi kolom, dan multiversi.
- Data diatur ke dalam tabel yang diindeks oleh kunci utama yang disebut RowKey di Hbase.
- Untuk setiap kunci RowKey, kumpulan atribut (atau kolom) yang tidak terbatas dapat disimpan.
- Kolom diatur ke dalam kelompok kolom yang disebut Keluarga Kolom. Sebagai aturan, kolom yang memiliki penggunaan dan pola penyimpanan yang sama digabungkan menjadi satu Keluarga Kolom.
- Untuk setiap atribut, beberapa versi berbeda dapat disimpan. Versi yang berbeda memiliki stempel waktu yang berbeda.
Catatan disimpan secara fisik dalam urutan terurut RowKey. Dalam hal ini, data yang terkait dengan Keluarga Kolom yang berbeda disimpan secara terpisah, yang memungkinkan, jika perlu, membaca data hanya dari keluarga kolom yang diinginkan.
Ketika atribut tertentu dihapus, itu tidak langsung dihapus secara fisik, tetapi hanya ditandai dengan bendera batu nisan khusus. Penghapusan fisik data akan terjadi nanti, saat operasi Pemadatan Besar dilakukan.
Atribut milik grup kolom yang sama dan sesuai dengan kunci yang sama disimpan secara fisik sebagai daftar yang diurutkan. Atribut apa pun dapat tidak ada atau ada untuk setiap kunci, dan jika atribut tidak ada, ini tidak menyebabkan overhead menyimpan nilai kosong.
Nama grup daftar dan kolom sudah diperbaiki dan memiliki tata letak yang jelas. Pada tingkat grup kolom, parameter seperti waktu aktif (TTL) dan jumlah maksimum versi tersimpan ditetapkan. Jika perbedaan antara stempel waktu untuk versi tertentu dan waktu saat ini lebih besar dari TTL, entri tersebut ditandai untuk dihapus. Jika jumlah versi untuk atribut tertentu melebihi jumlah versi maksimum, record juga ditandai untuk dihapus.
![](https://cdn.codegym.cc/images/article/38a31201-f909-4a45-9792-a5d72225f060/512.jpeg)
Model data Hbase dapat diingat sebagai pencocokan nilai kunci:
<table, RowKey, Column Family, Column, timestamp> -> Value
6.3 Operasi yang didukung
Daftar operasi yang didukung di hbase cukup sederhana. 4 operasi utama didukung:
- Put : tambahkan entri baru ke hbase. Stempel waktu entri ini dapat diatur dengan tangan, jika tidak maka akan diatur secara otomatis ke waktu saat ini.
- Get : Dapatkan data untuk RowKey tertentu. Anda dapat menentukan Keluarga Kolom dari mana kami akan mengambil data dan jumlah versi yang ingin kami baca.
- Pindai : membaca catatan satu per satu. Anda dapat menentukan catatan dari mana kita mulai membaca, catatan yang akan dibaca, jumlah catatan yang akan dibaca, Keluarga Kolom tempat pembacaan akan dilakukan dan jumlah versi maksimum untuk setiap catatan.
- Hapus : Tandai versi tertentu untuk dihapus. Tidak akan ada penghapusan fisik, akan ditunda hingga Pemadatan Besar berikutnya (lihat di bawah).
6.4 Arsitektur
HBase adalah basis data terdistribusi yang dapat berjalan di lusinan atau ratusan server fisik, memastikan operasi tanpa gangguan meskipun beberapa di antaranya gagal. Oleh karena itu, arsitektur HBase cukup kompleks dibandingkan dengan database relasional klasik.
![](https://cdn.codegym.cc/images/article/5bae086c-b213-47db-be33-a23d854a1543/1024.jpeg)
HBase menggunakan dua proses utama untuk pekerjaannya:
1. Server Wilayah - Melayani satu wilayah atau lebih. Wilayah adalah rentang rekaman yang sesuai dengan rentang tertentu dari RowKey yang berurutan. Setiap wilayah berisi:
- Persistent Storage adalah penyimpanan data utama di HBase. Data disimpan secara fisik di HDFS, dalam format HFile khusus. Data dalam HFile disimpan dalam urutan terurut RowKey. Satu pasangan (wilayah, keluarga kolom) sesuai dengan setidaknya satu HFIle.
- MemStore - menulis buffer. Karena data disimpan dalam HFile d dalam urutan terurut, cukup mahal untuk memperbarui HFile per record. Sebaliknya, saat menulis, data memasuki area memori MemStore khusus, tempat data terakumulasi untuk beberapa waktu. Saat MemStore diisi ke beberapa nilai kritis, data ditulis ke HFile baru.
- BlockCache - cache untuk membaca. Memungkinkan Anda menghemat waktu secara signifikan untuk data yang sering dibaca.
- Write Ahead Log (WAL) . Karena data ditulis ke memstore, ada risiko kehilangan data karena crash. Untuk mencegah hal ini terjadi, semua operasi sebelum implementasi manipulasi yang sebenarnya dimasukkan ke dalam file log khusus. Ini memungkinkan Anda untuk memulihkan data setelah kegagalan apa pun.
2. Master Server - server utama di cluster HBase. Master mengelola distribusi wilayah di antara Server Wilayah, mengelola daftar wilayah, mengelola peluncuran tugas reguler, dan melakukan pekerjaan berguna lainnya.
Untuk mengoordinasikan tindakan antar layanan, HBase menggunakan Apache ZooKeeper, layanan khusus yang dirancang untuk mengelola konfigurasi dan menyinkronkan layanan.
Ketika jumlah data di wilayah meningkat dan mencapai ukuran tertentu, Hbase mulai membagi, sebuah operasi yang membagi wilayah menjadi 2. Untuk menghindari pembagian wilayah yang konstan, Anda dapat mengatur batas wilayah terlebih dahulu dan meningkatkan maksimumnya ukuran.
Karena data untuk satu wilayah dapat disimpan di beberapa HFile, Hbase secara berkala menggabungkannya untuk mempercepat pekerjaan. Operasi ini disebut pemadatan di Hbase. Pemadatan terdiri dari dua jenis:
- Pemadatan kecil . Mulai secara otomatis, berjalan di latar belakang. Memiliki prioritas rendah dibandingkan dengan operasi Hbase lainnya.
- Pemadatan utama . Ini diluncurkan dengan tangan atau saat terjadi pemicu tertentu (misalnya, dengan pengatur waktu). Ini memiliki prioritas tinggi dan dapat memperlambat cluster secara signifikan. Pemadatan Besar paling baik dilakukan pada saat beban pada kluster kecil. Pemadatan Besar juga secara fisik menghapus data yang sebelumnya ditandai dengan batu nisan.
6.5 Cara bekerja dengan HBase
Shell HBase
Cara termudah untuk memulai dengan Hbase adalah dengan menggunakan utilitas shell hbase. Ini tersedia segera setelah menginstal hbase pada setiap node cluster hbase.![](https://cdn.codegym.cc/images/article/d13e20e1-fed9-444a-929c-15ab43d8209b/800.jpeg)
Hbase shell adalah konsol jruby dengan dukungan bawaan untuk semua operasi dasar Hbase. Berikut ini adalah contoh membuat tabel pengguna dengan dua keluarga kolom, melakukan beberapa manipulasi di atasnya, dan menjatuhkan tabel di bagian akhir di shell hbase:
create 'users', {NAME => 'user_profile', VERSIONS => 5}, {NAME => 'user_posts', VERSIONS => 1231231231}
put 'users', 'id1', 'user_profile:name', 'alexander'
put 'users', 'id1', 'user_profile:second_name', 'alexander'
get 'users', 'id1'
put 'users', 'id1', 'user_profile:second_name', 'kuznetsov'
get 'users', 'id1'
get 'users', 'id1', {COLUMN => 'user_profile:second_name', VERSIONS => 5}
put 'users', 'id2', 'user_profile:name', 'vasiliy'
put 'users', 'id2', 'user_profile:second_name', 'ivanov'
scan 'users', {COLUMN => 'user_profile:second_name', VERSIONS => 5}
delete 'users', 'id1', 'user_profile:second_name'
get 'users', 'id1'
disable 'users'
drop 'users'
API asli
Seperti kebanyakan proyek terkait hadoop lainnya, hbase diimplementasikan di java, sehingga api asli tersedia di Java. Native API didokumentasikan dengan cukup baik di situs web resmi. Berikut adalah contoh penggunaan Hbase API yang diambil dari sana:
import java.io.IOException;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
public class MyLittleHBaseClient {
public static void main(String[] args) throws IOException {
Configuration config = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(config);
try {
Table table = connection.getTable(TableName.valueOf("myLittleHBaseTable"));
try {
Put p = new Put(Bytes.toBytes("myLittleRow"));
p.add(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"),
Bytes.toBytes("Some Value"));
table.put(p);
Get g = new Get(Bytes.toBytes("myLittleRow"));
Result r = table.get(g);
byte [] value = r.getValue(Bytes.toBytes("myLittleFamily"),
Bytes.toBytes("someQualifier"));
String valueStr = Bytes.toString(value);
System.out.println("GET: " + valueStr);
Scan s = new Scan();
s.addColumn(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"));
ResultScanner scanner = table.getScanner(s);
try {
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
System.out.println("Found row: " + rr);
}
} finally {
scanner.close();
}
} finally {
if (table != null) table.close();
}
} finally {
connection.close();
}
}
}
Hemat, REST, dan dukungan untuk bahasa pemrograman lain
Untuk bekerja dari bahasa pemrograman lain, Hbase menyediakan Thrift API dan Rest API. Berdasarkan mereka, klien dibuat untuk semua bahasa pemrograman utama: python, PHP, Java Script, dll.
6.6 Beberapa fitur bekerja dengan HBase
-
Hbase terintegrasi langsung dengan MapReduce, dan dapat digunakan sebagai input dan output menggunakan TableInputFormat dan TableOutputFormat khusus.
-
Sangat penting untuk memilih RowKey yang tepat. RowKey harus memberikan pemerataan yang baik di seluruh wilayah, jika tidak ada risiko yang disebut "wilayah panas" - wilayah yang lebih sering digunakan daripada yang lain, yang mengarah pada penggunaan sumber daya sistem yang tidak efisien.
-
Jika data tidak diunggah secara tunggal, tetapi segera dalam batch besar, Hbase mendukung mekanisme BulkLoad khusus yang memungkinkan Anda mengunggah data jauh lebih cepat daripada menggunakan Put tunggal. BulkLoad pada dasarnya adalah operasi dua langkah:
- Pembentukan HFile tanpa partisipasi penempatan menggunakan pekerjaan MapReduce khusus
- Memasukkan file-file ini langsung ke Hbase
-
Hbase mendukung keluaran metriknya ke server pemantauan Ganglia. Ini bisa sangat membantu saat mengelola Hbase untuk menyelesaikan masalah hbase.
kunci baris
RowKey adalah ID pengguna, yang merupakan GUID, sebuah string yang dibuat khusus untuk menjadi unik di seluruh dunia. GUID didistribusikan secara merata, yang memberikan distribusi data yang baik di seluruh server.
Keluarga Kolom
Penyimpanan kami menggunakan dua keluarga kolom:
- data. Grup kolom ini menyimpan data yang tidak lagi relevan untuk tujuan periklanan, seperti fakta bahwa pengguna telah mengunjungi URL tertentu. TTL untuk Keluarga Kolom ini diatur ke 2 bulan, batas jumlah versi adalah 2000.
- longdata. Grup kolom ini menyimpan data yang tidak kehilangan relevansinya dari waktu ke waktu, seperti jenis kelamin, tanggal lahir, dan karakteristik pengguna "abadi" lainnya.
speaker
Setiap jenis fakta pengguna disimpan dalam kolom terpisah. Misalnya, kolom Data:_v menyimpan URL yang dikunjungi oleh pengguna, dan kolom LongData:gender menyimpan jenis kelamin pengguna.
Stempel waktu dari fakta ini disimpan sebagai stempel waktu. Misalnya, di kolom Data:_v, stempel waktu adalah waktu saat pengguna mengunjungi URL tertentu.
Struktur penyimpanan data pengguna ini sangat cocok dengan pola penggunaan kami dan memungkinkan Anda memperbarui data pengguna dengan cepat, mendapatkan semua informasi yang diperlukan tentang pengguna dengan cepat, dan, menggunakan MapReduce, memproses data tentang semua pengguna dengan cepat sekaligus.
6.7 Alternatif
HBase cukup rumit untuk dikelola dan digunakan, jadi sebelum menggunakan HBase, masuk akal untuk melihat alternatifnya:
-
Database Relasional . Alternatif yang sangat bagus, terutama jika data muat di satu mesin. Selain itu, pertama-tama, Anda harus memikirkan tentang basis data relasional jika transaksi indeks selain yang utama penting.
-
Penyimpanan Nilai Kunci . Penyimpanan seperti Redis dan Aerospike lebih cocok saat latensi diperlukan dan pemrosesan batch kurang penting.
-
File dan pemrosesannya dengan MapReduce . Jika data hanya ditambah dan jarang diupdate/diubah, maka sebaiknya tidak menggunakan HBase, melainkan cukup menyimpan data tersebut dalam file. Untuk menyederhanakan pekerjaan dengan file, Anda dapat menggunakan alat seperti Hive, Pig, dan Impala.
Penggunaan HBase dibenarkan ketika:
- Ada banyak data, dan tidak muat di satu komputer / server
- Data sering diperbarui dan dihapus
- Ada "kunci" eksplisit dalam data, yang memudahkan untuk mengikat yang lainnya
- Perlu pemrosesan batch
- Butuh akses acak ke data dengan kunci tertentu
GO TO FULL VERSION