未调用 hadoop mapreduce 分区程序
Posted
技术标签:
【中文标题】未调用 hadoop mapreduce 分区程序【英文标题】:hadoop mapreduce partitioner not invoked 【发布时间】:2014-03-06 09:58:31 【问题描述】:我需要有关 mapreduce 工作的帮助,我的自定义分区器从未被调用。我检查了所有内容数百万次,但没有结果。前一阵子还可以用,不知道为什么现在不行了。 任何帮助都会非常感激。 我正在添加代码(对于非常简单的情况,它也不适用于自定义键作为输入)。 Mapper 输出正确的值 100%,然后 partitioner 被跳过。
//import of libs
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
...
public class hbaseCountTest extends Configured implements Tool
....
static class myMapper extends TableMapper<Text,Text>
@Override
public void map(ImmutableBytesWritable rowKey,Result result, Context context) throws IOException
...... //dropping some calculations
context.write(new Text(gender), new Text(capsStr)); // everything is right here, checked.
public static class myPartitioner extends Partitioner<Text, Text>
@Override
public int getPartition(Text key, Text value, int NumReduceTasks)
//getPartitioner IS NEVER INVOKED
System.out.println("partitioner started");
String heur = value.toString().split(":")[0];
int h = Integer.parseInt(heur);
if (h<10)
... return... //dropping some calculations
else if (h>9 && h<19)
...
else
...
@Override
public int run(String[] arg0) throws Exception
Job job = Job.getInstance(getConf(), "jobName1");
job.setNumReduceTasks(3);
job.setJarByClass(getClass());
Configuration conf = job.getConfiguration();
HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));
conf.addResource("/home/hadoop/Training/CDH4/hadoop-2.0.0-cdh4.0.0/conf/hadoop-local.xml");
conf.addResource("/home/hadoop/Training/CDH4/hadoop-2.0.0-cdh4.0.0/conf/mapred-site.xml");
FileSystem fs = FileSystem.get(getConf());
if (fs.exists(new Path(arg0[0])))
fs.delete(new Path(arg0[0]));
Scan scan = new Scan();
scan.addColumn(toBytes(famName), toBytes(colNamePage));
scan.addColumn(toBytes(famName), toBytes(colNameTime));
scan.addColumn(toBytes(famName1), toBytes(colNameRegion));
scan.addColumn(toBytes(famName1), toBytes(colNameGender));
TableMapReduceUtil.initTableMapperJob(tableName, scan, myMapper.class, Text.class, Text.class, job);
job.setPartitionerClass(myPartitioner.class);
job.setReducerClass(myReducer.class);
job.setOutputFormatClass(TextOutputFormat.class);
TextOutputFormat.setOutputPath(job, new Path(arg0[0]));
job.setOutputKeyClass(TextOutputFormat.class);
job.setOutputValueClass(TextOutputFormat.class);
job.setNumReduceTasks(3);
return job.waitForCompletion(true)?0:1;
非常感谢, 亚历克斯
【问题讨论】:
你在看什么并说你的分区器没有被调用? 我尝试在本地模式下进行调试,然后在伪模式下查看 system.out.println 是否在 Eclipse 的控制台窗口中给了我消息,结果我看到分区没有不会发生。顺便说一句,使用 -partitioner 选项从命令行启动 jar 它可以工作 =/ 我不明白为什么它在 hadoop 中不起作用 hmm...这可能是因为 conf 没有选择客户分区...让我们在驱动程序类中查看更多 如果没有 -partitioner 选项从命令行启动 jar 呢?我在 eclipse-plugin 上也遇到了类似的问题,并且在 jar 中一切正常。 是的,即使没有 -partitioner 选项,它也可以在命令行中工作。但不是在 eclipse =/ 除了它曾经在 eclipse 中工作......也许我只是错过了一些东西...... 【参考方案1】:尝试将 reducer 的数量设置为大于唯一键数量的任意数字。
【讨论】:
以上是关于未调用 hadoop mapreduce 分区程序的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop3 - MapReduce 分区介绍及自定义分区
Hadoop3 - MapReduce 分区介绍及自定义分区
2021年大数据Hadoop(十九):MapReduce分区
如何在python中为Hadoop Map Reduce作业编写组合器和分区器?我如何在Hadoop Job中调用它