Javaを使用したHBase
1. 概要
この記事では、HBaseデータベースJavaクライアントライブラリについて説明します。 HBaseは、Hadoopファイルシステムを使用してデータを保存する分散データベースです。
Javaサンプルクライアントと、いくつかの単純なレコードを追加するテーブルを作成します。
2. HBaseデータ構造
HBaseでは、データは列ファミリーにグループ化されます。 列ファミリーのすべての列メンバーの接頭辞は同じです。
たとえば、列 family1:qualifier1とfamily1 :qualifier2 は、どちらもfamily1列ファミリーのメンバーです。 すべての列ファミリーメンバーは、ファイルシステムに一緒に保存されます。
列ファミリー内に、指定された修飾子を持つ行を配置できます。 修飾子は、一種の列名と考えることができます。
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'
}
2つの列ファミリーがあり、それぞれにいくつかのセルデータを含む3つの修飾子があります。 各行には行キーがあります–これは一意の行識別子です。 行キーを使用して、データを挿入、取得、および削除します。
3. HBaseクライアントMavenの依存関係
HBaseに接続する前に、hbase-clientおよびhbaseの依存関係を追加する必要があります。
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase</artifactId>
<version>${hbase.version}</version>
</dependency>
4. HBaseのセットアップ
JavaクライアントライブラリからHBaseに接続できるようにHBaseをセットアップする必要があります。 インストールはこの記事の範囲外ですが、HBaseインストールガイドの一部をオンラインで確認できます。
次に、以下を実行して、HBaseマスターをローカルで起動する必要があります。
hbase master start
5. JavaからHBaseに接続する
プログラムでJavaからHBaseに接続するには、XML構成ファイルを定義する必要があります。 ローカルホストでHBaseインスタンスを開始したので、それを構成ファイルに入力する必要があります。
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
</configuration>
次に、HBaseクライアントにその構成ファイルを指定する必要があります。
Configuration config = HBaseConfiguration.create();
String path = this.getClass()
.getClassLoader()
.getResource("hbase-site.xml")
.getPath();
config.addResource(new Path(path));
次に、HBaseへの接続が成功したかどうかを確認しています。失敗した場合は、MasterNotRunningExceptionがスローされます。
HBaseAdmin.checkHBaseAvailable(config);
6. データベース構造の作成
HBaseにデータを追加する前に、行を挿入するためのデータ構造を作成する必要があります。 2つの列ファミリーを持つ1つのテーブルを作成します。
private TableName table1 = TableName.valueOf("Table1");
private String family1 = "Family1";
private String family2 = "Family2";
まず、データベースへの接続を作成し、 admin オブジェクトを取得する必要があります。これは、データベース構造の操作に使用します。
Connection connection = ConnectionFactory.createConnection(config)
Admin admin = connection.getAdmin();
次に、 HTableDescriptorクラスのインスタンスをadminオブジェクトのcreateTable()メソッドに渡すことでテーブルを作成できます。
HTableDescriptor desc = new HTableDescriptor(table1);
desc.addFamily(new HColumnDescriptor(family1));
desc.addFamily(new HColumnDescriptor(family2));
admin.createTable(desc);
7. 要素の追加と取得
テーブルを作成したら、 Put オブジェクトを作成し、 Tableオブジェクトでput()メソッドを呼び出すことで、新しいデータを追加できます。
byte[] row1 = Bytes.toBytes("row1")
Put p = new Put(row1);
p.addImmutable(family1.getBytes(), qualifier1, Bytes.toBytes("cell_data"));
table1.put(p);
以前に作成された行を取得するには、Getクラスを使用します。
Get g = new Get(row1);
Result r = table1.get(g);
byte[] value = r.getValue(family1.getBytes(), qualifier1);
row1 は行識別子です。これを使用して、データベースから特定の行を取得できます。 電話をかけるとき:
Bytes.bytesToString(value)
返される結果は、以前に挿入されたcell_data。になります。
8. スキャンとフィルタリング
Scan オブジェクトを使用して、指定された修飾子内のすべての要素を取得し、テーブルをスキャンできます(ResultScannerはClosableを拡張するため、必ず[完了したら、X187X] close()を実行します):
Scan scan = new Scan();
scan.addColumn(family1.getBytes(), qualifier1);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
System.out.println("Found row: " + result);
}
この操作により、 qualifier1 内のすべての行が、タイムスタンプなどの追加情報とともに出力されます。
Found row: keyvalues={Row1/Family1:Qualifier1/1488202127489/Put/vlen=9/seqid=0}
フィルタを使用して特定のレコードを取得できます。
まず、2つのフィルターを作成します。 filter1 は、スキャンクエリが row1、、および filter2 より大きい要素を取得することを指定し、は、[ X205X] qualifier1 :
Filter filter1 = new PrefixFilter(row1);
Filter filter2 = new QualifierFilter(
CompareOp.GREATER_OR_EQUAL,
new BinaryComparator(qualifier1));
List<Filter> filters = Arrays.asList(filter1, filter2);
次に、Scanクエリから結果セットを取得できます。
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);
}
}
FilterList を作成するときに、 Operator.MUST_PASS_ALL を渡しました。これは、すべてのフィルターが満たされる必要があることを意味します。 1つのフィルターのみを満たす必要がある場合は、Operation.MUST_PASS_ONEを選択できます。 結果のセットには、指定されたフィルターに一致する行のみが含まれます。
9. 行の削除
最後に、行を削除するには、Deleteクラスを使用できます。
Delete delete = new Delete(row1);
delete.addColumn(family1.getBytes(), qualifier1);
table.delete(delete);
family1内にあるrow1を削除します。
10. 結論
このクイックチュートリアルでは、HBaseデータベースとの通信に焦点を当てました。 JavaクライアントライブラリからHBaseに接続する方法と、さまざまな基本操作を実行する方法を見てきました。
これらすべての例とコードスニペットの実装は、GitHubプロジェクトにあります。 これはMavenプロジェクトなので、そのままインポートして実行するのは簡単です。