やりたいこと
HBaseにThriftでRubyからアクセスしたい。(表題ママ)
もともとHBaseにREST API経由でアクセスするRubyプログラムを書いていたのですが、Thriftでのみサポートされている操作を行いたかったのでThrift経由でアクセスするRubyのHBaseクライアントとそれを利用したプログラムを作ります。
書いた動機
- ThriftでHBaseにアクセスする処理をRubyで実装した例が見つからなかったので。
- Thriftがなんなのか分からない状態から、なんとなく分かった状態になれたので記念に。
環境
以下環境で確認しました。
- MacBook Air (13-inch, Early 2015)
- Ruby 2.4.0
- Amazon EMR HBase 1.3.1
- 今回はEMRを使用していますが、ローカル環境に立てたHBaseサーバーでも構いません。
概要
- Thriftをインストールする。
- thrift gem を追加する。
- HBaseクライアントのコードを生成する。
- HBaseからデータを取得するコードを書く。
詳細
1. Thriftをインストールする。
brewだと一発で入りました。
brew install thrift
2. thrift gem を追加する。
gem install thrift
3. HBaseクライアントのコードを生成する。
thriftコマンドを使ってHBaseクライアントを生成します。
## HBaseのコードを取得 & 展開
wget http://ftp.riken.jp/net/apache/hbase/stable/hbase-1.4.10-src.tar.gz
tar zxvf hbase-1.4.10-src.tar.gz
## ソースコードの生成
thrift --gen rb hbase-1.4.10/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
- 筆者環境ではthriftコマンドを実行すると、
[WARNING:/path/to/hbase-1.4.10/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift:89] The "byte" type is a compatibility alias for "i8". Use "i8" to emphasize the signedness of this type.
というWARNINGが出ました。HBase.thrift
の89行目にあるbyte
をi8
に書き換えて再実行したらうまくいきました。(これで良いのかは不明です)
-
gen-rb
というフォルダが作られ、その中にhbase.rb
,hbase_constants.rb
,hbase_types.rb
の3ファイルが作られたらOKです。あとはこのファイルを使ってHBaseにアクセスするだけです。
4. HBaseからデータを取得するコードを書く。
Thriftで生成したをコードを利用するコードを書きます。
main.rb
require './hbase'
require './hbase_constants'
require './hbase_types'
transport = Thrift::BufferedTransport.new(Thrift::Socket.new('hbase-host', 9090))
protocol = Thrift::BinaryProtocol.new(transport)
client = Apache::Hadoop::Hbase::Thrift::Hbase::Client.new(protocol)
transport.open()
# ネームスペース'test_name_space', テーブル'sample_table'の先頭から降順で10件取得する。(=末尾10件を取得する。)
scan = Apache::Hadoop::Hbase::Thrift::TScan.new
scan.reversed = true
scanner_id = client.scannerOpenWithScan("test_name_space:sample_table", scan, nil)
result = client.scannerGetList(scanner_id, 10)
result.each { |row_result| puts row_result.row }
transport.close()
- resultには
Array<::Apache::Hadoop::Hbase::Thrift::TRowResult>
が返ってくるので、あとは好きなように加工してください。 - 上記例では
Apache::Hadoop::Hbase::Thrift::TScan
を用いて、逆順のオプションを指定していますが、startRow
,stopRow
などの指定も可能です。指定できるオプションはhbase_types.rb
にあるTScan
クラスの定義 を見てみるとわかると思います。
実行結果は次のようなイメージです。
$ ruby main.rb
rowKey9
rowKey8
rowKey7
rowKey6
rowKey5
rowKey4
rowKey3
rowKey2
rowKey1
rowKey0
最終的なフォルダ構成は次のようになりました。
gen-rb
├── hbase.rb
├── hbase_constants.rb
├── hbase_types.rb
└── main.rb
終わりに
まとまったドキュメントを見つけきれず1日かけて手探りで実装していきましたが、あとから振り返ってみると1時間で終わりそうな内容でした。
参考