2

したがって、ジョブ A とジョブ B の 2 つのジョブがあります。ジョブ A については、ノードごとに最大 6 つのマッパーを使用したいと考えています。ただし、ジョブ B は少し異なります。ジョブ B では、ノードごとに 1 つのマッパーしか実行できません。この理由は重要ではありません。この要件は交渉の余地がないとだけ言っておきましょう。Hadoop には、「ジョブ A の場合、ノードあたり最大 6 つのマッパーをスケジュールしますが、ジョブ B の場合、ノードあたり最大 1 つのマッパーをスケジュールします」と伝えたいと思います。これはまったく可能ですか?

私が考えることができる唯一の解決策は次のとおりです。

1) メインの Hadoop フォルダーから conf.JobA と conf.JobB の 2 つのフォルダーを作成します。各フォルダーには、mapred-site.xml の独自のコピーがあります。conf.JobA/mapred-site.xml の mapred.tasktracker.map.tasks.maximum の値は 6 です。conf.JobB/mapred-site.xml の mapred.tasktracker.map.tasks.maximum の値は 1 です。

2) ジョブ A を実行する前に:

2a) タスクトラッカーをシャットダウンする

2b) conf.JobA/mapred-site.xml を Hadoop の conf フォルダーにコピーし、既にそこにあった mapred-site.xml を置き換えます。

2c) タスクトラッカーを再起動する

2d) タスクトラッカーの起動が完了するまで待ちます

3) ジョブ A を実行する

ジョブ B を実行する必要がある場合は、同様のことを行います。

私はこの解決策が本当に好きではありません。それは無愛想で失敗しやすいようです。私がする必要があることを行うためのより良い方法はありますか?

4

1 に答える 1

0

カスタム jar 自体の Java コードでは、mapred.tasktracker.map.tasks.maximum両方のジョブに対してこの構成を設定できます。

次のようにします。

Configuration conf = getConf();

// set number of mappers
conf.setInt("mapred.tasktracker.map.tasks.maximum", 4);

Job job = new Job(conf);

job.setJarByClass(MyMapRed.class);
job.setJobName(JOB_NAME);

job.setInputFormatClass(TextInputFormat.class);
job.setMapperClass(MapJob.class);
job.setMapOutputKeyClass(Text.class);
job.setReducerClass(ReduceJob.class);
job.setMapOutputValueClass(Text.class);
job.setOutputFormatClass(TextOutputFormat.class);

FileInputFormat.setInputPaths(job, args[0]);

boolean success = job.waitForCompletion(true);
return success ? 0 : 1;

編集

mapred.map.tasks また、プロパティを次の式 ( mapred.tasktracker.map.tasks.maximum * クラスター内の tasktracker ノードの数) から得られる値に設定する必要があります。

于 2013-03-12T07:22:33.297 に答える