【问题标题】:Hadoop application cannot find ReducerHadoop 应用程序找不到 Reducer
【发布时间】:2015-09-18 13:24:48
【问题描述】:

我正在尝试制作一个从 Hbase 表读取并将作业结果写入文本文件的 mapreduce 应用程序。我的驱动程序代码如下所示:

    Configuration conf = HBaseConfiguration.create();
    Job job = Job.getInstance (conf, "mr test");
    job.setJarByClass(Driverclass.class);
    job.setCombinerClass(reducername.class);
    job.setReducerClass(reducername.class);

    Scan scan = new Scan();
    scan.setCaching(500);            
    scan.setCacheBlocks(false);        

    String qualifier = "qualifname"; // comma seperated
    String family= "familyname";
    scan.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier));

    TableMapReduceUtil.initTableMapperJob("tablename", 
                                           scan, 
                                           mappername.class, 
                                           Text.class, Text.class, 
                                           job);

当 initTableMapperJob 被调用时,我得到一个 ClassNotFoundException: class reducername not found。

该类在同一个包内的另一个 java 文件中定义。我使用几乎相同的配置来尝试通常的 wordcount 示例并且工作正常。然后我改变了映射器的类型和它的配置方式,我得到了这个错误。有人可以帮我吗?

编辑:reducer类的代码是:

package mr.roadlevelmr;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Reducer;
public class reducername extends Reducer <Text, Text, Text, Text>{
    private Text result= new Text();

    public void reduce (Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException{
       ArrayList<String> means = new ArrayList<String>();
        for (Text val : values){
            means.add(String.valueOf(val.getBytes()));
        }
        result.set(newMean(means));
        context.write(key, result);
    }

【问题讨论】:

  • 抛出异常的那一行
  • 你能把你的reducer类的基本结构贴出来吗?
  • 嗨彼得,这是引发异常的最后一行。我用减速器类编辑问题
  • 是的,它们在不同的 java 文件中但在同一个包中
  • 你试过下面的提示了吗?

标签: java hadoop hbase reducers


【解决方案1】:

您应该按如下方式使用 Map reduce 工具:

TableMapReduceUtil.initTableMapperJob("tablename", 
                                       scan, 
                                       mappername.class, 
                                       Text.class, Text.class, 
                                       job);Ok think I found the issue! 

比添加reducer和combiner

job.setCombinerClass(reducername.class);
job.setReducerClass(reducername.class);
boolean b = job.waitForCompletion(true);

而不是将 reducer 添加到表映射器作业中

【讨论】:

    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    相关资源
    最近更新 更多