[英]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.