簡體   English   中英

使用Hadoop,如何更改給定作業的映射器數量?

[英]With Hadoop, how to change the number of mappers for a given job?

因此,我有兩個作業,作業A和作業B。對於作業A,我希望每個節點最多有6個映射器。 但是,作業B有點不同。 對於作業B,每個節點只能運行一個映射器。 這樣做的原因並不重要-可以說這個要求是不可談判的。 我想告訴Hadoop,“對於作業A,每個節點最多調度6個映射器。但是對於作業B,每個節點最多調度1個映射器。” 這有可能嗎?

我能想到的唯一解決方案是:

1)在主hadoop文件夾下有兩個文件夾conf.JobA和conf.JobB。 每個文件夾都有其自己的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時執行類似的操作。

我真的不喜歡這種解決方案。 似乎很容易出錯且容易失敗。 有沒有更好的方法來做我需要做的事情?

在自定義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節點數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM