アドホックにHiveを実行する基盤としてshibを使っている

Hiveでデータ集計してKPIを定期的にレポーティングしているんですが、それとは別にアドホックにHiveを実行するということはよくありますよね。

例えば企画の人が何かイベントしたのでその効果を知りたいとかですね。

定期的に見たいKPIだったらそれはそれでちゃんと実装してジョブ管理ツールに登録して毎日実行するようにするわけですが、そうでない一時期なケースの話です。

今まではずっと僕のようなデータエンジニアが要件を聞いてHiveQL書いて実行してその結果をメールに添付して返すとかやってたわけです。や、今でもやってますけどね。

で、まあ、そういうアドホックなデータ抽出依頼が増えてきてて、あまりそれにばかり時間を使っているようだとシステムの改善とかそういうさほど緊急ではないけれども重要な仕事がなかなかできないという状況になってました。

そういう状況はよくないし、データ抽出依頼する側が自分でHiveQL書いて実行するのが効率的だと僕は思ってます。でもクエリ書ける人がいるのか?みたいな話もあるわけですが、まずは第一歩を踏み出すことが重要だと思ったのでshibを導入しました。

まだshibを使ってるのは数人だと思いますがなかなか好評です。エンジニアじゃないけどクエリも頑張って書くよ〜というスタンスの人にはマッチしているようです。

SQLが分かる人は自分でクエリをがしがし書いて実行しますね。なので時として一時テーブル作りたいというshibではできない要望も出てきます。難しいですね。

一方で非エンジニアの人がSQLを勉強するのはハードルが高いのでクエリを直接書くんじゃなくてGUIでぽちぽち選択して実行できるようなツールが求められますね。あとそもそも非エンジニアの人がSQLを勉強することが、費用対効果というか会社の全体最適の点で割に合うのかという話もあると思います。ここは難しいですね。僕は勉強する価値あると思いますけど。

GUIで実行という意味でBIツール導入の話もあったのですが、どのBIツールもHiveにつなぐ場合はJDBC/ODBCでしかもジョブの進行状況把握やキャンセルができないとのことでした。まあこれは予想通りなんですが、HiveのJDBC接続なんて不安定だしなあ。ともあれGUIで実行するのはまだ実現できてないです。

shibを選択したのは身近な人が作っていたというのもあるし、既存環境に既に実験的にインストールされていたというのもあります。shibのインストールは(インターネットからダウンロードできる環境なら)簡単です。git cloneしてconfig.jsいじってnpm installして終わりです。nodeやnpmを入れるの面倒な人はxbuild使えば良いと思います。てか僕は使いました。

shib以外の同様なHive実行ツールとしてはHue(というかBeeswax)がありますが、こちらはほとんど使ったことないので比較してどうこうは言えないですが、Hueはshibに比べるとすごく機能が多いですね。なのでhackしようという気は起きないかも。。。

ユーザ認証と権限管理をしたいという話もあったのですが、この機能はshibには無いのでApacheでリバースプロキシしてかつLDAP連携してshibに認証をかけた話 - wyukawa’s blogに書いたようなやり方で認証だけはやってます。

ちなみにshibはユーザ認証機能は無いのですが、ブラウザ単位で実行したHiveQLを覚えていますし、お気に入りのクエリを登録することもできます。これはWeb StorageのlocalStorageを用いて実現しています。

特定のHiveデータベースにはアクセスできないようにshibのクエリチェックの部分を改造すれば、簡単な権限管理も出来ると思いますが、今のところやる予定は無いです。

使い始めて最初は少しバグがあったり、でかいファイルをダウンロードできないとかありましたけど、issue登録して対応してもらったり、自分でパッチ書いたりして今では問題無く動作してます。OSS万歳。

なお、でかいファイルのダウンロードに関してはGoogle グループのやりとりを参考にしました。OSS万歳。

ああ、あと、このクローズドソース野郎!って言われないように自分で書いたパッチはpull requestして取り込んでもらいました。まあそうしないと本体がバージョンアップしたときに追随するのが面倒ですからね。OSS万歳。

ただし、ApacheでリバースプロキシしてかつLDAP連携してshibに認証をかけた話 - wyukawa’s blogに書いたような、本体に取り込んでもらうには独自要件過ぎるものは、ブランチ作って管理してます。feature-foreverとfeature-loggingというブランチをマージして使っています。

作業イメージは下記のような感じです。productionブランチでshibを起動して運用しています。upstreamが更新されたら随時取り込んでいく予定です。

git clone https://github.com/wyukawa/shib.git
git remote add upstream https://github.com/tagomoris/shib.git
git branch feature-forever origin/feature-forever
git branch feature-logging origin/feature-logging
git check -b production
git merge feature-forever
git merge feature-logging

運用上の話としては、shib経由で実行されるジョブはconfig.jsをいじって下記のように優先度をVERY_LOWにしています。

setup_queries: [
    "set mapred.job.priority=VERY_LOW",
    "add jar /path/to/jarfile/foo.jar",
    "create temporary function foofunc as 'package.of.udf.FooFunc'",
    "create temporary function barfunc as 'package.of.udf.BarFunc'"
  ],

これはshib経由で実行されるジョブは基本的にアドホックであり、それが原因で定期的に実行されるジョブが進まないのは困るからです。

またshibは過去に実行したクエリはsqliteに保存し、実行結果はファイルシステム上に保存します。実行結果が数GBになる可能性もありますし、そうなるとHDD容量が少ないとディスクがいっぱいになる危険性があるので定期的に削除する必要があります。

運用上少し困るのはエラーメッセージがわかりにくいことですね。例えばhiveserverにつながらないときは
Error: connect ECONNREFUSED
とか言われてあとはnode本体内?のスタックトレースがちょろっとでるぐらいです。これは時間があれば調べるかも。

まあ、そんな感じです。shib使う人が増えるといいですね。あとJavaScript強い人、クエリの補完が出来るようなクエリ英ディタ作ってくれないかな〜。イメージはH2 Databaseね。