Hadoop DBInputWritable引发异常

Hadoop DBInputWritable引发异常,hadoop,Hadoop,需要您的宝贵见解。在地图类中,将输入作为文本而不是DBInputWritable: 我可以发现两个问题: 映射器输出键、值类与作业配置不匹配。请检查一下。 配置作业时映射程序。请根据您的需要进行更正。考虑到映射器密钥,我将处理第二个问题,值对是您的正确选择 您没有覆盖reduce方法 根据您的工作配置,签名应为: public class Map extends Mapper { public void map(LongWritable key,Text value, Context ctx

需要您的宝贵见解。

在地图类中,将输入作为文本而不是DBInputWritable:

我可以发现两个问题:

映射器输出键、值类与作业配置不匹配。请检查一下。 配置作业时映射程序。请根据您的需要进行更正。考虑到映射器密钥,我将处理第二个问题,值对是您的正确选择

您没有覆盖reduce方法

根据您的工作配置,签名应为:

public class Map extends Mapper {
  public void map(LongWritable key,Text value, Context ctx)   
对你的例外情况的解释

由于您没有覆盖Reducer的reduce,因此Reducer将使用默认实现(称为identity Reducer)进行缩减。源代码:

public void reduce(Text key, Iterable<Text> values, Context context){
         //...your code
}
正如在源代码中指定的,它只是在值上迭代并使用输出键值calss写入。但是在您的例子中,intermediate pairsi.e intwriteable,文本与DBoutputFormat对不匹配


没有。。Mapper运行得很好。。问题出在减速器上。我可以从数据库中读取值,但由于某些原因,它无法写入。请参阅错误一次。如果您花一些时间对齐代码,它将更可读。。谢谢你的见解。我发现我错误地发布了一个不同的主类。我为我的错误道歉。请现在检查错误。同时,我会按照你的建议修改减速器。但我不这么认为。Iterable是强制性的。如您所见,映射器输出的键已经是唯一的。在reducer端没有聚合的范围。所以我们不需要为单个值使用迭代器。不,您需要按照指定重写reduce方法。否则,它将按照说明继续使用默认实现。因为它很好地从异常中清除了,所以采用默认impl!
public class Map extends Mapper {
  public void map(LongWritable key,Text value, Context ctx)   
public void reduce(Text key, Iterable<Text> values, Context context){
         //...your code
}
protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context
                      ) throws IOException, InterruptedException {
   for(VALUEIN value: values) {
   context.write((KEYOUT) key, (VALUEOUT) value);
 }
}