Bangucs de guanxinqu

RSS

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

■疲れた。今日はここまで。。。