未调用 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中调用它

Hadoop Oozie MapReduce 操作自定义分区器

Hadoop学习之路MapReduce自定义分区实现