Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MapReduceの基礎

9,262 views

Published on

首都大学東京で2014年12月に開催された「分散処理実践セミナー Apache Spark による MapReduce の基礎」の講義部分のスライドです。Jimmy Lin, Large-Scale Data Processing with MapReduce. AAAI Tutorial, 2011. の抄訳なので、基本的にはオリジナルをご参照ください。

http://www.umiacs.umd.edu/~jimmylin/cloud-computing/AAAI-2011/AAAI2011-tutorial-slides.pptx

※Apache Spark の演習部分は別スライドで、この中には入っていません。

Published in: Engineering
  • Login to see the comments

MapReduceの基礎

  1. 1. Apache Spark による MapReduce の基 礎 分散処理実践セミナー 小町守 首都大学東京システムデザイン学部 情報通信システムコース 2014年12月12日(金) このスライドは Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States ライセンスによって公開されています。詳しくは http://creativecommons.org/licenses/by-nc-sa/3.0/ http://cl.sd.tmu.ac.jp/~komachi/ でスライドを公開します
  2. 2. 本セミナーに関して  スケーラブルな処理に焦点を当てます  MapReduce の「デザインパターン」を学びます  基本的なアイデアを話します  Hadoop プログラミングのチュートリアルではありません  GPGPU とも関係ありません  右の本の入門版(PDF が GitHub で無料 公開されています)です  Jimmy Lin, Large-Scale Data Processing with MapReduce. AAAI Tutorial, 2011 のスライドをベースにしています
  3. 3. どれくらいデータがある? 6.5 PB のユーザデー タ + 50 TB/日 (2009/5) の処理するデータ量=20 PB/日 (2008) 36 PB のユーザデータ + 500 TB/日 (2012) Wayback Machine: 3 PB + 100 TB/月 (2009/3) 12 TB/日 (2011) 640K あれば十分だよ !(ビル・ゲイツ)
  4. 4. データ量に上限はない! (Banko and Brill, ACL 2001) (Brants et al., EMNLP 2007) s/知識/データ/g; Google にいない我々はどうやったら こんな規模のデータを使うことができる?
  5. 5. 並列コンピューティングはたいへん! メッセージパッシング P1 P2 P3 P4 P5 共有メモリ P1 P2 P3 P4 P5 メモリ いろいろなプログラミングモデル いろいろなプログラミングのコンポーネント mutex、バリア、… master/slave、producer/consumer、ワークキュー、… 原理的な問題 スケジューリング、データ分散、同期、プロセ ス間通信、頑健性、フォールトトレランス、… 共有に関する問題 デッドロック、飢餓状態、 優先順位の逆転、… 食事する哲学者、居眠り床屋、… アーキテクチャの問題 SIMD、MIMD、… ネットワークの構造、帯域幅 UMA vs. NUMA、キャッシュコヒーレ ンス 現実: プログラマが平行性の管理の責任を負う。。。 (競合状態のデバッグに苦しむか、新しいアルゴリズムを考案するために時間を使うか) master slave producer consumer producer consumer ワーク キュー
  6. 6. 「ビッグデータ」の理想現実と現実  並列処理は難しい  データセンターのスケールだと特に。(データセンターをまたぐ ことすら)  故障が存在する  複数の相互に連携するサービスが存在する  現実は?  その場限りの対処ばかり。カスタマイズされたソースコード。  特化したライブラリを書いて、それを使ってプログラミング。  全てを明示的に管理するようプログラマが気をつけなければなら ない。。。
  7. 7. Source: Ricardo Guimarães Herrmann
  8. 8. Source: NY Times (6/14/2006) データセンターこそがコンピュ ータ 「世界にコンピュータは5台あれば足 りる」 (トーマス・J・ワトソン、IBM初代 社長)
  9. 9. 何が問題???  どのように抽象化するか、の問題  エンジニアからシステムレベルの詳細を隠蔽する  リソースの競合、ロック、などなど。。。  対象と手法を分離する  エンジニアは処理すべき計算を書くだけでよい  処理フレームワーク(ランタイム)が実際の処理を担当する データセンターこそがコンピ ュータ
  10. 10. 大規模データ処理の「哲学」  スケール「アウト」する。(スケール「アップ」ではなく )  マルチプロセッサ(SMP)と大規模共有メモリマシンの限界  データ中心の処理を行う  クラスタは限られた帯域しかない  データを順番に処理する。ランダムアクセスしない。  データのシークは高コスト。ディスクのスループットは常識的な 速度。  シームレスなスケーラビリティ
  11. 11. + 単純な分散プログラミングモデル 安いコモディティ化されたクラスタ = 誰でもできる大規模データ処理!
  12. 12. MapReduce の基礎 MapReduce の基礎 MapReduce のアルゴリズムデザイン MapReduce を超えて
  13. 13. 典型的な大規模データ処理  多数のレコードに対して反復する  それぞれに対してなにか抽出する  中間結果をシャッフルし、ソートする  中間結果を集約する  最終出力を生成する ポイント: これら2つの操作に対する 機能的な抽象化を提供する (Dean and Ghemawat, OSDI 2004)
  14. 14. g g g g g f f f f fMap Fold (Reduce) 関数型プログラミングの基本
  15. 15. MapReduce  プログラマは2つの関数を指定する。 map (k, v) → <k’, v’>* reduce (k’, v’) → <k’, v’>*  同じキーを持つ値は全て同じ reducer に送られる  処理フレームワークが残り全部やってくれる。
  16. 16. mapmap map map シャッフルとソート: キーで値を集約 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
  17. 17. MapReduce  プログラマは2つの関数を指定する。 map (k, v) → <k’, v’>* reduce (k’, v’) → <k’, v’>*  同じキーを持つ値は全て同じ reducer に送られる  処理フレームワークが残り全部やってくれる。 「残り全部」って何?
  18. 18. MapReduce の実行時の動作  スケジューリング  worker に map と reduce タスクを割り当てる  データの分配  プロセスをデータに移動する  処理の同期  中間結果を集め、シャッフルし、ソートする  エラー処理  worker の失敗を検出し、リスタートする  分散ファイルシステムの管理
  19. 19. MapReduce ホントのところ  プログラマは2つの関数を指定する。 map (k, v) → <k’, v’>* reduce (k’, v’) → <k’, v’>*  同じキーを持つ値は全て同じ reducer に送られる  処理フレームワークが残り全部やってくれる。  実際は、プログラマは他にもいくつか指定しなければなら ない。 partition (k’, 分割数) → k’ のパーティション  キーのハッシュが用いられることが多い e.g., hash(k’) mod n  キーの空間を並列 reduce 操作のために分割する combine (k’, v’) → <k’, v’>*  map フェーズのあとにインメモリで実行される mini-reducer  reduce のネットワーク通信の最適化に使われる
  20. 20. combinecombine combine combine ba 1 2 c 9 a c5 2 b c7 8 partition partition partition partition mapmap map map k1 k2 k3 k4 k5 k6v1 v2 v3 v4 v5 v6 ba 1 2 c c3 6 a c5 2 b c7 8 シャッフルとソート: キーによる値の集約 reduce reduce reduce a 1 5 b 2 7 c 2 9 8 r1 s1 r2 s2 r3 s3 c 2 3 6 8
  21. 21. MapReduce に関する補足2点  map と reduce のフェーズの間の障壁  事前に中間データをコピーするところから始められる  各 reducer にやってくるキーはソートされている  reducer をまたぐと順番には何の制約もない
  22. 22. MapReduce的 “Hello World”: 単語カウン ト
  23. 23. MapReduce という単語の多義性  プログラミングモデル  処理フレームワーク(ランタイム)  特定の実装 どれを意味するかは 文脈から明らかであることが多い。
  24. 24. MapReduce の実装  Google は C++ によるプロプライエタリな実装がある  Java と Python のバインディングがある  Hadoop は Java によるオープンソースの MapReduce 実 装  初期は Yahoo が開発を主導  現在は Apache オープンソースプロジェクト  ビッグデータ処理業界におけるデファクトスタンダード  ソフトウェアの「生態系」が急速に拡大  Spark は Scala による MapReduce 実装  UC Berkeley で開発されていたが、現在は Apache OSS  インメモリでの処理に特化し高速化  Scala と Python のバインディングがある 今回のセミナーでは Apache Spark を使用
  25. 25. split 0 split 1 split 2 split 3 split 4 worker worker worker worker worker Master User Program output file 0 output file 1 (1) submit (2) schedule map (2) schedule reduce (3) read (4) local write (5) remote read (6) write 入力 ファイル Map フェーズ 中間結果 (ローカルディスク) Reduce フェーズ 出力 ファイル Adapted from (Dean and Ghemawat, OSDI 2004)
  26. 26. データをどのように worker に移動するの? 計算ノード NAS SAN なにか問題がある???
  27. 27. 分散ファイルシステム  データを worker に移動するのではなく、worker をデータ に移動させる  クラスタのノードのローカルディスクにデータを保持  ローカルにデータを持っているノードで worker を開始  分散ファイルシステムで解決!  GFS (Google File System): Google の MapReduce  HDFS (Hadoop Distributed File System): Hadoop
  28. 28. GFS: 仮定  高価な(特注の)ハードウェアではなく、安価な(コモデ ィティ化された)ハードウェア  スケール「アップ」ではなくスケール「アウト」  ハードウェア故障の率が高い  安価なコモディティのハードウェアは常に壊れる  そこそこの数の巨大なファイル  数 GB のファイルは普通  ファイルは1回書き込むだけで、大部分は追記  同時に書き込み・追記されることも  ランダムアクセスではなく大規模なストリーム処理  レイテンシは低いがスループットは高い GFS slides adapted from material by (Ghemawat et al., SOSP 2003)
  29. 29. GFS: デザインのポリシー  ファイルをチャンクとして保存  固定長 (64MB)  複製することにより信頼性の確保  各チャンクは3台以上の chunkserver をまたいで複製される  アクセス制御には1つの master を置き、メタデータを保  単純な集中管理  データのキャッシュはしない  巨大なデータ集合をストリーム処理で読むなら、キャッシュして もあまり意味がない  API を単純化  問題のいくつかはクライアントに丸投げ(例: データのレイアウト )HDFS = GFS クローン(基本アイデアは同じ)
  30. 30. GFS から HDFS へ  用語の違い:  GFS master = Hadoop namenode  GFS chunkserver = Hadoop datanode  機能の違い:  HDFS におけるファイルの追記は比較的新しくサポートされた機 能  HDFS の性能は遅い(ことが多い) 以降のスライドでは Hadoop の用語を使用
  31. 31. Adapted from (Ghemawat et al., SOSP 2003) (file name, block id) (block id, block location) instructions to datanode datanode state (block id, byte range) block data HDFS namenode HDFS datanode Linux ファイルシステ ム … HDFS datanode Linux ファイルシステ ム … ファイル名前空間 /foo/bar block 3df2 アプリケーション HDFS クライアン ト HDFS のアーキテクチャ
  32. 32. Namenode の役割  ファイルシステムの名前空間を管理  ファイル/ディレクトリ構造、メタデータ、ファイルからブロック への対応表、アクセス権限などを保持  ファイル操作を管理  クライアントが datanode を介して読み書きするよう指示  namenode を通じたデータの移動はない  全体の整合性を管理  datanode と定期的に通信  ブロックの再複製と再バランシング  ガベージコレクション
  33. 33. HDFS の全体像 datanode デーモン Linux ファイルシステ ム … tasktracker slave ノード datanode デーモン Linux ファイルシステ ム … tasktracker slave ノード datanode デーモン Linux ファイルシステ ム … tasktracker slave ノード namenode namenode デーモン job submission node jobtracker
  34. 34. MapReduce のアルゴリズムデザイン MapReduce の基礎 MapReduce のアルゴリズムデザイン MapReduce を超えて
  35. 35. MapReduce の復習  プログラマは2つの関数を指定する。 map (k, v) → <k’, v’>* reduce (k’, v’) → <k’, v’>*  同じキーを持つ値は全て同じ reducer に送られる  以下も指定することがある。 partition (k’, 分割数) → k’ のパーティション  キーのハッシュが用いられることが多い e.g., hash(k’) mod n  キーの空間を並列 reduce 操作のために分割する combine (k’, v’) → <k’, v’>*  map フェーズのあとにインメモリで実行される mini-reducer  reduce のネットワーク通信の最適化に使われる  処理フレームワークが残り全部やってくれる。
  36. 36. combinecombine combine combine ba 1 2 c 9 a c5 2 b c7 8 partition partition partition partition mapmap map map k1 k2 k3 k4 k5 k6v1 v2 v3 v4 v5 v6 ba 1 2 c c3 6 a c5 2 b c7 8 シャッフルとソート: キーによる値の集約 reduce reduce reduce a 1 5 b 2 7 c 2 9 8 r1 s1 r2 s2 r3 s3 c 2 3 6 8
  37. 37. 「残り全部」  処理フレームワークが残り全部やってくれる↓  スケジューリング: worker に map と reduce タスクを割り当てる  データの分配: プロセスをデータに移動する  処理の同期: 中間結果を集め、シャッフルし、ソートする  エラー処理: worker の失敗を検出し、リスタートする  データと実行フローに関する制御は限られている  アルゴリズムは map, reduce, combine, partition で記述されなけれ ばならない  まだ説明していないこと:  どこで mapper と reducer が実行されるか  いつ mapper あるいは reducer が開始・終了するか  特定の mapper が処理する入力はどれか  特定の reducer が処理する中間結果はどれか
  38. 38. 同期するための MapReduce の仕組み  賢く構築されたデータ構造  部分的な結果をまとめる  中間キーの順番をソートする  reducer がキーを処理する順番をコントロールする  partitioner  どの reducer がどのキーを処理するかコントロールする  mapper と reducer に状態を保存する  複数のキーと値をまたいだ依存関係を捉える
  39. 39. 状態を保存する Mapper オブジェクト 設定 map 終了処理 状態 1タスク1オブジェクト Reducer オブジェクト 設定 reduce 終了処理 状態 キー=バリューの入力ペア に対し1回実行される 中間キー に対し1回実行される API 初期化フック API クリーンアップフック
  40. 40. スケーラブルな Hadoop アルゴリズム: 課題  オブジェクトを極力作らない  そもそも高コストな操作  ガベージコレクションされる  バッファリングしない  ヒープサイズが限られている  小さなデータに対しては役に立つが、スケールしない!
  41. 41. ローカル集約の重要性  スケールするシステムの理想的な特徴:  データが2倍になれば処理時間が2倍  リソースが2倍になれば処理時間は半分  どうしてそんなシステムが作れないの?  同期するために通信が必要  通信によって性能がガタ落ち  つまり、通信を避ける。  ローカルに集約することで中間データを reduce する  combiner が役に立つ
  42. 42. シャッフルとソート Mapper Reducer 他の mapper 他の reducer リングバッフ ァ (インメモリ ) データ (オンディスク) マージされたデータ (オンディスク) 中間ファイル (オンディスク) Combiner Combiner
  43. 43. 単語カウント: ベースライン combiner の意味は?
  44. 44. 単語カウント: バージョン1 combiner はまだ必要?
  45. 45. 単語カウント: バージョン2 combiner はまだ必要?
  46. 46. ローカル集約のデザインパターン  mapper の中で combine する  複数の map 呼び出しをまたいで状態を保存することで、combiner の機能を mapper に埋め込む  利点  速度  combiner より速い理由?  欠点  明示的にメモリ管理をしなければならない  処理の順番に依存するバグを埋め込んでしまうことも
  47. 47. Combiner の設計  combiner と reducer は同じメソッドシグネチャ(メソッ ド名、引数の数・順序・型、返り値の型、…)を共有  reducer が combiner の役割を果たすこともある  combiner は最適化のために用いられるオプション  アルゴリズムの正しさに影響を与えてはいけない  0回、1回、複数回走らせてもよい  例: 同じキーに関連付けられた全ての整数の平均を求める
  48. 48. 平均値の計算: バージョン1 reducer を combiner として使えない理由は?
  49. 49. 平均値の計算: バージョン2 どうしてこれは動かない?
  50. 50. 平均値の計算: バージョン3 直った?
  51. 51. 平均値の計算: バージョン4 combiner はまだ必要?
  52. 52. 数え上げと正規化  多くのアルゴリズムが相対頻度の計算に帰着される:  EMアルゴリズムだと、実際の頻度ではなく期待頻度  これを含む大きなクラスのアルゴリズムも、複雑さが異な るだけで直観は同じ  この直観から始めると…   ' )',(count ),(count )(count ),(count )|( B BA BA A BA ABf
  53. 53. アルゴリズムデザイン: 実例  テキスト集合の単語共起行列  M = N x N 行列(N = 語彙数)  Mij: i と j がある文脈で共起した数 (具体的にはたとえば文脈=文)  何に使うの?  意味的な距離を測るために分布類似度を用いる  意味的な距離は多くの言語処理タスクで役に立つ
  54. 54. MapReduce: 巨大な数え上げ問題  テキスト集合の単語共起行列 = 巨大数え上げ問題のひとつ  巨大な事象空間(語彙の数)  たくさんの観測(数え上げそのもの)  ゴール: 調べたい事象の統計量を保持する  基本的なアプローチ  Mapper が部分頻度を生成  Reducer が部分頻度を集約 効率的に部分頻度を集約するためにはどのようにすれば?
  55. 55. とりあえず: 「ペア」  各 mapper は文を引数に取る。  共起する単語ペアを全て生成する  全ペアに対し、emit (a, b) → count  reducer はペアにひも付けられた頻度を合計する  combiner を使おう!
  56. 56. ペア: 疑似コード
  57. 57. 「ペア」分析  利点  実装が簡単  理解しやすい  欠点  たくさんのペアをソート・シャッフルしなければならない(上限 値?)  combiner を使う機会があまりない
  58. 58. 「ペア」から「ストライプ」へ  アイデア: ペアを連想配列にグループ化する  各 mapper は文を引数に取る。  共起する単語ペアを全て生成する  各単語に対し、emit 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 } +
  59. 59. ストライプ: 疑似コード
  60. 60. 「ストライプ」分析  利点  キー=バリューペアのソートとシャッフルの回数を激減  combiner を効果的に使える  欠点  実装が難しい  裏で用いられるオブジェクトがもっと重たくなる  事象空間のサイズという観点で、原理的な制約がある
  61. 61. クラスタサイズ: 38 コア データ: English Gigaword Corpus (v3) の Associated Press Worldstream (APW) から、 227 万文書(1.8 GB compressed, 5.7 GB uncompressed) 単語共起行列計算の「ペア」と「ストライプ」の比
  62. 62. ストライプアルゴリズムにおけるクラスタサイズの
  63. 63. 相対頻度の計算  頻度から相対頻度を計算するには?  なんでこれを計算したい?  MapReduce でどのようにやる?   ' )',(count ),(count )(count ),(count )|( B BA BA A BA ABf
  64. 64. f(B|A) の計算: 「ストライプ」を使えば簡単 !  簡単!  1パス目で (a, *) を計算  2バス目で直接 f(B|A) を計算 a → {b1:3, b2 :12, b3 :7, b4 :1, … }
  65. 65. 順番を逆転させて考える  共通するデザインパターン  相対頻度の計算には周辺化された頻度が必要  しかし周辺化の計算には全ての頻度を知らなければならない  バッファリングしたくない  コツ: 周辺化された頻度が同時頻度の前に reducer に来るようにす る
  66. 66. f(B|A) の計算: 「ペア」でも可能  このようにするためには:  mapper で各 bn のたびに余分に (a, *) を emit  全ての a を同じ reducer に送る(partitioner を使う)  (a, *) が最初に来るように(ソートの順番を定義する)  異なるキー=バリューペアをまたいで reducer 内で状態を保持 することが必要 (a, b1) → 3 (a, b2) → 12 (a, b3) → 7 (a, b4) → 1 … (a, *) → 32 (a, b1) → 3 / 32 (a, b2) → 12 / 32 (a, b3) → 7 / 32 (a, b4) → 1 / 32 … Reduce がメモリ上にこの値を保持
  67. 67. 順番を逆転させて考える  共通するデザインパターン  相対頻度の計算には周辺化された頻度が必要  しかし周辺化の計算には全ての頻度を知らなければならない  バッファリングしたくない  コツ: 周辺化された頻度が同時頻度の前に reducer に来るようにす る  最適化  周辺化された頻度を集約するために、インメモリで combine する パターンを適用する  combiner を使うべき?
  68. 68. 同期: ペア対ストライプ  アプローチ 1: 同期を順序問題に落とし込む  キーをソートして正しい計算順序にしておく  キー空間を分割して各 reducer が適切な結果の部分集合を受け取 るようにしておく  計算するために複数のキー=バリューペアをまたいで reducer に 状態を保持する  「ペア」アプローチで見た  アプローチ 2: 部分的な結果を統合するデータ構造を構築  各 reducer が計算を完成させるために必要な全データを受け取る  「ストライプ」アプローチで見た
  69. 69. MapReduce を超えて MapReduce の基礎 MapReduce のアルゴリズムデザイン MapReduce を超えて
  70. 70. MapReduce のホットトピック  他のプログラミングモデルの探求  バッチ vs. リアルタイムデータ処理  さまざまな実装(例: Microsoft DryadLINQ)  MapReduce 自身がツールでもある  Hadoop 生態系の拡大  MapReduce と分散データベースの進化
  71. 71. 高水準言語の要求  Hadoop は大規模データ処理には適している  ただ、なにをするにも Java プログラムを書かないといけないの は冗長だし、遅い。。。  アナリストは Java を書きたくない(書けないことも)  解決策: 高水準のデータ処理用の言語を開発する  Hive: HQL は SQL のような言語  Pig: Pig Latin がデータフロー言語
  72. 72. Hive と Pig  Hive: Hadoop のデータウェアハウス構築環境  クエリ言語は SQL の一種の HQL  テープルはフラットファイルの形で HDFS に記憶  Facebook が開発し、現在はオープンソース  Pig: 大規模データ処理システム  データフロー言語の Pig Latin でスクリプトを書く  Yahoo! が開発し、現在はオープンソース  Yahoo! 内部のジョブのだいたい 1/3 は Pig  共通するアイデア:  大規模データ処理を行うための高水準言語を提供する  高水準言語は Hadoop ジョブに「コンパイル」される
  73. 73. まとめ: 大規模データ処理の「哲学」  スケール「アウト」する。(スケール「アップ」ではなく )  データ中心の処理を行う  データを順番に処理する。ランダムアクセスしない。  シームレスなスケーラビリティ
  74. 74. Source: NY Times (6/14/2006) データセンターこそがコンピュータ! MapReduce = 適切なレベルの抽象化

×