HiveServerはThriftプロトコルをしゃべるので、おなじくThriftで接続すると任意のクエリを発行できたりして大変便利。ということで node.js からもやった。以前からやってる内容の続き。
- HiveServerを使用してPythonやPerlからHiveQLを実行する - tagomorisのメモ置き場 (HiveServerの起動まではこのエントリを参照のこと)
- node.jsからThrift経由でHiveServerに通信しようとして力尽きた - tagomorisのメモ置き場
- node.js用のThriftライブラリにパッチを書いた - tagomorisのメモ置き場
node.jsから接続する
node.jsでnpm install thrift で取得できる thrift ライブラリは2011/04/08現在ではBufferedTransportに対応していない。v0.7.0相当のものが出てきたら多分対応版になるんじゃないかと思うが、それまでは tagomoris/node-thrift · GitHub から持ってきてもらう必要がある。
$ cd tmp $ git clone git://github.com/tagomoris/node-thrift.git $ cd ../yourproject $ mkdir lib; cd lib $ cp -r ../../tmp/node-thrift/lib/thrift ./
続けて、thrift定義ファイルから js:node を指定してスクリプトを生成する。
$ thrift -I ~/tmp/hive-0.6.0/src -I ~/tmp/hive-0.6.0/src/service -I ~/tmp/hive-0.6.0/src/service/include -I ~/tmp/hive-0.6.0/src/metastore --gen js:node ~/tmp/hive-0.6.0/src/service/include/thrift/fb303/if/fb303.thrift $ thrift -I ~/tmp/hive-0.6.0/src -I ~/tmp/hive-0.6.0/src/service -I ~/tmp/hive-0.6.0/src/service/include -I ~/tmp/hive-0.6.0/src/metastore --gen js:node ~/tmp/hive-0.6.0/src/metastore/if/hive_metastore.thrift $ thrift -I ~/tmp/hive-0.6.0/src -I ~/tmp/hive-0.6.0/src/service -I ~/tmp/hive-0.6.0/src/service/include -I ~/tmp/hive-0.6.0/src/metastore --gen js:node ~/tmp/hive-0.6.0/src/service/if/hive_service.thrift $ thrift -I ~/tmp/hive-0.6.0/src -I ~/tmp/hive-0.6.0/src/service -I ~/tmp/hive-0.6.0/src/service/include -I ~/tmp/hive-0.6.0/src/metastore --gen js:node ~/tmp/hive-0.6.0/src/ql/if/queryplan.thrift
実行したら lib の中に thrift と gen-nodejs の両ディレクトリができている。あとはこんな感じのスクリプトを作って走らせればいい。
var thrift = require('thrift'), ttransport = require('thrift/transport'), ThriftHive = require('gen-nodejs/ThriftHive'); var connection = thrift.createConnection("localhost", 10000, {transport: ttransport.TBufferedTransport, timeout: 600*1000}), client = thrift.createClient(ThriftHive, connection); connection.on('error', function(err) { console.error(err); }); connection.addListener("connect", function() { client.execute('select count(*) from p', function(err){ console.error("pos"); if (err) { console.error("error on execute(): " + err); process.exit(1); } client.fetchAll(function(err, data){ if (err){ console.error("error on fetchAll(): " + err); process.exit(1); } console.error(data); connection.end(); process.exit(0); }); }); });
上記スクリプトを以下のようにして実行。
$ NODE_PATH=lib node hive_sample.js
できたできた!