ディレクトリ
MapReduceは、Hadoopシステムのコアコンポーネントの1つです。これは、ビッグデータの並列処理に使用できるコンピューティングモデル、フレームワーク、およびプラットフォームです。主に大量のデータの計算を解決します。分散コンピューティングモデルで広く使用されています。
1. MapReduceのコアアイデア:分割と征服
MapReduceを使用して大量のデータを操作する場合の手順:
- 各MapReduceプログラムは作業タスクとして初期化されます
- 各作業タスクは2つの段階に分けることができます:MapとReduce l
- マップステージ:タスクの分解、つまり並列処理されるいくつかの単純なタスクに分解する責任がありますが、これらのタスクには必然的な依存関係がなく、独立してタスクを実行できることが前提です。
- 削減フェーズ:タスクのマージを担当します。つまり、マップフェーズの結果をグローバルに要約します。
第二に、MapReduceプログラミングモデル:大規模なデータセットの並列処理を処理するために使用されます。
プログラミングプロセスは、map()関数とreduce()関数を介して実装されます。
データ形式から、map()関数が受け取るデータ形式はキーと値のペアであり、出力結果もキーと値のペアの形式になります。 map()関数によって出力されたキーと値のペアが入力として使用され、同じキー値の値が集約されて新しいキーと値のペアが出力されます。(プロセス全体は、キーと値のペアの変換プロセスと同等です)
特定のMapReduceの単純なデータモデル:
- 生データをキーと値のペア<K1、V1>に処理します。
- 解析されたキーと値のペア<K1、V1>をmap()関数に渡します。map()関数は、マッピングルールに従って、キーと値のペア<K1、V1>を一連の中間結果タイプのキーと値のペア<K2にマップします。 、V2>
- キーと値のペア<K2、V2>の中間形式は、<K2、{V2、…}>の形式に形成され、reduce()関数に渡されて処理されます。同じキーを持つ値は、新しいキーと値のペア<K3、 V3>、この時点でのキーと値のペア<K3、V3>は最終的な出力結果です
注目:Mapプロセスがあり、Reduceプロセスはありません。Mapプロセスで生成されたデータは、HDFSに直接書き込むことができます。もちろん、タスクが複雑な場合は、複数のReduceプロセスが存在する可能性があります。
3. MapReduceアーキテクチャの主なコンポーネント
- クライアント
- JobTracker
- TaskTracker
- 仕事
4、MapReduce操作モード
- ローカル操作モード:現在の開発環境でMapReduce実行環境をシミュレートします処理されたデータと出力結果はローカルオペレーティングシステムにあります(クラスターを構築する必要はありません)。
- クラスター実行モード:MapReduceプログラムはjarパッケージとしてパッケージ化され、yarnクラスターに送信されてタスクを実行します。ヤーンクラスターはリソース管理とタスクスケジューリングを担当するため、プログラムはクラスター内のノードに分散されて同時実行され、処理されたデータと出力結果はHDFSファイルシステムにあります。
5番目のMapReduceプログラミング例:単語頻度統計
単語頻度統計の模式図:
特定の手順:
6. MapReduceの基本的なデータ型のシリアル化
MapReduceのデータ型はWritableインターフェースを実装する必要があります。これにより、これらの型で定義されたデータをシリアル化して、ネットワーク転送とファイルストレージを実現できるため、Javaでのシリアル化よりも効率的です。
- ブール=> BooleanWritable
- バイト=> ByteWritable
- Double => DoubleWritable
- Float => FloatWritable
- 整数=> IntWritable
- Long => LongWritable
- 文字列=>テキスト
- Null => NullWritable
注目:カスタムのシリアル化された型オブジェクト(書き込み可能な実装)もアプリケーション中に使用できます
7、MapReduceの動作原理
- データソースのシャーディングとフォーマット
- シャーディング操作:ソースファイルを同じサイズ(デフォルトは2.x、128M)の小さなデータブロックに分割、つまりシャーディング。Hadoopは各シャードにマップタスクを作成し、カスタムマップを実行します)シャード内の各レコードを処理する関数
- フォーマット操作:分割されたフラグメントをキーと値のペアにフォーマットします(キーはオフセットを表し、値はコンテンツの各行を表します)
- MapTaskの実行:各Mapタスクにはメモリバッファがあります(デフォルトサイズは100M)。Mapタスク処理後の入力フラグメントデータの中間結果はメモリバッファに書き込まれます。書き込まれたデータがメモリバッファに到達した場合しきい値(80M)は、メモリでオーバーフローしたデータをディスクに書き込むためのスレッドを開始し、マップの中間結果には影響せず、バッファーへの書き込みを続行します。オーバーフロープロセス中に、MapReduceフレームワークはキーをソートします。中間結果が比較的大きい場合、複数のオーバーフローファイルが形成されます。最後に、すべてのバッファーデータがディスクに書き込まれてオーバーフローファイルを形成します。複数のオーバーフローファイルの場合、次に、すべての上書きファイルが最後に1つのファイルにマージされます。
- シャッフル処理を実行します。シャッフルは、MapTaskによって出力された処理結果データをReduceTaskに配布し、配布の過程で、データをキーで分割およびソートします
- ReduceTaskを実装する
- ファイルを書き込む
1. MapTask作業プロセス
5つの段階に分かれています。
- ステージを読む
- 地図ステージ
- ステージを集める
- 流出段階
- コンバイナステージ
2. ReduceTask作業プロセス
5つの段階に分かれています。
- コピー段階
- マージステージ
- 並べ替えステージ
- ステージを減らす
- 書き込み段階
3.作業プロセスをシャッフルする
シャッフルはMapReduceの中核であり、各リデュースの入力がキーで確実にソートされるようにするために使用されます。そのパフォーマンスレベルは、MapReduceプログラム全体のパフォーマンスレベルを直接決定します。マップステージとリデュースステージの両方にシャッフルメカニズムが含まれ、主な役割は「中間結果」を処理することです。
シャッフルプロセス:
- Combine(combination operation):マップでCombineによって行われたすべてのこと、削減すること
- パーティション(パーティション操作):データ分類
MapReduceは、ハッシュHashPartitionerを使用して分類し、カスタマイズすることもできます
8つのMapReduceプログラミングコンポーネント
- InputFormatコンポーネント:主に入力データのフォーマットを記述するために使用され、Mapperのデータセグメンテーションと入力データの2つの機能を提供します。
- addInputPath()
- addInputPaths()
- setInputPaths()
- setInputPaths()
- Mapperコンポーネント:Hadoopが提供するMapperクラスは、Mapタスクを実装する抽象基本クラスであり、基本クラスはmap()メソッドを提供します。
- Reducerコンポーネント:Mapプロセスによって出力されたキーと値のペアは、Reduceコンポーネントによってマージおよび処理され、最終的に何らかの形で結果として出力されます。
- パーティショナーコンポーネント:パーティショナーコンポーネントはマップ上に配置してキーを分割し、異なるキーに応じて処理するために異なるリデュースに分散させることができます。その目的は、ReduceTaskでキーを均等に分散することです。
- Combinerコンポーネント:Combinerコンポーネントの機能は、Mapステージによって出力された反復データに対してマージ計算を実行し、Reduceステージとして新しい(キー、値)を出力することです。
- OutputFormatコンポーネント:OutputFormatは、MapReduceプログラムの出力形式と仕様を記述するために使用される抽象クラスです