Hiveの話をする勉強会やらない? そこでしゃべらない? というお誘いを受け、それがそのままHadoopソースコードリーディングで開催という流れになったので、いってきた。
Hadoopソースコードリーディング 第9回- Eventbrite
結論から言うとたいへん楽しかった。Hive自体について突き抜けて深くさわってる @wyukawa さんと @tamtam180 さんの話が、内容も深いやらウケをとるやらで、きいい、くやしいい、という感じ。まあでもHiveクエリの最適化は構造知ってもあんまり意味なさそうだし、Hive 0.8 以降を使うことも当分なさそうだから役に立たない話だったな(酷い)。いや、あそこは役に立たない領域だから当面近付かないでおこう、という判断材料になるきわめて貴重な情報でした。
しゃべってきた
で、自分のしゃべった内容はこちら。
Hiveって基本のコンポーネントだけだとやっぱり運用するのは厳しくて、じゃあウチではどんなツール作って使ってるの、という話でした。みんな似たようなものを作ってそうですが、ウチの強みはコードが公開されていることです(キリッ
簡単に補足すると、クエリの生成機能は tagomoris/Net-Hadoop-Hive-QueryBuilder · GitHub にあるPerlのライブラリと、そいつに食わせるための情報を作るUI部分(ここはまだ公開してない)の合わせ技で実現しています。
まず最初にWebアプリケーション部分で入力されたフォームの情報から以下のようなS式*1を生成して
(query (select (field yyyymmdd) (map_get (field agentdata) (string "category")) (count *)) (from (table access_log)) (where (and (= (field service) (string "blog")) (or (= (field yyyymmdd) (string "20120331")) (= (field yyyymmdd) (string "20120401")) (= (map_get (field agentdata) (string "category")) (string "smartphone"))))) (aggregate (group (field yyyymmdd) (map_get (field agentdata) (string "category"))) (order (field yyyymmdd) (desc (count *))) (limit 30)))
これを Net::Hadoop::Hive::QueryBuilder->new->dump($stree) みたいにして食わせると、以下のようなHiveQLのクエリが出てきます。
SELECT yyyymmdd, agentdata['category'] AS f1, COUNT(*) AS f2 FROM access_log WHERE (service = 'blog') AND ((yyyymmdd = '20120331') OR (yyyymmdd = '20120401') OR (agentdata['category'] = 'smartphone')) GROUP BY yyyymmdd, agentdata['category'] ORDER BY yyyymmdd, f2 DESC LIMIT 30
元のS式のデータは @wyukawa さんの話で出てきたHiveQLをparseしたASTの表現にそっくりですねえ。まあそうだろうな、と思います。
S式生成の部分は手元環境のテーブル定義やアクセスログ集計の頻出パターンに深く結び付いているため、そのまま公開しても誰の役にも立たんだろう、と思って公開していません。またShibUIというツール全体についても、HRForecastとの連携が前提になっているなど、そのまま公開してもなーという事情に満ち溢れています。
HiveQL生成機能の部分だけ切り出して公開するのはやりようによっては価値があるかなあ、という気はしますが、テーブル定義や頻出パターンを設定として記述してもらう必要があるため、結局どれだけの人が使いそうか次第だしなあ。うーん。
使うから公開しろ! という人はわっふるわっふるとコメントしてください。
*1:もちろん改行はインデントは見た目のために入れたもので、実際には必要ありません。あってもいいですが。