Omidを使ってみる
それでは、実際にOmidを使ってみましょう。
事前準備
まずは下記のように、Githubからソースコードをダウンロードします。
$ git clone https://github.com/yahoo/omid.git omid
次に、mvnコマンドでインストールを行います。
$ cd omid $ mvn install -DskipTests
TSOサーバを立ち上げましょう。
$ bin/omid.sh tso
Omidではコプロセッサを使用するため、HBaseを起動する前に、OmidのjarをHBaseのインストールディレクトリのlibディレクトリ以下にコピーする必要があります。
$ cp target/omid-1.0-SNAPSHOT.jar <HBaseのインストールディレクトリ>/lib/
HBaseを起動します。
$ <HBaseのインストールディレクトリ>/bin/start-hbase.sh
最後に、今回使用するTableを作成する必要があります。
HBase shellを起動します。
$ <HBaseのインストールディレクトリ>/bin/hbase shell
Tableを作成します。
$ create 'tbl', 'fam' 0 row(s) in 1.0610 seconds
作成したTableにOmidのコプロセッサを指定します。
このコプロセッサの詳細については割愛しますが、Compaction時に不必要なデータを消すためのものになります。
$ disable 'tbl' 0 row(s) in 5.0890 seconds $ alter 'tbl', METHOD => 'table_att', 'coprocessor$1'=>'|com.yahoo.omid.regionserver.Compacter|1|' Updating all regions with the new schema... 1/1 regions updated. Done. 0 row(s) in 11.0770 seconds $ enable 'tbl' 0 row(s) in 6.1310 seconds
クライアントコード
まず、クライアント側の設定として、pom.xmlに以下のdependencyを指定する必要があります。
執筆時点でのOmidの最新バージョンは、1.0-SNAPSHOTなのでそちらを指定します。
<dependency> <groupId>com.yahoo</groupId> <artifactId>omid</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
それでは、実際にコードを書いてみましょう。クライアント側のコードは以下のようになります。
Configuration conf = HBaseConfiguration.create(); // TSOサーバの設定……(1) conf.set("tso.host", "localhost"); conf.set("tso.port", "1234"); // トランザクションマネージャ……(2) TransactionManager tm = new TransactionManager(conf); // Table……(3) TTable table = new TTable(conf, "tbl"); // トランザクション開始……(4) Transaction t = tm.begin(); byte[] row = Bytes.toBytes("row"); byte[] fam = Bytes.toBytes("fam"); byte[] col = Bytes.toBytes("col"); byte[] val = Bytes.toBytes("val"); // データをPutする……(5) Put p = new Put(row); p.add(fam, col, val); table.put(t, p); byte[] startrow = Bytes.toBytes("row1"); byte[] stoprow = Bytes.toBytes("row5"); // データをScanする……(6) ResultScanner rs = table.getScanner(t, new Scan().setStartRow(startrow).setStopRow(stoprow)); Result r = rs.next(); while (r != null) { r = rs.next(); } // コミットする……(7) tm.commit(t); // Tableのクローズ……(8) table.close();
順を追って説明していきます。
(1)ではTSOサーバの設定を行っています。TSOサーバはデフォルトで1234番ポートで起動します。
(2)はクライアント側でトランザクションの管理を行うTransactionManagerのインスタンスを生成しています。
(3)では、HTabeのラッパークラスであるTTableのインスタンスを生成しています。OmidではTTableをベースにデータのやり取りを行います。
(4)では、トランザクションの開始を宣言しています。
(5)、(6)では、TTableによってデータをPutやScanを行っています。Scanでは(4)時点でのスナップショットに対して読み込みが行われます(Snapshot Isolation)。
(7)でコミットをしています。データ更新の競合などでコミットが失敗した場合は、RollbackExceptionがスローされます。
(8)でTTableをクローズしています。