たごもりすメモ

コードとかその他の話とか。

HiveServerを使用してnode.jsからHiveQLを実行する

HiveServerはThriftプロトコルをしゃべるので、おなじくThriftで接続すると任意のクエリを発行できたりして大変便利。ということで node.js からもやった。以前からやってる内容の続き。

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

できたできた!