36
MapReduceアルゴリズムデザイン Data-Intensive Text Processing with MapReduce 第3章 #hadoopreading @nokuno

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

Embed Size (px)

Citation preview

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

MapReduceアルゴリズムデザインData-Intensive Text Processing with MapReduce 第3章

#hadoopreading

@nokuno

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

Twitter: @nokuno

はてな:id:nokuno

自然言語処理勉強会を主催(第2回は9/25開催)

PRML/R/TokyoWebmining/Python/Hadoopなど

自己紹介 2

2002~2006:コミケで同人ゲーム売ってた2007~2008:未踏でSocial IMEの開発2009~現在:Web業界勤務(←今ここ)

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

Data-Intensive Text Processing with MapReduce

大規模テキスト処理の教科書

Hadoopに限らずMapReduceの使い方を紹介

PDF:http://www.umiacs.umd.edu/~jimmylin/book.html

特に第3章が面白かったので紹介します

MapReduceの「デザインパターン」を提供します

本発表の元ネタ 3

大規模データとクラウドは実世界の問題を解決するのだ>

Jimmy Lin (@lintool)

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

プログラマが書く必要があるのは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フェーズのトラフィックを削減するための最適化

前提知識:MapReduce 4

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

前提知識:MapReduce 5

mapmap map map

Shuffle and Sort: aggregate values by keys

reduce reduce reduce

k1 k2 k3 k4 k5 k6v1 v2 v3 v4 v5 v6

ba 1 2 c c3 6 a c5 2 b c7 8

a 1 5 b 2 7 c 2 3 6 8

r1 s1 r2 s2 r3 s3

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

中間データの形式を工夫する

Map/Reduce内の副作用を積極的に利用する

比較関数や分割関数のカスタマイズを活用する

複雑な集計ではキーの結合方法を工夫する

以下のテクニックを組み合わせて、

中間データを削減しつつ、目的のアウトプットを得る

サマリー 6

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

ローカルで集計する

In-mapper combiningパターン

共起データを集計する

Pairsパターン

Stripesパターン

セカンダリソートをする

value-to-key conversionパターン

こんな話題を扱います 7

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

単語の使用回数(頻度)を集計

言語処理の最も基本的なタスク

日本語では形態素解析が必要

2つの実装

単純な実装+Combiner

In-mapper combineパターン

問題設定:ワードカウント 8

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

擬似コード:WordCount 9

※CombinerはReducerと同じ

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

1つの文書内の重複する単語を集計してから出力

擬似コード:In-mapper combining 10

※ReducerはWordCountと同じ

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

1つのMapper内で処理する全文書内の単語を集計

擬似コード:In-mapper combining(改良版) 11

※ReducerはWordCountと同じ。Combinerは不要

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

理由

Combinerと違って自分でコントロールできる

Combiner特有のオーバーヘッドがない

入出力の型を同じにしなくて良い

注意点

Mapperが状態を持つのでバグに気を付ける

メモリ内で集計するためメモリ不足の危険性対策:メモリ使用量が一定に達したら出力・クリアする

Hadoop Combinerは使うな、自前でMap内集計せよ

結論:In-mapper combineパターン 12

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

ローカルで集計する

In-mapper combiningパターン

共起データを集計する

Pairsパターン

Stripesパターン

セカンダリソートをする

value-to-key conversionパターン

共起データを集計する 13

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

2つの単語の共起頻度を集計する

単語の語彙数(種類数)をNとする

共起頻度行列のサイズはN×Nになってしまう

メモリ使用量がO(N^2)

単語に限らず組み合わせを集計することは多い

「この商品を買っている人はこの商品も買っています」

このページにアクセスした男性ユーザの数

問題設定:共起頻度の集計 14

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

例:スライド窓 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)

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

例:スライド窓 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)

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

例:スライド窓 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)

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

擬似コード:Pairsパターン 18

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

単語のペアをkey, カウントをvalueとしてMapReduce

中間データ形式:

(a, b) → count

長所

実装が容易、分かりやすい

短所

Shuffleフェーズの中間データが膨大

考察:Pairsパターン 19

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

擬似コード:Stripesパターン 20

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

解説:Stripesパターン

左側が同じペアをグループ化

中間データ: a → { b: countb, c: countc, d: countd … }

Reducerは要素ごとに連想配列を合計

(a, b) → 1

(a, c) → 2

(a, d) → 5

(a, e) → 3

(a, f) → 2

a → { b: 1, c: 2, d: 5, e: 3, f: 2 }

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 }+

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

長所

Suffleフェーズの中間データ数が激減

Combinerも有効に使える

短所

実装がやや難しい

メモリ使用量の問題から語彙数に制限がある

考察:Stripesパターン 22

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

StripesがPairより6倍高速!

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

ちゃんとスケールすることの確認 24

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

頻度によるカットオフ

高頻度のペアが欲しいことが多い

しきい値を決めてそれ以上のデータのみ出力

Combinerでカットオフしないように注意

単語のID化

語彙リストを配布してテキストからバイナリに変換

中間データを減らすことができる

Googleの言語モデル論文[T.Brantsら,2007]でも言及

HadoopならVIntWritable(可変長整数)が有効

おまけ:共起頻度の集計の高速化手法 25

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

ローカルで集計する

In-mapper combiningパターン

共起データを集計する

Pairsパターン

Stripesパターン

セカンダリソートをする

value-to-key conversionパターン

セカンダリソートをする 26

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

Shuffleフェーズではkeyでソートしてくれる

keyでグループ化した後に、valueでソートもしたい

GoogleのMRはbuilt-inでセカンダリソートを実装

Hadoopでは…?

keyだけじゃなくvalueでもソートしたい!

セカンダリソート 27

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

センサーデータの集計を行う

データは(時刻、センサー番号、値)の3つ組

センサーの種類でデータをグループ化したい

かつ、値を時系列順にソートしたい

問題設定:センサーデータ処理 28

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

単純にセンサ番号をkeyとしてMapReduce

中間データ形式:

Reducerのメモリ内で時刻をみてソート

センサ1つあたりのデータ量<搭載メモリ量

実装1: Reducer内ソート 29

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

ソートしたいvalue(時刻)をkeyに含めてしまう

中間データ形式:

実装2:value-to-key conversionパターン 30

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

1回のMapReduceでセカンダリソート可能

比較関数のカスタマイズが必要

まずkeyを優先して比較

keyが同じ場合のみvalueで比較

同じkeyのデータが同じReducerに行くように細工

valueを無視してkeyのhashのみを使う

Reducerでkeyごとに処理するには状態を保存する

現在処理しているkeyを状態として保持

考察:value-to-key conversionパターン 31

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

MapReduceのデザインパターンを紹介した

In-mapper combining

Pairs and Stripes

value-to-key conversion

これらは以下のテクニックの組み合わせ

中間データの形式を工夫する

Map/Reduce内の副作用を積極的に利用する

比較関数や分割関数のカスタマイズを活用する

複雑な集計ではキーの結合方法を工夫する

まとめ 32

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

ご清聴ありがとうございました

33

Presentation by

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

擬似コード:平均値の算出 34

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

擬似コード:平均値の算出+Combiner 35

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

擬似コード:平均値の算出+Map内集計 36

Reducerは前ページと同じ