我写了映射和Reduce程序,其中reducer的输出键和值不同于它的输入或映射器的输出。我在司机班上做了适当的改变。下面是我在运行它时得到的异常:
信息MapReduce.job:任务Id:Attribut_1550670375771_4211_M_0000032,状态:失败错误:java.io.ioException:map中的值类型不匹配:expected org.apache.hadoop.io.text,received org.apache.hadoop.maptask$MapOutputBuffer.Collect(maptask.java:1084).在org.apache.hadoop.mapreduce.lib.map.wrappedmapper$context.write(wrappdmapper.java:112)在com.hirw.maxClosePrice.myHadoopmapper.map(myHadoopmapper.java:20)在com.hirw.maxClosePrice.myHadoopmapper.map(myHadoopmapper.java:1)在org.apache.hadoop.maprede.mapper.run(mapper.java:145)在runnewMapper(maptask.java:793),地址为org.apache.hadoop.mapred.maptask.run(maptask.java:341),地址为org.apache.hadoop.mapred.yarnchild$2.run(yarnchild.java:164),地址为java.security.accessController.doPrivileged(本机方法),地址为javax.security.auth.subject.doas(Subject.java:415),地址为org.apache.hadoop.security.usergroupinformation.doas(usergroupinformation.java:1920),地址为org.apache.hadoop.mapred.yarnchild.main(yarnchild.java:158)
19/04/16 22:24:50 INFO MapReduce.Job:map 100%reduce 100%19/04/16 22:24:50 INFO MapReduce.Job:job_1550670375771_4211失败,状态失败,原因是:任务失败task_1550670375771_4211_m_000001任务失败时作业失败。FailedMaps:1 FailedReduces:0
当Reducer的KeyOut和ValueOut与Mapper的KeyOut和ValueOut相同时,它可以工作,但当它们不同时,它就失效了。
我的映射器类:公共类MyHadoopMapper扩展映射器{
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] recordItems = value.toString().split(",");
String stock = recordItems[1];
Float stockValue = Float.parseFloat(recordItems[6]);
context.write(new Text(stock), new FloatWritable(stockValue));
}
}
减速器类:
公共类MyHadoopReducer扩展Reducer{
@Override
public void reduce(Text key, Iterable<FloatWritable> values, Context context
) throws IOException, InterruptedException {
Float maxVal = Float.MIN_VALUE;
for (FloatWritable stockValue : values) {
maxVal = stockValue.get() > maxVal ? stockValue.get() : maxVal;
}
context.write(key, new Text(String.valueOf(maxVal)));
}
}
驱动程序类:公共类MyHadoopDriver{
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// TODO Auto-generated method stub
Job hadoopJob = new Job();
hadoopJob.setJarByClass(MyHadoopDriver.class);
hadoopJob.setJobName("MyStockPrice");
FileInputFormat.addInputPath(hadoopJob, new Path("/user/hirw/input/stocks"));
FileOutputFormat.setOutputPath(hadoopJob, new Path("stocksData"));
hadoopJob.setInputFormatClass(TextInputFormat.class);
hadoopJob.setOutputFormatClass(TextOutputFormat.class);
hadoopJob.setMapperClass(MyHadoopMapper.class);
hadoopJob.setReducerClass(MyHadoopReducer.class);
hadoopJob.setCombinerClass(MyHadoopReducer.class);
hadoopJob.setOutputKeyClass(Text.class);
hadoopJob.setOutputValueClass(Text.class);
System.exit(hadoopJob.waitForCompletion(true) ? 0: 1);
}
}
默认情况下,映射器输出类型为Text,而您使用floatwritable。这就是例外告诉你的。您需要指定映射器输出类型,如下所示:
job.setMapOutputValueClass(FloatWritable.class)
我有一个简单的地图减少工作,我正在建立反向索引。 我的映射器工作正常(我检查过了),并输出了word和docID:TFIDF值的密钥对: 映射器(仅显示输出): 化简器的唯一工作是组合这些值。这是我的实现: 然而,它没有组合任何东西,输出看起来基本上与来自映射器的相同。输出中有一些行具有相同的键,尽管reducer应该将它们组合起来——基本上,使用reducer时,输出文件中的所有键都应该是唯一的
问题内容: 我有一个表X,该表具有一个自动递增的ID列作为其主键。我还有其他表A,B,C和D,它们补充了表X中的信息。每个表都必须包含一个引用表X中ID的列。我已经这样做了,并且在我的代码(Java)中,将每个条目的ID返回到表X并在插入其他表时使用该ID的方法。一切都很好。 现在,建议我将表A,B,C和D上的ID列分配为FOREIGN KEYS,因为“这是正确的做法”。我做到了 现在,从表X中删
按照我的理解,当一个动作被调用时,所有的减速器都响应。如果action存在于reducer的语句中,则执行action。如果没有,则执行,保留现有状态。 当操作存在于reducer中,但它试图更新的特定属性不存在时,它似乎表现良好,因为没有什么可更新的。 例如,我有一个action creator,用于设置Modals的属性。每个模式都有自己的。我的代码如下所示: 我在多个精简器中都有,但是如果没
我正在使用MapReduce为web搜索建立一个倒排索引。我知道如何使用一个键类型的MapReduce,您在这里设置它: 但是,如果我的密钥可以是不同类型的,那是不是支持呢?例如,一个键可能只是文本,另一个键可能是PairofWritables。我想为从映射器到reducer的输出,以及从reducer到最终输出的输出设置不同的键类型。我已经看到了一个名为MultipleOutput的类,它允许指
我正在尝试编写一个MapReduce作业,该作业可以解析CSV文件,将数据存储在HBase中并一次性执行简化函数。理想情况下,我想要 映射器输出良好记录到 HBase 表良好 映射器将坏记录输出到 HBase 表坏 映射器使用键将所有好的数据发送到化简器 还希望更新第三个表,表明存在新数据。此表将包含有关数据和日期的基本信息。最有可能的是每个 CSV 文件的一条或两条记录。 我知道如何使用HBas
合并器在映射器之后、缩减器之前运行,它将接收由给定节点上的映射器实例发出的所有数据作为输入。然后输出到减速器。 而且,如果一个化简函数既是可交换的又是结合的,那么它可以用作组合器。 我的问题是,在这种情况下,“交换和结合”这个短语是什么意思?