Hadoop ソースコードリーディング第9回に行ってきたよ
ものすごい遅ればせながら。(自分用のメモですが)
Hadoop ソースコードリーディング9回
■NHN JapanにおけるHive実行環境の構築
http://www.slideshare.net/tagomoris/hive-tools-in-nhn-japan-hadoopreading
・Hiveの使用目的:アクセスログの集計
解析はやってない
ライブドアが提供しているサービスのUUやPVを見てる
特定のパスに対してどれだけアクセスがあったか
どの検索エンジンできたか
・集計処理概要
fluentd→(ログ)→Hadoopクラスタ←(HTTPでHiveQLを投げる)←Shib(Hive webクライアント)←(GUIクエリ生成)←ShibUI(Query Management System)
ログはfluentdを使ってHadoopクラスタへ
hadoopクラスタ内にHIVEサーバを立てる
THrift経由でshib(node JSで構成)、KVSはKTを使っている
ユーザはブラウザからアクセスして、ShibUIでクエリを生成、HTTP経由でHiveQLを投げる
・テーブルのパーティション
サービス、日付ごとに分けている
indexは使っていない、力技でなめてる
・map reduce を手で書くのは厳しい
・なんでHIVEなのか
SQLっぽい見た目だと安心して使われる傾向にある。。。
・プログラムっぽい形式だと、もったいないからメンテしながら使おうという心理がはたらきやすい
簡単なクエリをガンガン書いてガンガン捨てよう
・なぜクライアントを作ったのか
HUEを使いたくない
→なんでもできるから、なんでもさせたくない
クエリを書いてほしいけど、alterとかdropされると困る。。。。
・多ツールとの連携ができないとつらい
HTTPのAPIがほしい
何か機能がほしくなったときに自分の手で何とかできるものが望ましい
・Shib
HIVEのクライアントとして動くWEBアプリ
selectのみ発行
発行されたクエリを保存
クエリをbodyにつっこんでHTTPリクエストを送ると実行される
hadoopに入って実行しなくて済む
shibはgithubに公開している
・ShibUI
社内用ツール
スケジュールのクエリを流して、結果をグラフにプロット
どのクエリの結果をだれが参照したかを記録できるようになってる
・HRforcast
社内用ツール
グラフ作成ツール
HTTPリクエストを投げるとグラフ作成
・クエリビルダー
開発以外の人がクエリ核のつらい
ドロップダウン式の条件でクエリ自動生成
簡単な集計はツールで、複雑なのは別途相談する運用
・裏で走ってるmap reduceをころしたい
Huahin Manager
HTTP経由でjobtrackerにアクセスできるようにするつもり
・node 0.4だと動くが0.6だと動かない>shib
商品マスターとかjoinするようなものは外部で突き合わせるようにしている
■Hiveソースコードリーディング
http://www.slideshare.net/wyukawa/hive-sourcecodereading
・なんでソース読もうとしたのか
好奇心
最適化プロセスはどうやって採用されるのか
・HIVEのパフォーマンスチューニングってあんまりない。。。
あるとすればパーティションを切るくらいか
・どこを読んだか
オプティマイザ周り
Hive Anatomy
(http://www.slideshare.net/nzhang/hive-anatomy)
Internal Hive
(http://www.slideshare.net/recruitcojp/internal-hive)
この2つのスライドが参考になる
・中身が複雑。。。。
メソッドの長さが異常。。。。ディスプレイ画面に収まらない
オプティマイザのソースを読んでると気が狂うというチケットが。。
The Optimizer architecture of Hive is terrible.....
→patch welcome!!
explainをみてもチューニングどこをしていいかわからない
・optimizarのアルゴリズム
コストが最小のプランを選択する
コストとは、HiveQLを正規表現でマッチした文字列が一番短いものを選択
・パフォーマンスチューニング
Hiveのプロパティ
-hive.map.aggr
default true
map側で集約する inmapperconbining mapperでメモリにためて、いいタイミングでflushしてくれる
-hive.auto.covert.join
default false
joinに関するオプション
片方のテーブルサイズが小さい場合にうまい具合にjoinするよ
閾値 25M-30M
これより小さいとこのオプションが動く
これをやるとそこそこ高速化
-hive.exec.parallel
default false
自動で並列実行してくれる
1つのテーブルを参照して、3つのinsertをするときなどにパフォーマンス向上
パフォーマンスチューニングの選択肢はparallelとconvert.joinくらいしかない
データモデルやETLモデル、どうやって簡単にクエリを作るかを考えたほうがいい
■誰も得しないアンドキュメンテッドな機能の紹介
http://www.slideshare.net/tamrin69/hive-undocumented-feature
・HiveCLIコマンド
./hive --service cli
dfs :Hadoop DFSコマンドが使える
list :ADDしたjarの一覧が見れる
source :シェルのsourceと同じ
! :シェルの実行
show locks,msck:たたくな危険
・Hook機能
投げたクエリ
ユーザ
等々がとれる
基本的に単体テストに使うくらい
実際にフックしたことはない
・PeffLog
perfLogをオーバーライドすれば独自logger実装可能
・PDK
hive0.8~
UDFの追加を楽にする
PDKビルドの仕方
アノテーションの指定
@uDFTYPE
deteministic stateful
distinctLike
@Description
name
description
extended
自動でUDF登録できない!!
hive.aux.jars.pathに入っていればおk
HIVECLI起動時にHIVE_AUX_JARS_PATHを指定
HIVECLI起動時に自動でスクリプトを実行する方法ならある
・自分でHiveサーバーを作ってみた
JAVA200行程度
HTTP RESTサーバ
自動UDF登録
公開はしないとのこと....
・0.8で入った新機能はバグだらけなので使ってはいけない....
ドキュメント化されていないものにはそれなりの理由がある
HIVEサーバー
認証機能が認証しない等々