Java付きHBase
1概要
この記事では、https://hbase.apache.org/[
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に接続する前に、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.hbase%22%20AND%20a%3A%22hbase-を追加する必要があります。 client%22[
hbase-client
]および__https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.hbase%22%20AND%20a%3A%22hbase%22[依存関係:
<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のインストールhttps://www.tutorialspoint.com/hbase/hbase__installation.htm[guides online]の一部を確認できます。
次に、次のコマンドを実行してHBaseマスターをローカルで起動する必要があります。
hbase master start
** 5 JavaからHBaseに接続する
JavaからHBaseにプログラム的に接続するには、XML設定ファイルを定義する必要があります。我々はlocalhostで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
を拡張しているので、完了したら必ず
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
は、修飾子が
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に接続する方法と、さまざまな基本操作を実行する方法を見ました。
これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/hbase[GitHubプロジェクト]にあります。これはMavenプロジェクトなので、そのままインポートして実行するのは簡単なはずです。