Hiveのコードを読んでみた
今、仕事でバリバリHiveってのを使ってる。
Hiveってのは、HadoopをRDBMSみたく使えるようにしちまおうぜ、という、facebookさんが作った非常に素敵なフレームワーク。なんとSQLみたいな言語でMap/Reduceを実行出来る。
素敵なんだが、正直、中身をきちんと理解して使ってるわけではないので、何をどうしたらどうなる、と言う、勘所が全然分かってない。
しかもあんまり文献も無いし、詳しい人もあんまりいないし(Hadoopに詳しい人はいる)。ネットには結構情報はあるけどほとんど英語だし・・・まあ読みゃいいんだが。。。
英語よりはJavaのが分かるだろう、と思ってとりあえずソースコードをダウンロードしてきて、読み始めた。
■知りたいこと
・どうやってHiveQLを実行してんのか
・HiveQLのクエリをどうMap/Reduceにしてんのか
■使ったバージョン
・Hive 0.60.0
http://www.apache.org/dyn/closer.cgi/hive/
からダウンロードした。
■読む課程
とっかかりが分かんなくて苦労したが、そういやウチの環境では「Startserver.sh」とかで動かしてたっけかな?と思い、Hiveのサービスを起動するshellを探すと、あったあった。
/src/bin/ext/hiveserver.sh
ってファイル。
中身をのぞくと
echo “Starting Hive Thrift Server”
CLASS=org.apache.hadoop.hive.service.HiveServer
おぉ、クラスがバシッと指定されてるじゃないの。
ってことでHiveServer.javaを探す。
javaコマンド叩いてるからmain()があるはず、と思ったら、一番最後にあったあった。
main()はこんな感じ
public static void main(String[] args) {
try {
int port = 10000;
if (args.length >= 1) {
port = Integer.parseInt(args[0]);
}
TServerTransport serverTransport = new TServerSocket(port);
ThriftHiveProcessorFactory hfactory = new ThriftHiveProcessorFactory(null);
TThreadPoolServer.Options options = new TThreadPoolServer.Options();
TServer server = new TThreadPoolServer(hfactory, serverTransport,
new TTransportFactory(), new TTransportFactory(),
new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(), options);
HiveServerHandler.LOG.info(“Starting hive server on port ” + port);
server.serve();
} catch (Exception x) {
x.printStackTrace();
}
}
TServerTransport
TServerSocket
とか知らない。ググってみると、どうやらApache Thriftってのを使ってるらしい。
Apache Thriftって何よ?って言うと、これもfacebookさんが作ったフレームワークらしく、どうやらRPCをすげー簡単に出来るようにしてくれるものらしい。このへん↓に情報あり。
http://apribase.net/2010/05/12/thrift/
http://cydn.cybozu.co.jp/2007/06/thrift.html
http://www.slideshare.net/guestf259ae/thrift
javaで書いた関数をrubyで呼んだり、C++の関数をperlで呼んだり・・・みたいな事を実現するのに良いみたい。
文字列の処理はperlやrubyでやって、解析とか検索をjavaでマルチスレッドで・・・みたいな感じで使うのかな?
にしてもfacebook、すげえなー。
で、このmainメソッドでは、どうやらJavaで書いたServerを、受け口となるport決めて起動して、クエリを待ち受ける、って事をやってるみたいっすね。
HiveServerHandler.LOG.info(“Starting hive server on port ” + port);
server.serve();
どうやらサービスの中身は
HiveServerHandler
っぽい。掘ってみると、
おぉ、execute(String cmd)
ってメソッドがある。
org.apache.hadoop.hive.ql.Driver.run()
response = driver.run(cmd);
ってやってる。org.apache.hadoop.hive.ql.Driver を掘ると、ここにも
execute()
があるな。重要っぽいクラスは・・・
・HiveConf:設定情報を保持しているっぽい。きちんと追えば、どの設定をいじるとどう挙動に影響するか分かりそうだな。
・QueryPlan:HiveQLを元にMap/Reduceジョブを作って、ジョブの実行状態とかの情報を保持しているみたい。
・Query:クエリを元にKeyとValueのHashMapをつくりまくってる。
このあたりかな。このへん詳しく見てみたら色々分かりそう。
■分かったこと
・HiveConf
・QueryPlan
・Query
このあたりのクラスがポイントっぽい感じであること。まだ推測だが、
「HiveQLは、分解されてQueryに格納され、HiveConfに書いてある設定に基づいて、QueryPlanに計画として格納され、DriverはQueryPlanに基づいてジョブを実行する」って感じじゃなかろうか。
とりあえず、なんとなくどこ見れば何が分かるか、まではなんとなく掴めたw
■疲れた。今日はここまで。。。