MapReduceアルゴリズムデザイン #hadoopreading

11,859 views
11,668 views

Published on

0 Comments
12 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,859
On SlideShare
0
From Embeds
0
Number of Embeds
3,824
Actions
Shares
0
Downloads
76
Comments
0
Likes
12
Embeds 0
No embeds

No notes for slide

MapReduceアルゴリズムデザイン #hadoopreading

  1. 1. MapReduceアルゴリズムデザイン Data-Intensive Text Processing with MapReduce 第3章 #hadoopreading @nokuno
  2. 2. 自己紹介 2  Twitter: @nokuno  はてな:id:nokuno  自然言語処理勉強会を主催(第2回は9/25開催)  PRML/R/TokyoWebmining/Python/Hadoopなど 2002~2006:コミケで同人ゲーム売ってた 2007~2008:未踏でSocial IMEの開発 2009~現在:Web業界勤務(←今ここ)
  3. 3. 本発表の元ネタ 3  Data-Intensive Text Processing with MapReduce  大規模テキスト処理の教科書  Hadoopに限らずMapReduceの使い方を紹介  PDF:http://www.umiacs.umd.edu/~jimmylin/book.html  特に第3章が面白かったので紹介します  MapReduceの「デザインパターン」を提供します 大規模データとクラウドは実世界の問題を解決するのだ> Jimmy Lin (@lintool)
  4. 4. 前提知識:MapReduce 4  プログラマが書く必要があるのは2つの関数: map (k, v) → <k’, v’>* reduce (k’, v’) → <k’, v’>*  同じキーの値は同じReducerで処理される  カスタマイズ可能な関数 partition (k’, number of partitions) → partition for k’  Reduceで並列処理するための分割を決定 combine (k’, v’) → <k’, v’>*  Shuffleフェーズのトラフィックを削減するための最適化
  5. 5. 前提知識:MapReduce 5 k1 v1 k2 v2 k3 v3 k4 v4 k5 v5 k6 v6 map map map map a 1 b 2 c 3 c 6 a 5 c 2 b 7 c 8 Shuffle and Sort: aggregate values by keys a 1 5 b 2 7 c 2 3 6 8 reduce reduce reduce r1 s1 r2 s2 r3 s3
  6. 6. サマリー 6 以下のテクニックを組み合わせて、 中間データを削減しつつ、目的のアウトプットを得る  中間データの形式を工夫する  Map/Reduce内の副作用を積極的に利用する  比較関数や分割関数のカスタマイズを活用する  複雑な集計ではキーの結合方法を工夫する
  7. 7. こんな話題を扱います 7  ローカルで集計する  In-mapper combiningパターン  共起データを集計する  Pairsパターン  Stripesパターン  セカンダリソートをする  value-to-key conversionパターン
  8. 8. 問題設定:ワードカウント 8  単語の使用回数(頻度)を集計  言語処理の最も基本的なタスク  日本語では形態素解析が必要  2つの実装  単純な実装+Combiner  In-mapper combineパターン
  9. 9. 擬似コード:WordCount 9 ※CombinerはReducerと同じ
  10. 10. 擬似コード:In-mapper combining 10 1つの文書内の重複する単語を集計してから出力 ※ReducerはWordCountと同じ
  11. 11. 擬似コード:In-mapper combining(改良版) 11 1つのMapper内で処理する全文書内の単語を集計 ※ReducerはWordCountと同じ。Combinerは不要
  12. 12. 結論:In-mapper combineパターン 12 Hadoop Combinerは使うな、自前でMap内集計せよ  理由  Combinerと違って自分でコントロールできる  Combiner特有のオーバーヘッドがない  入出力の型を同じにしなくて良い  注意点  Mapperが状態を持つのでバグに気を付ける  メモリ内で集計するためメモリ不足の危険性  対策:メモリ使用量が一定に達したら出力・クリアする
  13. 13. 共起データを集計する 13  ローカルで集計する  In-mapper combiningパターン  共起データを集計する  Pairsパターン  Stripesパターン  セカンダリソートをする  value-to-key conversionパターン
  14. 14. 問題設定:共起頻度の集計 14  2つの単語の共起頻度を集計する  単語の語彙数(種類数)をNとする  共起頻度行列のサイズはN×Nになってしまう  メモリ使用量がO(N^2)  単語に限らず組み合わせを集計することは多い  「この商品を買っている人はこの商品も買っています」  このページにアクセスした男性ユーザの数
  15. 15. 例:スライド窓 15 Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, `and what is the use of a book,' thought Alice `without pictures or conversation?' (was, beginning), (was, to), (was, get), (was, very)
  16. 16. 例:スライド窓 16 Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, `and what is the use of a book,' thought Alice `without pictures or conversation?' (beginning, to), (beginning, get), (beginning, very), (beginning, tired)
  17. 17. 例:スライド窓 17 Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, `and what is the use of a book,' thought Alice `without pictures or conversation?' (to, get), (to, very), (to, tired), (to, of)
  18. 18. 擬似コード:Pairsパターン 18
  19. 19. 考察:Pairsパターン 19  単語のペアをkey, カウントをvalueとしてMapReduce  中間データ形式: (a, b) → count  長所  実装が容易、分かりやすい  短所  Shuffleフェーズの中間データが膨大
  20. 20. 擬似コード:Stripesパターン 20
  21. 21. 解説:Stripesパターン  左側が同じペアをグループ化 (a, b) → 1 (a, c) → 2 (a, d) → 5 a → { b: 1, c: 2, d: 5, e: 3, f: 2 } (a, e) → 3 (a, f) → 2  中間データ: a → { b: countb, c: countc, d: countd … }  Reducerは要素ごとに連想配列を合計 a → { b: 1, d: 5, e: 3 } + a → { b: 1, c: 2, d: 2, f: 2 } a → { b: 2, c: 2, d: 7, e: 3, f: 2 }
  22. 22. 考察:Stripesパターン 22  長所  Suffleフェーズの中間データ数が激減  Combinerも有効に使える  短所  実装がやや難しい  メモリ使用量の問題から語彙数に制限がある
  23. 23. StripesがPairより6倍高速!
  24. 24. ちゃんとスケールすることの確認 24
  25. 25. おまけ:共起頻度の集計の高速化手法 25  頻度によるカットオフ  高頻度のペアが欲しいことが多い  しきい値を決めてそれ以上のデータのみ出力  Combinerでカットオフしないように注意  単語のID化  語彙リストを配布してテキストからバイナリに変換  中間データを減らすことができる  Googleの言語モデル論文[T.Brantsら,2007]でも言及  HadoopならVIntWritable(可変長整数)が有効
  26. 26. セカンダリソートをする 26  ローカルで集計する  In-mapper combiningパターン  共起データを集計する  Pairsパターン  Stripesパターン  セカンダリソートをする  value-to-key conversionパターン
  27. 27. セカンダリソート 27 keyだけじゃなくvalueでもソートしたい!  Shuffleフェーズではkeyでソートしてくれる  keyでグループ化した後に、valueでソートもしたい  GoogleのMRはbuilt-inでセカンダリソートを実装  Hadoopでは…?
  28. 28. 問題設定:センサーデータ処理 28  センサーデータの集計を行う  データは(時刻、センサー番号、値)の3つ組  センサーの種類でデータをグループ化したい  かつ、値を時系列順にソートしたい
  29. 29. 実装1: Reducer内ソート 29  単純にセンサ番号をkeyとしてMapReduce  中間データ形式:  Reducerのメモリ内で時刻をみてソート  センサ1つあたりのデータ量<搭載メモリ量
  30. 30. 実装2:value-to-key conversionパターン 30  ソートしたいvalue(時刻)をkeyに含めてしまう  中間データ形式:
  31. 31. 考察:value-to-key conversionパターン 31  1回のMapReduceでセカンダリソート可能  比較関数のカスタマイズが必要  まずkeyを優先して比較  keyが同じ場合のみvalueで比較  同じkeyのデータが同じReducerに行くように細工  valueを無視してkeyのhashのみを使う  Reducerでkeyごとに処理するには状態を保存する  現在処理しているkeyを状態として保持
  32. 32. まとめ 32  MapReduceのデザインパターンを紹介した  In-mapper combining  Pairs and Stripes  value-to-key conversion  これらは以下のテクニックの組み合わせ  中間データの形式を工夫する  Map/Reduce内の副作用を積極的に利用する  比較関数や分割関数のカスタマイズを活用する  複雑な集計ではキーの結合方法を工夫する
  33. 33. 33 ご清聴ありがとうございました Presentation by
  34. 34. 擬似コード:平均値の算出 34
  35. 35. 擬似コード:平均値の算出+Combiner 35
  36. 36. 擬似コード:平均値の算出+Map内集計 36 Reducerは前ページと同じ

×