Hadoop ジョブの送信者は、分割を計算する際にレコード境界を考慮しますか?[重複]
-
02-01-2020 - |
質問
この質問は次の質問と重複するものではありません。Hadoop プロセスのレコードはブロック境界を越えてどのように分割されますか?
入力分割計算に関して1つ質問があります。Hadoopガイドによると
1) InputSplit はレコード境界を尊重します
2) 同時に、分割はジョブ送信者によって計算されるとも言われます。これはクライアント側で実行されると思います。[MapReduce ジョブ実行の構造 - クラシック MRv1]
これは次のことを意味しますか?
(a) ジョブ送信者は入力分割を計算するためにブロックを読み取りますか?これが事実であれば、それは非常に非効率的であり、Hadoop の目的そのものに反することになるでしょう。
または
(b) ジョブ送信者は、ブロック サイズと位置に基づく推定にすぎない分割を計算するだけですか。その後、ホスト境界を越えてレコードを取得するのは、マッパーの下で実行される InputFormat と RecordReader の役割になりますか。
ありがとう
解決
(a) ジョブ送信者は入力分割を計算するためにブロックを読み取りますか?これが当てはまる場合、それは非常に非効率的であり、Hadoopのまさに目的を打ち負かすことはありません。
私はそうは思わない。ジョブ送信者は、ネーム ノードからブロックの情報を読み取り、計算を実行するだけでよいため、多くのコンピューティング リソースを使用する必要はありません。
(b)ジョブの提出者は、単にブロックサイズと場所に基づいた推定値である分割を計算するだけで、ホストの境界を越えてレコードを取得するためにマッパーの下で実行されているinputformatとレコードリーダーの責任になります。
送信者の計算がどの程度正確であるかはわかりませんが、分割サイズは、次の式を使用して、構成された最小分割サイズと最大分割サイズ、およびブロック サイズに基づいて計算されます。
max(minimumSplitSize, min(maximumSplitSize, blockSize))
これらの値はすべてユーザーが設定できます。たとえば、最小分割サイズは 1、最大値は最大長値 (9223372036854775807) にすることができます。
正解です。InputFormat のレコードは論理概念です。これは、開発者がマップ リデュース コードを開発するときに、レコードが 2 つの異なる分割に分割される場合を考慮する必要がないことを意味します。レコードリーダーは、リモート読み取りを介して不足している情報を読み取る役割を果たします。これによりオーバーヘッドが発生する可能性がありますが、通常はわずかです。