Date post: | 27-Jun-2015 |
Category: |
Technology |
Upload: | sho-shimauchi |
View: | 5,163 times |
Download: | 1 times |
Data-Intensive Text Processing with MapReduce
(ch1, ch2)
2010/09/23shiumachi
http://d.hatena.ne.jp/shiumachi/http://twitter.com/shiumachi
Agenda
● この勉強会について● 1章 イントロダクション● 2章 MapReduce基礎
● 2.1 関数型言語● 2.2 mapper と reducer
● 2.3 実行フレームワーク● 2.4 Partitioner と Combiner
● 2.5 分散ファイルシステム● 2.6 Hadoop クラスタアーキテクチャ
この勉強会について● Jimmy Lin, Chris Dyer 著の Data-Intensive Text
Processing with MapReduce を読む会です● 全3回ぐらいでやる予定● shiumachi, marqs が交代で各章の解説をします
Chapter 1. Introduction1章 イントロダクション
この本は?● MapReduceを用いて大量のテキストを処理するためのスケーラブルな方法についての本
● NLP(自然言語処理)、IR(情報検索)についてフォーカスしてる● が、グラフなんかも扱ったりする
● Hadoopをベースに扱ってはいるけどHadoop本ではない● オライリーのHadoop 本でも読んでな [3]
Big Dataの時代!● 我々のデータ蓄積能力は、データ処理能力を大幅に上回っている
● Big Data(数十TB以上)を扱うのは当たり前● そもそも現実世界は Big Data である
● だから現実世界のシステムはこれに立ち向かわなければならない
● Big Data を扱うのは技術がいる● 分散処理、アルゴリズム、etc...
世界の企業が扱うBig Data
● Googleは2008年時点で20PBをMapReduceで処理してた
● eBayは約10PB
● FaceBookは2010年時点で15PB [1]
なんで Big Dataを扱うの?● 「そこにデータがあるからだ」● たくさんのデータがあれば、よりよいアルゴリズムを使うことができる
● 現実世界の問題を解決しやすくできる
これで Why は説明した この本の残りは全て How について説明する
クラウドコンピューティング● かつて「ユーティリティコンピューティング」
と呼ばれていたもの [2]
● ユーティリティコンピューティングの基本コンセプトは、「Everything as a Service」
IaaS, PaaS, SaaS そして MapReduce
● IaaS とは、物理ハードウェアの抽象化である● PaaS, SaaS も同様の説明ができる● そして MapReduce プログラミングモデルも、大量データ処理を「どのように」処理するかという問題から「どんなデータを」処理するかという問題を分離するための強力な抽象化である
IaaS, MapReduce
IaaS
ハードウェア ネットワーク
ここで抽象化
MapReduce
計算ノード
ここで抽象化
計算ノード 計算ノード計算ノード
分散処理のマネージャ(リソース管理、ジョブ管理、障害管理、データ管理etc...)
MapReduceの基本コンセプト● スケール「アウト」、「アップ」じゃないよ● 障害発生は当たり前● データのある場所で処理● シーケンシャルにデータ処理し、ランダムアクセスを避ける
● Ap開発者からシステムレベルの詳細を隠蔽する● シームレスなスケーラビリティ
MapReduceは何が違うのか?● 世界中で広く採用された、最初の非ノイマン型モデル
● MapReduceは最初の並列処理モデルではない● PRAM, LogP, BSP, etc...
● MapReduceは最後の並列処理モデルではない● 欠点もいろいろある
だからこそこの本で MapReduce を学ぼうはじめよう、我々の冒険を!
Chapter 2. MapReduce Basics2章 MapReduce 基礎
分割して統治せよDivide and Conquer
● 巨大なデータを扱う問題に対処するには今のところこの方法しかない
● しかし以下の通り、実装は難しい● どうやって巨大な問題を小さなタスクに分割するのか?● どうすれば個々に性質の違うワーカーに対し効率よくタスクを割り当てることができるのか?
● どうすればワーカーが必要なデータを確実に取得できるようになるのか?
● どうすればワーカー間で同期をとることができるのか?● どうすればワーカーの出した結果を別のワーカーと共有できるのか?● ソフトウェア・ハードウェア障害が起きる中でどうすれば上の要件を満たすことができるのか?
この章で話すこと● MapReduceプログラミングモデルとその下にある分散ファイルシステムについて説明する
● 関数型プログラミング言語について(2.1)● mapper, reducer (2.2)● 実行フレームワークとジョブ (2.3)● partitioner, combiner (2.4)● 分散ファイルシステム (2.5)
● Hadoop クラスタ (2.6)
2.1 関数型言語
関数型言語● MapReduceのルーツは関数型言語である● 関数型言語の(ここでの)重要な特徴は2つ
● 高階関数● 関数の引数として関数をとれる
● map, reduce は2 つの有名な高階関数 map, fold からきている
図2.1 map関数とfold関数map(図のf)はデータの要素を個別に変換するための関数であり、fold(図のg)はその結果を集約処理するための関数であるとも言える
MapReduceの流れ
1.ユーザ定義の処理を、全ての入力レコードに適用する
2.別のユーザ定義の処理により、1.で出力された中間出力が集約される
これだけ。
MapReduceのコンセプト
1.MapReduceとはプログラミングモデルである2.MapReduceとは実行フレームワークである3.MapReduceとはプログラミングモデルと実行フレームワークのソフトウェア実装である• Google MapReduce(以下GMR), Hadoop 以外にもたくさんあるよ
• マルチコアCPU用、GPGPU用、CELL用などなど• この本では広く使われているHadoopを中心に扱う
2.2 mapper と reducer
MapReduceで扱うデータ構造● MapReduceにおける基本的なデータ構造はキーバリュー型
● といってもキーにもバリューにも型の制約はないので実質好きなデータを使える
● 複雑なデータ構造を使いたければ Protocol Buffers, Thrift, Avro なんかを使えばいい● 日本なら Message Pack とか
● キーバリューで表せるものはたくさんある● ウェブページ = [ ( url, html ) ]
● グラフ構造 = [ ( ノードid, [ 隣接したノードid ] ]
mapper と reducer
● それぞれ map, reduce を実行するもの● →入力 出力が以下の形になるよう定義する
map: (k1, v1) → [(k2, v2)]reduce: (k2, [v2] ) → [(k3, v3)]
● map と reduce の間の中間データに対し、分散group by の処理を行っている
図2.2 MapReduceの流れ(簡易版)完全版は後ほど登場
ここでは map → shuffle と sort → reduce という流れを把握すればいい
おなじみワードカウント● 説明は省略● 後の章でも出てくる
GMR と Hadoop の違い● GMRはセカンダリソートができるがHadoopはできない● キーでソートしたあとにバリューでソートできないということ( ※しかしHadoopでの手法はHadoop本にも書いてあるぐらいメジャーな方法だと思うのだ
……が ?[3] )
● GMRではreducer中にキーを変更できないがHadoopはできる
mapper, reducerの制約● 副作用を持つことができること
● mapタスク同士で共通のデータを持つことができる● 関数プログラミングでは不可能
● これにより最適化アルゴリズムを作ったり(Ch.3)、外部ファイルを利用してさらに高度な処理をできるようになる(4.4, 6.5)● 次章からよく出てくる
● 一方で、特に外部リソースを扱う際には競合が発生し、ボトルネックになりやすい
その他トピック● mapやreduceに恒等関数を使うと、ただソートしたいだけのときなどにも便利
● BigTable や Hbase などの疎かつ分散された多次元マップに対して入出力するのも便利
● 入力なし(あるいはほとんどなし)でMapReduce使う場合もある● piの計算とか
2.3 実行フレームワーク
ジョブと実行フレームワーク● ジョブ=mapper のコード + reducer のコード
( + combiner , partitioner ) + 設定パラメータ● Hadoopなどの実行フレームワークは、このジョブを各ノードに投げて計算させる
実行フレームワークの役割● スケジューリング
● 投機的実行により安定してジョブを完了できる● データ/コードコロケーション
● 基本はデータのあるノードで計算を実行する● しかし、それができない場合はデータが移動する
● 同期● reduce処理はmap処理が全て完了してから開始
● エラー・障害ハンドリング
2.4 Partitioner と Combiner
Partitioner
● map出力のキーを見て、複数のreducerに振り分ける
● 一番単純な振り分け方はレコードのハッシュをとってmodの結果を使うこと● Hadoop でいう HashPartitioner
● 上記のように、Partitionerによる振り分けは均一ではない● Hadoop ならサンプリングしてデータ量が均一になるようにする
Combiner
● map処理後の中間データに対し、あたかもreducerをかけるように処理する
● 要するに ミニreducer
● データ転送量を大幅に減らすことができる● しかし reducer と互換性がないことに注意
● 入力と出力の型は必ず同じでなければならない、すなわちmap出力の型を維持しなければならない
● Hadoopではさらに以下の制約がある– 何度でも(0回でも!)実行されうる
図2.4 MapReduceの流れ(完全版)図2.2 に combiner と partitioner を加えたもの。Hadoopの実装とは異なることに注意
2.5 分散ファイルシステム
大量データ処理におけるファイルシステム
● 「読んで処理して書く」という基本は同じ● HPCではNAS/SANを使用● ノード数多くなると、ノード間の通信がネックになる● 10GbEやInfinibandを使うと高い
● MapReduceでは分散ファイルシステム(DFS)を使う● 別に必須ではないが、DFS使わないとMRの恩恵はあまり得られない
DFS?● 別に新しいアイデアじゃない● データは64MBなどの大きめのブロックに分割し、複数にレプリケーションした上で異なるノードに分散配置
● −名前空間はマスタ が管理● Google File System(GFS) では GFS Master● Hadoop Distributed File System(HDFS) では
namenode
HDFSにおけるデータシーケンス● クライアントはまずネームノードに問い合わせ● データの場所を確認後、スレーブ(データノード)と直接通信
● 図2.5も参照のこと
図2.5 HDFS名前空間(だけ)はネームノードが管理クライアントはデータノードと直接データのやりとりをする
レプリケーションファクター● データをどれだけ冗長化するかを示すパラメータ
● Hadoopはデフォルト3
● ノードに障害が起きた場合は、別の生きているノードに残りの2つのデータブロックからコピーし、RFを一定に保つ
● 一方、ノードが復帰しコピーが4つになったら、不要な1ブロックを削除する
DFSの特徴● そこそこの数の大きなファイル(数GB〜)を扱う● バッチ指向、たくさん読んでたくさん書く
● 低レイテンシよりも持続的な帯域確保が重要● 非POSIX準拠● 不特定多数が扱えるほどの認証機構はない
● Hadoopは一応0.21でKerberosが入ったがExperimental
● コモディティサーバを使うこと前提なので障害→は当たり前 だから自己監視・修復が必須
DFSの弱点● CAPのC重視
● P(分割耐性)はDFSではどのみち無理● GFS,HDFSはA(可用性)よりC(一貫性)を取った
● マスタサーバはSPOF● ホットスタンバイのマスタを用意したりとか、対策はしっかりとっておこう
● データ通信をするわけじゃないのでボトルネックにはならない
2.6 Hadoop クラスタアーキテクチャ
図2.6 Hadoopクラスタでもこの図セカンダリネームノード(チェックポイントノード)がないので現実の構成としては不完全な気がする
Hadoop上でのジョブの流れジョブ実行開始(JobTracker)ジョブをTaskTrackerに配布
Mapタスク実行タスク数はユーザ指定パラメータだけでなく
ブロック数にも依存
Reduceタスク実行ユーザが任意のタスク数を指定可能
● mapやreduceでは外部データを持たせることも可能● 統計データとか辞書読ませたりできる
● 開始時と終了時にフックできるHadoop API が提供されている(Javaのみ)
参考文献
1. Facebook has the world's largest Hadoop cluster!, Facebook has the world's largest Hadoop cluster!, http://hadoopblog.blogspot.com/2010/05/facebook-has-worlds-largest-hadoop.html
2. ユーティリティコンピューティング, wikipedia, http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0
3.Hadoop, Tom White, オライリー・ジャパン, 2009
4.
Thank you !