39

これは、Hadoop/HDFS に関する概念的な質問です。10 億行を含むファイルがあるとします。簡単にするために、各行は、<k,v>k が先頭からの行のオフセットであり、値が行の内容である形式であると考えてみましょう。

さて、N 個の map タスクを実行したいと言った場合、フレームワークは入力ファイルを N 個の分割に分割し、その分割で各 map タスクを実行しますか? または、N 個の分割を行い、生成された分割で各マップ タスクを実行するパーティショニング関数を作成する必要がありますか?

私が知りたいのは、分割が内部で行われるのか、それともデータを手動で分割する必要があるのか​​ということだけです.

より具体的には、 map() 関数が呼び出されるたびに、そのKey key and Value valパラメーターは何ですか?

ありがとう、ディーパック

4

10 に答える 10

25

InputFormat分割を提供する責任があります。

一般に、n 個のノードがある場合、HDFS はこれらの n 個のノードすべてにファイルを分散します。ジョブを開始すると、デフォルトで n マッパーが存在します。Hadoop のおかげで、マシン上のマッパーは、このノードに保存されているデータの一部を処理します。これは と呼ばれていると思いますRack awareness

簡単に言うと、HDFS にデータをアップロードし、MR ジョブを開始します。Hadoop は最適化された実行を処理します。

于 2010-05-14T13:37:14.040 に答える
14

ファイルは HDFS ブロックに分割され、ブロックが複製されます。Hadoop は、データの局所性の原則に基づいて分割用のノードを割り当てます。Hadoop は、ブロックが存在するノードでマッパーを実行しようとします。複製のため、同じブロックをホストする複数のノードが存在します。

ノードが使用できない場合、Hadoop は、データ ブロックをホストするノードに最も近いノードを選択しようとします。たとえば、同じラック内の別のノードを選択できます。ノードはさまざまな理由で使用できない場合があります。すべてのマップ スロットが使用中か、ノードが単にダウンしている可能性があります。

于 2011-04-22T13:50:27.463 に答える
10

幸いなことに、すべてがフレームワークによって処理されます。

MapReduceデータ処理は、この入力分割の概念によって駆動されます。特定のアプリケーションに対して計算される入力分割の数によって、マッパー タスクの数が決まります。

通常、マップの数は、入力ファイル内の DFS ブロックの数によって決まります。

これらの各マッパー タスクは、可能な場合、入力分割が保存されているスレーブ ノードに割り当てられます。Resource Manager (Hadoop 1 の場合は JobTracker) は、入力分割がローカルで処理されるように最善を尽くします。

入力分割がデータ ノードの境界をまたいでいるためにデータの局所性を達成できない場合、一部のデータは 1 つのデータ ノードから別のデータ ノードに転送されます。

128 MB のブロックがあり、最後のレコードがブロックaに収まらず、ブロック b に広がると仮定すると、ブロック bのデータはブロック a持つノードにコピーされます。

この図を見てください。

ここに画像の説明を入力

関連する質問を見てください

Hadoop/HDFS ファイル分割について

Hadoop プロセス レコードは、ブロック境界を越えてどのように分割されますか?

于 2015-12-13T04:05:27.097 に答える
1

FileInputFormatは、入力ファイルの読み取り方法とスピルアップ方法を定義する抽象クラスです。FileInputFormat は、次の機能を提供します。 1. 入力として使用するファイル/オブジェクトを選択します。 2. ファイルをタスクに分割する入力分割を定義します。

hadoopp の基本機能によると、n 個の分割がある場合、n 個のマッパーが存在します。

于 2013-11-25T08:05:18.590 に答える
1

Hadoop ジョブが実行されると、入力ファイルがチャンクに分割され、各分割がマッパーに割り当てられて処理されます。これは InputSplit と呼ばれます。

于 2016-08-01T11:56:27.410 に答える
0

FileInputFormat.addInputPath(ジョブ, 新しいパス(args[ 0])); また

conf.setInputFormat(TextInputFormat.class);

class FileInputFormat funcation addInputPathsetInputFormatは入力 分割を処理します。また、このコードは作成されるマッパーの数を定義します。入力分割とマッパーの数は、入力ファイルを HDFS に保存するために使用されるブロックの数に正比例すると言えます。

元。サイズが 74 Mb の入力ファイルがある場合、このファイルは HDFS に 2 つのブロック (64 MB と 10 Mb) で保存されます。したがって、このファイルの入力分割は 2 であり、この入力ファイルを読み取るために 2 つのマッパー インスタンスが作成されます。

于 2015-07-01T10:49:54.340 に答える
0

ファイルをブロックに分割する別のマップ削減ジョブがあります。大きなファイルには FileInputFormat を使用し、小さなファイルには CombineFileInput Format を使用します。issplittable メソッドで、入力がブロックに分割できるかどうかを確認することもできます。その後、各ブロックはデータ ノードに送られ、そこでマップ削減ジョブが実行され、さらに分析が行われます。ブロックのサイズは、mapred.max.split.size パラメータで指定したサイズによって異なります。

于 2014-03-19T09:43:41.173 に答える