Hadoop MapReduce の結合とカウンターの例
Mapreduce での結合とは何ですか?
マップリデュース結合 2 つの大きなデータセットを結合するには、結合操作を使用します。ただし、このプロセスでは、実際の結合操作を実行するために大量のコードを記述する必要があります。2 つのデータセットの結合は、各データセットのサイズを比較することから始まります。一方のデータセットがもう一方のデータセットよりも小さい場合、小さい方のデータセットがクラスター内のすべてのデータ ノードに分散されます。
MapReduce の結合が分散されると、Mapper または Reducer は小さいデータセットを使用して、大規模なデータセットから一致するレコードの検索を実行し、それらのレコードを結合して出力レコードを形成します。
結合の種類
実際の結合が実行される場所に応じて、Hadoop の結合は次のように分類されます。
1. マップ側の結合 – 結合がマッパーによって実行される場合、それはマップ側結合と呼ばれます。 このタイプでは、マップ関数によってデータが実際に消費される前に結合が実行されます。 各マップへの入力はパーティションの形式であり、ソートされた順序であることが必須です。 また、同じ数のパーティションが存在し、結合キーによってソートされている必要があります。
2. リデュース側結合 – 結合がリデューサーによって実行される場合、それはリデュース側結合と呼ばれます。 この結合では、データセットを構造化形式 (またはパーティション化) にする必要はありません。
ここで、マップ側の処理は、両方のテーブルの結合キーと対応するタプルを出力します。 この処理の結果として、同じ結合キーを持つすべてのタプルは同じ Reducer に入り、同じ Reducer が同じ結合キーを持つレコードを結合します。
Hadoop における結合の全体的なプロセス フローを以下の図に示します。
XNUMX つの DataSet を結合する方法: MapReduce の例
XNUMX つの異なるファイルに XNUMX つのデータ セットがあります (以下を参照)。 キー Dept_ID は両方のファイルで共通です。 目標は、MapReduce Join を使用してこれらのファイルを結合することです。
入力: 入力データセットはtxtファイルです。 DeptName.txt および DepStrength.txt
Hadoop がインストールされていることを確認してください。 MapReduce Join サンプルの実際のプロセスを開始する前に、ユーザーを「hduser」に変更します (Hadoop 構成中に使用される ID ですが、Hadoop 構成中に使用されるユーザー ID に切り替えることができます)。
su - hduser_
ステップ1) zip ファイルを選択した場所にコピーします
ステップ2) ZIP ファイルを解凍します。
sudo tar -xvf MapReduceJoin.tar.gz
ステップ3) ディレクトリ MapReduceJoin/ に移動します。
cd MapReduceJoin/
ステップ4) Hadoopを開始する
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
ステップ5) DeptStrength.txt および DeptName.txt は、この MapReduce Join サンプル プログラムで使用される入力ファイルです。
これらのファイルは、以下のコマンドを使用して HDFS にコピーする必要があります。
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /
ステップ6) 以下のコマンドを使用してプログラムを実行します。
$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin
ステップ7) 実行後、出力ファイル (「part-00000」という名前) は HDFS 上のディレクトリ /output_mapreducejoin に保存されます。
コマンドラインインターフェイスを使用して結果を確認できます
$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000
結果は Web インターフェイス経由でも確認できます。
今すぐ選択 「ファイルシステムを参照」 そして上まで移動します /output_mapreducejoin
店は開いています パート-r-00000
結果が表示される
注: 次回このプログラムを実行する前に、出力ディレクトリ /output_mapreducejoin を削除する必要があることに注意してください。
$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin
別の方法として、出力ディレクトリに別の名前を使用することもできます。
MapReduce のカウンターとは何ですか?
A MapReduce のカウンター MapReduce ジョブとイベントに関する統計情報を収集および測定するために使用されるメカニズムです。カウンターは、発生した操作の数や操作の進行状況など、MapReduce 内のさまざまなジョブ統計を追跡します。カウンターは、MapReduce の問題診断に使用されます。
Hadoop カウンターは、マップまたはリデュースのコードにログ メッセージを挿入することに似ています。 この情報は、MapReduce ジョブ処理の問題の診断に役立つ可能性があります。
通常、Hadoop のこれらのカウンターはプログラム (マップまたはリデュース) で定義され、実行中に特定のイベントまたは条件 (そのカウンターに固有) が発生したときに増分されます。 Hadoop カウンターの非常に優れた用途は、入力データセットからの有効なレコードと無効なレコードを追跡することです。
MapReduce カウンターの種類
基本的に2種類あります MapReduce カウンタ
- Hadoop 組み込みカウンター:ジョブごとに存在する組み込みの Hadoop カウンタがいくつかあります。 以下は組み込みのカウンター グループです。
- MapReduce タスクカウンター – 実行中にタスク固有の情報 (入力レコードの数など) を収集します。
- ファイルシステムカウンター – タスクによって読み取られたまたは書き込まれたバイト数などの情報を収集します
- FileInputFormat カウンター – FileInputFormat を通じて読み取られたバイト数の情報を収集します
- FileOutputFormat カウンター – FileOutputFormat を通じて書き込まれたバイト数の情報を収集します
- ジョブカウンター – これらのカウンターは JobTracker によって使用されます。 これらによって収集される統計には、たとえば、ジョブに対して起動されたタスクの数が含まれます。
- ユーザー定義のカウンター
組み込みのカウンターに加えて、ユーザーは、提供される同様の機能を使用して独自のカウンターを定義できます。 プログラミング言語。 たとえば、 Java 「enum」は、ユーザー定義のカウンターを定義するために使用されます。
カウンタの例
欠損値と無効な値の数をカウントするカウンターを備えた MapClass の例。 このチュートリアルで使用する入力データ ファイル 入力データ セットは CSV ファイルです。 SalesJan2009.csv
public static class MapClass extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> { static enum SalesCounters { MISSING, INVALID }; public void map ( LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { //Input string is split using ',' and stored in 'fields' array String fields[] = value.toString().split(",", -20); //Value at 4th index is country. It is stored in 'country' variable String country = fields[4]; //Value at 8th index is sales data. It is stored in 'sales' variable String sales = fields[8]; if (country.length() == 0) { reporter.incrCounter(SalesCounters.MISSING, 1); } else if (sales.startsWith("\"")) { reporter.incrCounter(SalesCounters.INVALID, 1); } else { output.collect(new Text(country), new Text(sales + ",1")); } } }
上のコード スニペットは、Hadoop Map Reduce でのカウンターの実装例を示しています。
ここでは、 販売カウンター を使用して定義されたカウンタです '列挙型'。 数えるために使われます 欠落 や 無効 入力レコード。
コードスニペットの場合、 '国' フィールドの長さがゼロの場合、その値が欠落しているため、対応するカウンターが存在します。 SalesCounters.MISSING インクリメントされます。
次に、もし 「販売」 フィールドはで始まります 「 その場合、レコードは無効とみなされます。 これはカウンターの増加によって示されます SalesCounters.無効です。