HBase dengan Java

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat pustaka HBase pangkalan data Java Client. HBase adalah pangkalan data yang diedarkan yang menggunakan sistem fail Hadoop untuk menyimpan data.

Kami akan membuat klien contoh Java dan jadual yang akan kami tambahkan beberapa catatan ringkas.

2. Struktur Data HBase

Di HBase, data dikelompokkan ke dalam keluarga lajur. Semua ahli lajur keluarga lajur mempunyai awalan yang sama.

Sebagai contoh, ruangan family1: qualifier1 dan family1 : qualifier2 kedua-duanya adalah ahli-ahli family1 keluarga lajur. Semua ahli keluarga lajur disimpan bersama di sistem fail.

Di dalam keluarga lajur, kita dapat meletakkan baris yang memiliki kelayakan yang ditentukan. Kita boleh menganggap kelayakan sebagai jenis nama lajur.

Mari lihat contoh contoh dari Hbase:

Family1:{ 'Qualifier1':'row1:cell_data', 'Qualifier2':'row2:cell_data', 'Qualifier3':'row3:cell_data' } Family2:{ 'Qualifier1':'row1:cell_data', 'Qualifier2':'row2:cell_data', 'Qualifier3':'row3:cell_data' }

Kami mempunyai dua keluarga lajur, masing-masing mempunyai tiga kelayakan dengan beberapa data sel di dalamnya. Setiap baris mempunyai kekunci baris - ini adalah pengecam baris yang unik. Kami akan menggunakan kekunci baris untuk memasukkan, mengambil dan menghapus data.

3. Ketergantungan Pelanggan HBase Maven

Sebelum kita menyambung ke HBase, kita perlu menambahkan pergantungan hbase-client dan hbase :

 org.apache.hbase hbase-client ${hbase.version}   org.apache.hbase hbase ${hbase.version} 

4. Persediaan HBase

Kita perlu menyiapkan HBase agar dapat menyambung dari perpustakaan klien Java ke sana. Pemasangan di luar ruang lingkup artikel ini tetapi anda boleh melihat beberapa panduan pemasangan HBase secara dalam talian.

Seterusnya, kita perlu memulakan master HBase secara tempatan dengan melaksanakan:

hbase master start

5. Menyambung ke HBase dari Java

Untuk menyambung secara terprogram dari Java ke HBase, kita perlu menentukan fail konfigurasi XML. Kami memulakan instance HBase kami di localhost jadi kami perlu memasukkannya ke dalam fail konfigurasi:

  hbase.zookeeper.quorum localhost   hbase.zookeeper.property.clientPort 2181   

Sekarang kita perlu menunjukkan klien HBase ke fail konfigurasi itu:

Configuration config = HBaseConfiguration.create(); String path = this.getClass() .getClassLoader() .getResource("hbase-site.xml") .getPath(); config.addResource(new Path(path)); 

Seterusnya, kami memeriksa sama ada sambungan ke HBase berjaya - sekiranya berlaku kegagalan, MasterNotRunningException akan dilemparkan:

HBaseAdmin.checkHBaseAvailable(config);

6. Membuat Struktur Pangkalan Data

Sebelum kita mula menambahkan data ke HBase, kita perlu membuat struktur data untuk memasukkan baris. Kami akan membuat satu jadual dengan dua keluarga lajur:

private TableName table1 = TableName.valueOf("Table1"); private String family1 = "Family1"; private String family2 = "Family2";

Pertama, kita perlu membuat sambungan ke pangkalan data dan mendapatkan objek pentadbir , yang akan kita gunakan untuk memanipulasi struktur pangkalan data:

Connection connection = ConnectionFactory.createConnection(config) Admin admin = connection.getAdmin();

Kemudian, kita dapat membuat jadual dengan meneruskan instance kelas HTableDescriptor ke kaedah createTable () pada objek pentadbir :

HTableDescriptor desc = new HTableDescriptor(table1); desc.addFamily(new HColumnDescriptor(family1)); desc.addFamily(new HColumnDescriptor(family2)); admin.createTable(desc);

7. Menambah dan Mengambil Elemen

Dengan jadual yang dibuat, kita dapat menambahkan data baru dengannya dengan membuat objek Put dan memanggil kaedah put () pada objek Table :

byte[] row1 = Bytes.toBytes("row1") Put p = new Put(row1); p.addImmutable(family1.getBytes(), qualifier1, Bytes.toBytes("cell_data")); table1.put(p);

Mengambil baris yang dibuat sebelumnya dapat dicapai dengan menggunakan kelas Get :

Get g = new Get(row1); Result r = table1.get(g); byte[] value = r.getValue(family1.getBytes(), qualifier1);

The ROW1 adalah pengecam baris - kita boleh menggunakannya untuk mendapatkan semula berturut-turut tertentu dari pangkalan data. Semasa memanggil:

Bytes.bytesToString(value)

hasil yang dikembalikan akan menjadi sel_data yang dimasukkan sebelumnya.

8. Mengimbas dan Menapis

Kita boleh mengimbas jadual, mendapatkan semula semua elemen dalam kelayakan yang diberikan dengan menggunakan Scan objek (nota yang ResultScanner memanjangkan boleh tutup , jadi pastikan untuk memanggil rapat () di atasnya apabila anda selesai):

Scan scan = new Scan(); scan.addColumn(family1.getBytes(), qualifier1); ResultScanner scanner = table.getScanner(scan); for (Result result : scanner) { System.out.println("Found row: " + result); } 

Operasi itu akan mencetak semua baris di dalam kelayakan1 dengan beberapa maklumat tambahan seperti cap waktu:

Found row: keyvalues={Row1/Family1:Qualifier1/1488202127489/Put/vlen=9/seqid=0}

Kami dapat mengambil rekod tertentu dengan menggunakan penapis.

Pertama, kami membuat dua penapis. The filter1 menyatakan bahawa Pertanyaan imbasan akan mendapatkan semula unsur-unsur yang lebih besar daripada ROW1, dan filter2 tentukan bahawa kita berminat hanya dalam baris yang mempunyai kelayakan sama untuk qualifier1 :

Filter filter1 = new PrefixFilter(row1); Filter filter2 = new QualifierFilter( CompareOp.GREATER_OR_EQUAL, new BinaryComparator(qualifier1)); List filters = Arrays.asList(filter1, filter2);

Then we can get a result set from a Scan query:

Scan scan = new Scan(); scan.setFilter(new FilterList(Operator.MUST_PASS_ALL, filters)); try (ResultScanner scanner = table.getScanner(scan)) { for (Result result : scanner) { System.out.println("Found row: " + result); } }

When creating a FilterList we passed an Operator.MUST_PASS_ALL – it means that all filters must be satisfied. We can choose an Operation.MUST_PASS_ONE if only one filter needs to be satisfied. In the resulting set, we will have only rows that matched specified filters.

9. Deleting Rows

Finally, to delete a row, we can use a Delete class:

Delete delete = new Delete(row1); delete.addColumn(family1.getBytes(), qualifier1); table.delete(delete);

We're deleting a row1 that resides inside of a family1.

10. Conclusion

In this quick tutorial, we focused on communicated with a HBase database. We saw how to connect to HBase from the Java client library and how to run various basic operations.

Pelaksanaan semua contoh dan coretan kod ini terdapat dalam projek GitHub; ini adalah projek Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.