Upload
yoh-okuno
View
11.323
Download
0
Embed Size (px)
Citation preview
MapReduceアルゴリズムデザインData-Intensive Text Processing with MapReduce 第3章
#hadoopreading
@nokuno
Twitter: @nokuno
はてな:id:nokuno
自然言語処理勉強会を主催(第2回は9/25開催)
PRML/R/TokyoWebmining/Python/Hadoopなど
自己紹介 2
2002~2006:コミケで同人ゲーム売ってた2007~2008:未踏でSocial IMEの開発2009~現在:Web業界勤務(←今ここ)
Data-Intensive Text Processing with MapReduce
大規模テキスト処理の教科書
Hadoopに限らずMapReduceの使い方を紹介
PDF:http://www.umiacs.umd.edu/~jimmylin/book.html
特に第3章が面白かったので紹介します
MapReduceの「デザインパターン」を提供します
本発表の元ネタ 3
大規模データとクラウドは実世界の問題を解決するのだ>
Jimmy Lin (@lintool)
プログラマが書く必要があるのは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
前提知識: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
中間データの形式を工夫する
Map/Reduce内の副作用を積極的に利用する
比較関数や分割関数のカスタマイズを活用する
複雑な集計ではキーの結合方法を工夫する
以下のテクニックを組み合わせて、
中間データを削減しつつ、目的のアウトプットを得る
サマリー 6
ローカルで集計する
In-mapper combiningパターン
共起データを集計する
Pairsパターン
Stripesパターン
セカンダリソートをする
value-to-key conversionパターン
こんな話題を扱います 7
単語の使用回数(頻度)を集計
言語処理の最も基本的なタスク
日本語では形態素解析が必要
2つの実装
単純な実装+Combiner
In-mapper combineパターン
問題設定:ワードカウント 8
擬似コード:WordCount 9
※CombinerはReducerと同じ
1つの文書内の重複する単語を集計してから出力
擬似コード:In-mapper combining 10
※ReducerはWordCountと同じ
1つのMapper内で処理する全文書内の単語を集計
擬似コード:In-mapper combining(改良版) 11
※ReducerはWordCountと同じ。Combinerは不要
理由
Combinerと違って自分でコントロールできる
Combiner特有のオーバーヘッドがない
入出力の型を同じにしなくて良い
注意点
Mapperが状態を持つのでバグに気を付ける
メモリ内で集計するためメモリ不足の危険性対策:メモリ使用量が一定に達したら出力・クリアする
Hadoop Combinerは使うな、自前でMap内集計せよ
結論:In-mapper combineパターン 12
ローカルで集計する
In-mapper combiningパターン
共起データを集計する
Pairsパターン
Stripesパターン
セカンダリソートをする
value-to-key conversionパターン
共起データを集計する 13
2つの単語の共起頻度を集計する
単語の語彙数(種類数)をNとする
共起頻度行列のサイズはN×Nになってしまう
メモリ使用量がO(N^2)
単語に限らず組み合わせを集計することは多い
「この商品を買っている人はこの商品も買っています」
このページにアクセスした男性ユーザの数
問題設定:共起頻度の集計 14
例:スライド窓 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
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
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)
擬似コード:Pairsパターン 18
単語のペアをkey, カウントをvalueとしてMapReduce
中間データ形式:
(a, b) → count
長所
実装が容易、分かりやすい
短所
Shuffleフェーズの中間データが膨大
考察:Pairsパターン 19
擬似コード:Stripesパターン 20
解説: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 }+
長所
Suffleフェーズの中間データ数が激減
Combinerも有効に使える
短所
実装がやや難しい
メモリ使用量の問題から語彙数に制限がある
考察:Stripesパターン 22
StripesがPairより6倍高速!
ちゃんとスケールすることの確認 24
頻度によるカットオフ
高頻度のペアが欲しいことが多い
しきい値を決めてそれ以上のデータのみ出力
Combinerでカットオフしないように注意
単語のID化
語彙リストを配布してテキストからバイナリに変換
中間データを減らすことができる
Googleの言語モデル論文[T.Brantsら,2007]でも言及
HadoopならVIntWritable(可変長整数)が有効
おまけ:共起頻度の集計の高速化手法 25
ローカルで集計する
In-mapper combiningパターン
共起データを集計する
Pairsパターン
Stripesパターン
セカンダリソートをする
value-to-key conversionパターン
セカンダリソートをする 26
Shuffleフェーズではkeyでソートしてくれる
keyでグループ化した後に、valueでソートもしたい
GoogleのMRはbuilt-inでセカンダリソートを実装
Hadoopでは…?
keyだけじゃなくvalueでもソートしたい!
セカンダリソート 27
センサーデータの集計を行う
データは(時刻、センサー番号、値)の3つ組
センサーの種類でデータをグループ化したい
かつ、値を時系列順にソートしたい
問題設定:センサーデータ処理 28
単純にセンサ番号をkeyとしてMapReduce
中間データ形式:
Reducerのメモリ内で時刻をみてソート
センサ1つあたりのデータ量<搭載メモリ量
実装1: Reducer内ソート 29
ソートしたいvalue(時刻)をkeyに含めてしまう
中間データ形式:
実装2:value-to-key conversionパターン 30
1回のMapReduceでセカンダリソート可能
比較関数のカスタマイズが必要
まずkeyを優先して比較
keyが同じ場合のみvalueで比較
同じkeyのデータが同じReducerに行くように細工
valueを無視してkeyのhashのみを使う
Reducerでkeyごとに処理するには状態を保存する
現在処理しているkeyを状態として保持
考察:value-to-key conversionパターン 31
MapReduceのデザインパターンを紹介した
In-mapper combining
Pairs and Stripes
value-to-key conversion
これらは以下のテクニックの組み合わせ
中間データの形式を工夫する
Map/Reduce内の副作用を積極的に利用する
比較関数や分割関数のカスタマイズを活用する
複雑な集計ではキーの結合方法を工夫する
まとめ 32
ご清聴ありがとうございました
33
Presentation by
擬似コード:平均値の算出 34
擬似コード:平均値の算出+Combiner 35
擬似コード:平均値の算出+Map内集計 36
Reducerは前ページと同じ