K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ...

20
K-means w/ Hadoop ~運用パート~ 2013/1/28 田浦研究室 M1 中谷 1 2013/1/28 中谷 @田浦先生講義

Transcript of K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ...

Page 1: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

K-means w/ Hadoop ~運用パート~

2013/1/28 田浦研究室 M1 中谷 翔

1 2013/1/28 中谷 翔 @田浦先生講義

Page 2: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

Outline

• Hadoop の基本

• 実験結果

• Hadoop 愛憎

2 2013/1/28 中谷 翔 @田浦先生講義

Page 3: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

基礎の基礎 by 田浦先生スライド

• P.8 をサラリと

• Map関数, Reduce関数を登録すれば 勝手に分散処理

3 2013/1/28 中谷 翔 @田浦先生講義

Page 4: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

Hadoop の Goodなところ

• 慣れればそこそこ楽にスケーラビリティ出せる • Map処理, Reduce処理の並列計算が システムに実装されている – ユーザは「どうやって処理をする?」を気にせず 「どんな処理をする」だけ気にすればOK

• HDFS が結構 Good – 自動的にデータをブロック分割&分散してくれる – レプリケーションによる冗長化

• 巨大データのバッチ処理に向いてる – 一回処理を書いちゃえば,あとはデータ変えて 同じ処理を定期的に

4 2013/1/28 中谷 翔 @田浦先生講義

Page 5: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

Hadoop の Badなところ

• やりたい処理を Map/Reduce という 型にはめるのがいつでも楽とは限らない –今回の K-means もさほど直感的ではない(主観)

• ノード内の性能がそんなに出ないらしい – Java だから? (小学生並みの感想)

• アジャイルにコードを変更/デプロイが面倒 – Java だから (真面目)

– Hive/Pig (SQL的なもの), Hadoop-Streaming など使えば楽にできるというお話

5 2013/1/28 中谷 翔 @田浦先生講義

Page 6: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

実は: 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); } }

Page 7: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

Outline

• Hadoop の基本

• 実験結果

• Hadoop 愛憎

7 2013/1/28 中谷 翔 @田浦先生講義

Page 8: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

マシン環境

• hosei[[000-022]] を使用

– hosei000: マスタ (NameNode)

– hosei[[001-022]]: スレーブ (DataNode)

• CPU

– 2.4GHz, “理想的” なGFLOPS: 2.4GFLOPS / node

– ノード内並列,SIMD計算を行なっていないため

• メモリ

– 24GB

8 2013/1/28 中谷 翔 @田浦先生講義

Page 9: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

実験設定

• データセットは 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 中谷 翔 @田浦先生講義

Page 10: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

実験結果: 台数効果

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

Page 11: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

実験結果: 効率

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

Page 12: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

実験結果: 考察

12 2013/1/28 中谷 翔 @田浦先生講義

• スケーラビリティは出ている

• ノード数が1の時でも効率10%弱 – HDFSをローカルディスクにとっているので, ディスクI/Oで大分落ちた? • K=180, p=16: メモリ上->3.04GFLOPS, ディスク上->2.82GFLOPS

–まあよく分かってない

• Kが小さいほど効率悪い –田浦先生による解説があるかもしれない

• (考えてない)

Page 13: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

Outline

• Hadoop の基本

• 実験結果

• Hadoop 愛憎

13 2013/1/28 中谷 翔 @田浦先生講義

Page 14: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

お前のこと,好きだよ

• 慣れてしまえば ぼけ~っとしててもスケール

–スケジューリング,データ分散を考えないで 良いのは神

• Webインターフェイスがかなりまとも

–ジョブの実行状態とかブラウザで見れると 精神の安定につながる

14 2013/1/28 中谷 翔 @田浦先生講義

↑ お前

Page 15: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

お前が憎い

• エラーログからエラーの 原因・対策がわからない – java.lang.OutOfMemoryError: Java heap space – mapred-site.xml にて io.sort.mb を調整

(reducerに行く前のソートで使うメモリサイズ)

• まともに実験回せるようになるまで 3 [日・中谷] くらいの工数が掛かった – データノードの立ち上がり,HDFSの状態など, ステートが結構多いのが原因だったような

• コードちょっと変えて~jar作って~hoseiに置きに 行って~hadoop job し直して~が本当に面倒

15 2013/1/28 中谷 翔 @田浦先生講義

↑ お前

Page 16: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

バッドノウハウ集 (夏さんとのやりとりから)

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>

Page 17: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

バッドノウハウ集 (夏さんとのやりとりから)

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>

Page 18: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

バッドノウハウ集 (夏さんとのやりとりから)

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>

Page 19: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

バッドノウハウ集 (夏さんとのやりとりから)

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

Page 20: K-means w/ Hadoop ~運用パート~ - 東京大学tau/lecture/...Hadoop の Goodなところ •慣れればそこそこ楽にスケーラビリティ出せる •Map処理, Reduce処理の並列計算が

運用感想

• 流行りの(?)システム触れて良かった

• 何も考えずにスケールするのは素晴らしい

• でも運用は簡単ではない

• 特にコード変更時のオペレーションコストの 大きさは気になった – Hive/Pig もいずれは触りたい

• コード10行くらいしか書かずに済んで楽でした – コーディング含めてたらダークサイド堕ち確定

20 2013/1/28 中谷 翔 @田浦先生講義