50 台のマシンのグリッドで Hadoop を実行していて、最も一般的な単語を判別するジョブを実行している場合、ドキュメント abc1.txt と abc2.txt のみを検索するように指定できますか? Hadoop はどのマシンでこのファイルを探すべきかをどのように判断するのでしょうか? それとも 50 台のマシンそれぞれでファイルを見つけようとしますか?
2 に答える
はい、MapReduce ジョブの入力として HDFS 内のファイルへのパスを指定する必要があります。しかし、良いことに、これらのファイルが実際にどこに保存されているかを知る必要はありません。
HDFS 分散ファイル システムにアップロードするabc1.txt
とabc2.txt
、Hadoop はこのファイルからのデータ ブロックを、ノードと呼ばれるクラスター内の複数のマシン (デフォルトでは 3 つ) に保存します。ファイル サイズが 1 台のマシンに保存できるサイズよりも大きい場合、Hadoop はファイルを複数のブロックに分割し、すべてのブロックを複数のノードに保存します。
そのため、ジョブはファイルが実際に保存されている場所を知る必要はありません。ジョブ プログラムはhdfs://abc1.txt
、 やのような URI でファイルを識別するだけですhdfs://abc2.txt
。
Hadoop は、データが保存されているノードと同じノードでジョブ (またはジョブの一部) を実行するために最善を尽くします。
Hadoop がジョブをスケジュールするとき、どのノードがジョブのデータを持っているか、その時点でどのノードが利用可能かが考慮されます。次に、ノードで実行するジョブをスケジュールします。
各ファイルが 1 つのノードに収まる場合、ジョブはファイルごとに 1 つのノードで実行されるようにスケジュールされます。したがって、クラスターの 50 ノードすべてで実行されるわけではありません。
Hadoop では、ファイルを hdfs に配置すると、複数の場所にファイルがコピーされます。たとえば、各ファイルの 3 つのコピーが均等に配置されます。
たとえば、50 個のファイルがあり、それぞれが hdfs に 3 つのコピーを持っているとします (この数は、hadoop のセットアップ中に決定されます)。Machine1
hasabc1.txt, abc24.txt and abc47.txt
と M2 has と他のものabc11.txt, abc24.txt and abc27.txt
も同様です。
abc_ i .txt (i は 1 から 50) を入力としてabc24.txt
与えると、ネットワーク データ転送を行わないように、Hadoop は M1 または M2、またはファイルを持っている他のマシンにジョブを与えます。そして、他のすべてのファイルは、そのファイルがあるマシンによって処理されます (これらのルールが失敗する例外的なケースがあるかもしれません)。理解を深めるには、このwiki ページをお読みください。