1

多数のユーザー間で共有されるHadoopクラスターを管理しています。私たちは頻繁に非常に遅いマッパーでジョブを実行します。たとえば、NLP解析したい32 GBのセンテンスファイル(1行に1センテンス)があるとします(これには、センテンスあたり100ミリ秒かかります)。ブロックサイズが128MBの場合、これは250マッパーです。これは私たちのかなり小さなクラスターを埋めます(9ノード×ノードあたり12マッパーは108マッパーです)が、各マッパーは完了するのに非常に長い時間(時間)かかります。

問題は、クラスターが空でそのようなジョブが開始された場合、クラスター上のすべてのマッパーを使用することです。次に、他の誰かが短いジョブを実行したい場合、それは何時間もブロックされます。新しいバージョンのHadoopはFairSchedulerでプリエンプションをサポートしていることを知っていますが(Capacity Schedulerを使用しています)、新しいバージョンも安定していません(次のリリースを待ち望んでいます)。

以前はマッパーの数を指定するオプションがありましたが、現在JobConfは非推奨になっています(奇妙なことに、0.20.205では非推奨ではありません)。これにより、マッパーが増えると、各マップタスクがより小さなデータセットで機能し、より早く終了するため、問題が軽減されます。

0.20.203でこの問題を回避する方法はありますか?InputFormat(この場合はTextInputFormat)をサブクラス化する必要がありますか?もしそうなら、私は正確に何を指定する必要がありますか?

4

4 に答える 4

1

より多くのマッパーが問題を解決するかどうかは正確にはわかりません。JobConf#setNumMapTasksは、ジョブごとに生成されるマップ タスクの # には影響しません。ドキュメントでさえ、それはフレームワークへのヒントにすぎないと言っています。生成されたマップ タスクの数は、ジョブの入力分割の数と同じです。InputSplit のサイズを小さくして InputSplit の数を増やし、マップ タスクの数を増やすためのさまざまなオプションを次に示します。

  • を変更して、HDFS ブロックのサイズを減らしますdfs.blocksize。ただし、これにより、より多くのファイルとブロックのマッピングを保持する必要があり、DataBlock レポートのサイズも増加するため、NameNode の負荷が増加します。また、hadoop fs -D fs.local.block.size=134217728 -put local_name remote_locationHDFS に配置される新しいファイルのブロック サイズが変更され、古いファイルはそのまま残ります。古いファイルを HDFS から取り出し、必要なブロック サイズで戻す必要があります。

  • NLineInputFormatを使用して、各マップへの入力行数を制御します。このためには、ジョブを変更する必要があります。mapred.line.input.format.linespermapこれはデフォルトで 1 に設定されているため、定義する必要があります。

  • 0.21 リリースから定義されていますが、新しい MR API を使用していますmapreduce.input.fileinputformat.split.minsizemapreduce.input.fileinputformat.split.maxsizeInputSplit の計算はクライアントで行われるため、ジョブ クライアントに強制することはできません。

InputSplit サイズを計算するロジックは次のとおりです。

protected long computeSplitSize(long blockSize, long minSize, long maxSize) {  
    return Math.max(minSize, Math.min(maxSize, blockSize));  
}
于 2011-11-17T04:55:52.163 に答える
1

実際の物理リソース (つまり、クラスター内のマシン) が不足している場合、マッパーを増やしても問題は解決しません。ランダムなハードドライブのシークを避けるために、データをより少ない入力ファイルにパックしようとします。

編集:より多くのマッパーが必要な場合は、データをいくつかの小さなファイルに分割するか、ブロックサイズを小さくしてください。

于 2011-11-16T18:32:23.220 に答える
1

これらのファイルのブロック サイズを増やすことができるはずです。そうすると、当然、アプリケーションで使用するマッパーがはるかに少なくなります。

ジョブ構成に map.input.length パラメーターがあることも覚えておいてください。これにより分割が増えるため、事実上、より大きな入力を持つマッパーが少なくなります。

于 2011-11-16T18:01:13.017 に答える
0

スケジューラを変更するために Hadoop をアップグレードする必要はありません。デフォルトのスケジューラを公平なスケジューラに変更することに成功しました。http://hadoop.apache.org/common/docs/r0.20.2/fair_scheduler.htmlの指示に従ってください。

于 2011-12-28T19:00:40.973 に答える