ペーパーリーディングノート:MapReduce

MapReduce

概要

  • はじめに:MapReduceは、主にMapとReduceの2つの機能に関するプログラミングモデルです。
  • 重要性:このアーキテクチャに基づくプログラムは、共通の構成を持つ多数のコンピューターで並列化できます。
    • MRアーキテクチャにより、並列計算や分散システム開発の経験がないプログラマでも、分散システムのリソースを効果的に使用できます

1はじめに

  • 問題の概要:Googleは大量のデータ計算に直面しています。許容可能な時間内にタスクを完了するには、数百のホストにしかこれらの計算を分散できません。
    • したがって、並列コンピューティングの処理方法、データの分散方法、エラーやその他の問題の処理方法が統合され、多くのコード処理が必要になります。これらの複雑な問題を解決するために、著者はそのような抽象的なモデルを設計しました。
  • インスピレーションの源:
    • 機能的な音声のための多くのMap and Reduceプリミティブ
    • ほとんどの操作にはそのような操作が含まれます
      • 入力データの論理レコードにマップを適用して、中間キー/値ペアのセットを取得します
      • 同じキー値を共有する値にリデュースを適用して、派生データを適切にマージします
  • 目次:
    • セクション2:基本的なプログラミングモデル、簡単な例
    • セクション3:クラスタコンピューティング環境に基づいてカスタマイズされたMapReduceインターフェイス
    • セクション4:いくつかの便利な改善
    • セクション5:さまざまなタスクでのパフォーマンステスト
    • セクション6:GoogleでのMapReduceの適用
    • セクション7:関連作業と将来の開発

2プログラミングモデル

計算モデルは、キーと値のペアのセットを入力として受け取り、キーと値のペアのセットを出力として生成します。MapReduceライブラリのユーザーは、計算をMapとReduceの2つの関数で表現します。

  • マップ:ユーザーが作成し、取得1入力ペアと生成グループ中間のキーと値のペア。
    • MapReduceライブラリは、すべての中間値を自動的に同じ中間キーと組み合わせて、Reduceに渡します
  • 削減:ユーザーが書き込み、中間キーと対応する値のセットを受け入れ、それらをより小さい値のセットにマージします。通常、Reduce関数はゼロまたは1つの値の値のみを生成します。
    • 通常、Reduceはイテレーターを介して中間値を取得します(そのため、中間値の数がメモリ容量よりはるかに多い場合でも、それを処理できます)

2.1例

map(String key, String value):
	// key:  document name
	// value: document contents
	for each word w in value:
		EmitIntermediate(w, "1");

reduce(String key, Iterator values):
	// key: a word
	// values: a list of counts
	int result = 0;
	for each v in values:
		result += ParseInt(v);
	Emit(AsString(result));

map関数は、1つの単語と関連する出現回数(例では1)としてテキストを生成します。reduce関数は、同じ単語のすべての生成されたカウントを合計します。

さらに、ユーザーはmapreduce仕様と呼ばれるオブジェクトに、入力ファイルと出力ファイルの名前、およびオプションの調整パラメーターを入力する必要があります(この手順によりMapReduce仕様が決定されます)。その後、ユーザーはMapReduce関数を呼び出して、上記で定義したオブジェクトを渡します。ユーザーのコードはMapReduceライブラリ(C ++で実装)に接続されます。

2.2キーと値のペアのタイプ

上記の例では文字列を使用していますが、map関数とreduce関数は使用のタイプを概念的に関連付けています。

マップ:(k 1、v 1)→リスト(ks、vs)マップ:(k_1、v_1)→リスト(k_s、v_s) m a p k1V1l i s t kSVS

縮小:(k 2、リスト(v 2))→リスト(v 2)縮小:(k_2、リスト(v_2))→リスト(v2) R E D U C E K2l i s t v2l i s t v 2

入力キー値と出力キー値は異なるドメインを持っていますが、中間キー値と出力キー値は同じドメインを持っていることに注意してください

3実現

MapReduce(以下、MRと呼びます)には、特定の環境に応じて決定する必要のある多くの実装インターフェースを含めることができます。

3.1操作の概要

入力データを自動的にMセグメント(分割)に分割して、Map関数を複数のマシンに分散して呼び出すことができるようにします。入力セクションは、複数のマシンで並行して処理できます。パーティション関数(ハッシュモジュロRなどを使用して中間キースペースをR個に分割することによりReduce関数を分散して呼び出すことができます。スライス数と除算機能はユーザーが指定します。

次の図は、全体的な実行プロセスを示しています。ユーザープログラムがMR関数を呼び出すと、次の操作が行われます。

ここに画像の説明を挿入

ホスト:作業中のマシンにタスクを割り当てる

  1. 入力ファイルのセグメンテーション(ユーザーは制御するパラメーターを設定できます)
  2. マップタスクが割り当てられた作業マシンは、対応する入力セグメントのコンテンツを読み取り、入力データのキーと値のペアを分析し、それらをマップ関数に渡し、中間のキーと値のペアを生成してメモリにバッファリングします。
  3. 定期的な間隔で、バッファーのキーと値のペアがローカルディスク(mマシン内)に書き込まれ、Rブロックに分割されます。これらの領域の場所はホストに送信され、ホストはこれらの場所をリデュースワーカーに送信します。
  4. リデューサーがホストから位置データを受信すると、RPC(リモートプロシージャコール)を使用して、マップマシンのローカルディスクからバッファーデータを読み取ります。リデュースワーカーが読み取りを完了すると、中間キーに従ってレコードをソートし、同じキーを持つレコードがグループ化されるようにします。中間データの総量が多い場合、外部ソートを使用します
  5. reduceワーカーは、ソートされた中間マシンで作業し、各中間キーをトラバースし、それと中間値のセットをreduce関数に渡します。reduce関数の出力は、最終的な出力ファイルに追加されます(グローバルファイルシステムがあります)に)
  6. すべてのマップとリデュースが完了すると、MapReduce呼び出しが終了し、ユーザーコードに戻ります。

正常に完了すると、mapreduceの実行出力はR出力ファイルに入れられます(reduceタスクごとに1つ、ファイル名はユーザーが指定します)。一般的に言えば、ユーザーはR出力ファイルを1つにまとめる必要はありません。通常、これらのファイルを別のMapReduce呼び出しの入力として使用するか、複数のファイル入力を処理できる別の分散アプリケーションで使用します。

3.2ホストのデータ構造

ホストはいくつかのデータ構造を維持します。マップタスクと削減タスクの場合、ステータス(アイドル、実行中、完了)と非アイドルタスクワーカーのID番号が格納されます。

ホストは、マップタスクが中間ファイルの保存場所を削減タスクに転送するチャネルです。したがって、ホストは、完了したマップタスクごとにR中間ファイル領域の場所とサイズを保存します。マップタスクが完了すると、ホストはファイルの場所とサイズ情報の更新を受け取ります。情報は、Reduceワーカーに1つずつ送信されます(各マップタスクは、処理される各ReduceワーカーファイルにR分散を生成します)。

3.3フォールトトレランス

労働者の失敗

ホストは定期的に各ワーカーにpingを送信します。タイムアウト後に応答がない場合、ワーカーは失敗としてマークされ、完了したマップタスクはアイドル状態(アイドル)にロールバックされ、再割り当てされます。進行中のマップ/ Reduceタスクはアイドル状態にリセットされ、他のワーカーに再割り当てされます

  • 完了したMapタスクを再実行する必要がある理由は、その結果がローカルディスクに保存され、失敗後に取得できないためです(完了したReduceタスクの出力はグローバルファイルシステムに保存されるため、やり直す必要はありません)。
  • マップタスクが最初にAによって実行され、後でBによって実行されると、すべての実行削減タスクがこの通知を受け取ります。ワーカーAからデータを読み取るが、読み取っていないリデュースタスクは、ワーカーBにリダイレクトされます。

マスター障害

マスターの場合、上記のマスターデータ構造にチェックポイントを定期的に格納するだけです。マスタータスクが停止した場合は、最後のチェックポイントの状態からマスタータスクを再開できます。ただし、マスターが1つしかないため、失敗することはほとんどありません。したがって、この実装では、マスターで障害が発生した場合、マスターはMapReduce操作を中断するだけです。ユーザーはこのステータスを検出でき、必要に応じて手動で(ステータスを設定して)MapReduce操作を再開できます。

障害を処理するメカニズム

未完成のマップタスクの完了情報を受け取ります。Rファイルの名前と場所をマスターデータ構造に記録します。

完了したマップタスクの無視メッセージを受け取りました-無視してください

同じ削減タスクが複数のマシンによって実行される-出力ファイル名は競合し、基礎となるファイルシステムは、1つの削減タスクからの出力ファイルが1つだけ残ることを保証できます。

3.4ローカリゼーション

著者のコンピューティング環境では、ネットワーク帯域幅は比較的少ないリソースであるため、すべてのマシンに物を保存しようとします。

一般に、入力データのいくつかのコピー(通常は3つのコピー)がマシンクラスタのローカルディスクに分散され、各マシンには特定の数の入力ファイルがあります。マスターはマップを割り当てるときに、関連する入力データのコピーを含むマシンにタスクを割り当てようとし、失敗した場合は、隣接するマシンに割り当てようとします。

したがって、十分に大きなクラスターで大規模なMR操作を実行すると、ほとんどのデータをローカルで取得でき、消費されるネットワーク帯域幅は比較的小さくなります。

3.5タスクの粒度

上記のように、マップフェーズを分割し、フェーズをM部分とR部分に縮小します。理想的には、MとRは稼働中のマシンの数をはるかに超える必要があります。これにより、動的な負荷分散が改善され、稼働中のマシンが故障した後の復旧作業がスピードアップします。

実際、MとRのサイズには制限があります。ホストはO(M + R)スケジューリングを実行し、O(M * R)状態をメモリに維持する必要があります。(実際、メモリフットプリントは非常に小さいです。O(M ∗ R)状態は1バイトのデータ、つまりマップ/リデュースタスクのペアごとに1ビットしか必要ありません)。

また、Rは最終的に出力されるファイルの数を決定するため、Rは一般にユーザーによって制約されます。したがって、実際にはMを選択する傾向があります。はい、独立したタスクごとに約16MB〜64MBの入力データがあります(これがローカリゼーションの最良の効果です)。

一般的に、Rは、使用したい稼働中のマシンの数の小さい倍数にもなります。

3.6スタンバイタスク

一部のマシンでは、ハードウェアの品質、バグなどが原因で計算が非常に遅くなり、MR全体の消費時間が長くなる可能性があります

  • 解決:
    • MRが完了に近づくと、ホストは、まだ実行中のタスクをバックアップ実行のためにスケジュールします。これにより、基本タスクが完了したか、コピータスクが完了したかに関係なく、タスクが完了します。通常、計算量はわずかしか増加しませんが、大規模なMR操作を完了するまでの時間を大幅に短縮できます。

4延長

4.1パーティション機能

通常はハッシュを使用しますが、実際の状況に応じて、タスクを完了するために特別な分割を使用します

4.2注文を確認する

特定のパーティションでは、中間キー/値ペアデータの処理順序がキー値の増分順に処理されるようにします。この順序により、順序付けされた出力ファイルがパーティションごとに生成されます。これは、キー値に従って出力ファイルにランダムにアクセスする必要があるアプリケーションにとって非常に意味があり、ソートが必要なデータセットにとっても非常に役立ちます。

4.3コンバイナー

マップの結果については、combiner関数がローカルで一度マージしてから、ネットワークを介して結果を送信します

コンバイナとリデュースの唯一の違いは、MRライブラリが関数の出力を制御する方法です。リデュースの結果は最終ファイルに保存され、コンバイナの結果は中間ファイルに書き込まれて、リデュースタスクに送信されます。

この部分のような中間結果をマージすると、一部のMR操作の速度を大幅に向上させることができます

4.4入力と出力の型拡張

ほとんどのMapReduceユーザーは、要件を満たすためにいくつかの事前定義された入力タイプのみを使用しますが、ユーザーは、単純なReaderインターフェース実装を提供することにより、新しい入力タイプをサポートできます。

Readerはファイルからデータを読み取る必要がなく、たとえば、データベースからレコードを読み取るReaderや、メモリ内のデータ構造からデータを読み取るReaderを簡単に実装できます。

同様に、事前定義された出力データタイプをいくつか提供します。これにより、さまざまな形式のデータを生成できます。ユーザーは、新しい入力データ型の追加と同様の方法で新しい出力型を追加します。

4.5副作用(少し混乱します)

場合によっては、MapReduceのユーザーは、MapやReduce操作中に補助出力ファイルを追加する方が簡単だと感じることがあります。プログラムの作成者は、この「副作用」をアトミックおよびべき等にすることに依存しています(注:べき等とは、常に同じ結果を生成する数学演算を指します)。通常、アプリケーションプログラムは最初に出力結果を一時ファイルに書き込み、すべてのデータが出力された後、一時ファイルはシステムレベルのアトミック操作の名前変更を使用して名前が変更されます。

タスクが複数の出力ファイルを生成する場合、この状況をサポートする2フェーズコミットなどのアトミック操作は提供されません。したがって、複数の出力ファイルを生成し、ファイル間で一貫性の要件があるタスクの場合、それらは確定的なタスクでなければなりません。しかし、実際の申請プロセスでは、この制限によって問題が発生することはありません。

4.6破損したレコードをスキップする

多くの場合、巨大なデータセットに対して統計分析を実行する場合など、問題のあるレコードを無視しても問題ありません。実行モードを提供します。このモードでは、処理全体を続行できるようにするために、MapReduceはどのレコードが確定的クラッシュの原因であるかを検出し、処理せずにこれらのレコードをスキップします。

各ワーカープロセスは、セグメンテーション違反とバスエラーをキャプチャする信号処理関数を設定しています。MapReduceライブラリは、MapまたはReduce操作を実行する前に、グローバル変数を通じてレコードのシリアル番号を保存します。ユーザープログラムがシステム信号をトリガーすると、メッセージ処理機能は「ラストブレス」を使用して、UDPパケットを介して最後に処理されたレコードのシーケンス番号をマスターに送信します。特定のレコードを2回以上処理できなかったことをマスターが確認すると、マスターはそのレコードをスキップする必要があることをマークし、次に関連するMapまたはReduceタスクが再度実行されるときにこのレコードをスキップします。

4.7ローカル実行

著者は、開発者がローカルでデバッグするためのMapReduceライブラリのローカル実装バージョンを開発しました(何千ものコンピューターでデバッグするのは困難です)。

4.8ステータス情報

著者は、以下を示す一連のステータス情報ページを開発しました

  • 完了したタスクの数、処理されているタスクの数、入力バイト数、中間データバイト数、出力バイト数、処理の割合など、実行の進行状況を計算します。
  • 各タスクのstderrおよびstdoutファイルへのリンク。これらのデータに基づいて、ユーザーは計算にかかる時間と、追加のコンピューティングリソースが必要かどうかを予測します。これらのページは、計算が予想よりも遅く実行された場合の分析にも使用できます。
  • さらに、最上位のステータスページには、失敗したワーカーと、失敗したときに実行されていたMapタスクとReduceタスクが表示されます。この情報は、ユーザーコードのバグをデバッグする非常に役立ちます。

4.9カウンター

処理および出力されたキーと値のペアの数をカウントします。ユーザーはこれを使用して、処理された単語の数を確認できます。インデックスに登録されているドイツ語文書の数など。

5性能評価

おすすめ

転載: blog.csdn.net/Kaiser_syndrom/article/details/106222849