K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ...
Transcript of K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ...
K-means w/ Hadoop ~運用パート~
2013/1/28 田浦研究室 M1 中谷 翔
1 2013/1/28 中谷 翔 @田浦先生講義
Outline
• Hadoop の基本
• 実験結果
• Hadoop 愛憎
2 2013/1/28 中谷 翔 @田浦先生講義
基礎の基礎 by 田浦先生スライド
• P.8 をサラリと
• Map関数, Reduce関数を登録すれば 勝手に分散処理
3 2013/1/28 中谷 翔 @田浦先生講義
Hadoop の Goodなところ
• 慣れればそこそこ楽にスケーラビリティ出せる • Map処理, Reduce処理の並列計算が システムに実装されている – ユーザは「どうやって処理をする?」を気にせず 「どんな処理をする」だけ気にすればOK
• HDFS が結構 Good – 自動的にデータをブロック分割&分散してくれる – レプリケーションによる冗長化
• 巨大データのバッチ処理に向いてる – 一回処理を書いちゃえば,あとはデータ変えて 同じ処理を定期的に
4 2013/1/28 中谷 翔 @田浦先生講義
Hadoop の Badなところ
• やりたい処理を Map/Reduce という 型にはめるのがいつでも楽とは限らない –今回の K-means もさほど直感的ではない(主観)
• ノード内の性能がそんなに出ないらしい – Java だから? (小学生並みの感想)
• アジャイルにコードを変更/デプロイが面倒 – Java だから (真面目)
– Hive/Pig (SQL的なもの), Hadoop-Streaming など使えば楽にできるというお話
5 2013/1/28 中谷 翔 @田浦先生講義
実は: Iterativeな処理も簡単 • Map/Reduceを繰り返す(今回のような)処理も簡単 • $ hadoop jar kmeans.jar KmeansDriver points40.txt
– KmeansDriver.run() が呼び出される
• KmeansDriver.run() の概要
6 2013/1/28 中谷 翔 @田浦先生講義
public static void run() { while ( !isConvergent() ) { // 収束するまで iteration // Mapper/Reducer の登録 config.setMapperClass(KmeansMapper.class); config.setReducerClass(KmeansReducer.class); // Mapper/Reducer の起動 JobClient.runJob(config); } }
Outline
• Hadoop の基本
• 実験結果
• Hadoop 愛憎
7 2013/1/28 中谷 翔 @田浦先生講義
マシン環境
• hosei[[000-022]] を使用
– hosei000: マスタ (NameNode)
– hosei[[001-022]]: スレーブ (DataNode)
• CPU
– 2.4GHz, “理想的” なGFLOPS: 2.4GFLOPS / node
– ノード内並列,SIMD計算を行なっていないため
• メモリ
– 24GB
8 2013/1/28 中谷 翔 @田浦先生講義
実験設定
• データセットは points40.txt (23GB, max)
• N (点の数) = 1,073,741,824
• 試したK (クラスタ数)
– 180 (= N^{1/4}) , 120 (MDL最小) , 60 (適当)
• スレーブ数 (=並列度)
– 1, 8, 16, 21(max)
9 2013/1/28 中谷 翔 @田浦先生講義
実験結果: 台数効果
10 2013/1/28 中谷 翔 @田浦先生講義
0.0
0.5
1.0
1.5
2.0
2.5
3.0
3.5
4.0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
GFL
OP
S
# Nodes
K-means Scalability
K=180
K=120 (best)
K=60
実験結果: 効率
11 2013/1/28 中谷 翔 @田浦先生講義
0.00
0.02
0.04
0.06
0.08
0.10
0.12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Effi
cie
ncy
(0
.0-1
.0)
# Nodes
K-means Efficiency ( = GFLOPS / Ideal GFLOPS)
K=180
K=120 (best)
K=60
実験結果: 考察
12 2013/1/28 中谷 翔 @田浦先生講義
• スケーラビリティは出ている
• ノード数が1の時でも効率10%弱 – HDFSをローカルディスクにとっているので, ディスクI/Oで大分落ちた? • K=180, p=16: メモリ上->3.04GFLOPS, ディスク上->2.82GFLOPS
–まあよく分かってない
• Kが小さいほど効率悪い –田浦先生による解説があるかもしれない
• (考えてない)
Outline
• Hadoop の基本
• 実験結果
• Hadoop 愛憎
13 2013/1/28 中谷 翔 @田浦先生講義
お前のこと,好きだよ
• 慣れてしまえば ぼけ~っとしててもスケール
–スケジューリング,データ分散を考えないで 良いのは神
• Webインターフェイスがかなりまとも
–ジョブの実行状態とかブラウザで見れると 精神の安定につながる
14 2013/1/28 中谷 翔 @田浦先生講義
↑ お前
お前が憎い
• エラーログからエラーの 原因・対策がわからない – java.lang.OutOfMemoryError: Java heap space – mapred-site.xml にて io.sort.mb を調整
(reducerに行く前のソートで使うメモリサイズ)
• まともに実験回せるようになるまで 3 [日・中谷] くらいの工数が掛かった – データノードの立ち上がり,HDFSの状態など, ステートが結構多いのが原因だったような
• コードちょっと変えて~jar作って~hoseiに置きに 行って~hadoop job し直して~が本当に面倒
15 2013/1/28 中谷 翔 @田浦先生講義
↑ お前
バッドノウハウ集 (夏さんとのやりとりから)
16 2013/1/28 中谷 翔 @田浦先生講義
(Prob a) /tmp にHDFSを作ると,メモリ容量を超えて,*訳の分からない* エラー(試行によって様々)を出してmapred中に止まる (Solv a) points40.txt が23GBあって,hosei各ノードのメモリサイズが24GBなので,割としょうがない. core-site.xml に以下の記述をし,HDFSをローカルディスクに置く. <property> <name>hadoop.tmp.dir</name> <!-- <value>/tmp/hadoop-${user.name}</value> --> <value>/data/local2/${user.name}/hadoop-{user.name}</value> </property>
バッドノウハウ集 (夏さんとのやりとりから)
17 2013/1/28 中谷 翔 @田浦先生講義
(Prob b) java.lang.OutOfMemoryError: Java heap space というエラーが出て,mapperの途中で止まる (Solv b) Mapしたvalueをソートするときのbufferサイズが大きすぎるとこうなるっぽい.デフォルト100MBだが,30MBにする. mapred-site.xml にて. <property> <name>io.sort.mb</name> <value>30</value> </property>
バッドノウハウ集 (夏さんとのやりとりから)
18 2013/1/28 中谷 翔 @田浦先生講義
(Prob c) Mapper から reducer に移行しないことがある. (Solv c) 詳しい原因は分からないが,mapred-site.xmlで次のようにすると直った. <property> <name>mapred.reduce.tasks</name> <value>max(slave数, 3)</value> </property>
バッドノウハウ集 (夏さんとのやりとりから)
19 2013/1/28 中谷 翔 @田浦先生講義
(Prob d) HDFSの初期化 ($ hadoop namenode -format) に失敗する時がある (Solv d) HDFSのディレクトリをフォーマット前に毎回削除すると安全.stop-all.sh に,こんな感じのことを書き加えた. for i in `seq 0 21` ; do node=hosei$(printf "%03d" $i) ssh $node "jps |grep -v Jps |awk '{print ¥$1}' |xargs kill && hostname" # hadoopに関するプロセス皆殺し ssh $node "rm -rf /tmp/hadoop-nakatani /data/local2/nakatani/hadoop-nakatani && hostname" # HDFSに使うディレクトリ削除 done
運用感想
• 流行りの(?)システム触れて良かった
• 何も考えずにスケールするのは素晴らしい
• でも運用は簡単ではない
• 特にコード変更時のオペレーションコストの 大きさは気になった – Hive/Pig もいずれは触りたい
• コード10行くらいしか書かずに済んで楽でした – コーディング含めてたらダークサイド堕ち確定
20 2013/1/28 中谷 翔 @田浦先生講義