Hadoop ソースコードリーディング第9回に行ってきたよ

ものすごい遅ればせながら。(自分用のメモですが)

Hadoop ソースコードリーディング9回

 

■NHN JapanにおけるHive実行環境の構築

http://www.slideshare.net/tagomoris/hive-tools-in-nhn-japan-hadoopreading

 

・Hiveの使用目的:アクセスログの集計

解析はやってない

ライブドアが提供しているサービスのUUやPVを見てる

特定のパスに対してどれだけアクセスがあったか

どの検索エンジンできたか

サーチエンジンbotどれだけいるか 等

 

・集計処理概要

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のパフォーマンスチューニングってあんまりない。。。

あるとすればパーティションを切るくらいか

 

・どこを読んだか

オプティマイザ周り

HIVコンパイラ

 

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サーバー

認証機能が認証しない等々