当前位置: 首页 > 知识库问答 >
问题:

当减速器的输出值为空时,如何使用合并器?

澹台衡
2023-03-14

当我试图在我的MR工作中使用合并器时,我得到了下面的异常

Java . lang . nullpointerexception < br > at org . Apache . Hadoop . mapred . ifile$writer . append(ifile . Java:193)< br > at org . Apache . Hadoop . mapred . task$combineoutputcollector . collect(task . Java:1315)

位于org . Apache . Hadoop . mapred . task$newcombinerrrunner$output converter . write(task . Java:1632)

原因是,我在化简器类中使用 null 作为我的输出值。

public  static class reducer extends Reducer<Text,IntWritable,Text,IntWritable>{
            public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{
                context.write(key, null);
            }
    }

当我删除组合器类作业.set组合器类(化简器.class);工作正在取得成功。

如何实现组合器,我需要相同的减速机输出ie,只有键作为输出?

共有1个答案

高承望
2023-03-14

这是不可能实现的。问题是IFile.java中的以下代码:

public void append(K key, V value) throws IOException {
    .....

    if (value.getClass() != valueClass)
        throw new IOException("wrong value class: "+ value.getClass()
                          +" is not "+ valueClass);

    .....

在< code>append()函数中,有一个检查:

if (value.getClass() != valueClass)

由于您将< code>null作为值传递,因此当< code>null值尝试< code>getClass()时,会引发< code > NullPointerException :

value.getClass()

因此,即使您使用<code>NullWritable

您应该通过传递0(零)来管理,而不是传递null

 类似资料:
  • 问题内容: 我想使用嵌套化简器,而不是在作为第一个参数传递给的主化简器中使用嵌套的switch语句(甚至可以这样做?)。这是因为我的减速器功能取决于多个(第一个操作,然后是水果类型)。 我查找了“嵌套的简化器”,但是这些问题的解决方案似乎都与redux和挂钩,而Hooks却没有。 演示代码(即使codesandbox再次关闭): 它实际上并没有显示在codesandbox中(因为沙箱本身无法正常工

  • 我正在用Hadoop写一个mapreduce。在reduce方法中,我想用context.write()。但是输出是int类型。我该怎么做?当我使用context.write()时,它显示一个错误: 第二个参数不能是int。 这是我的代码: 这个减少计算一些东西。然后它应该写键和计数变量。 我该怎么做? 答复 我找到了我的答案。我应该新建一个IntWritable类并使用它的方法(set(intV

  • 每个Hadoop开发者都知道合并器是优化mapreduce的关键,但它是可选的。它可以最小化带宽并提高mapreduce作业性能。在这里,我的问题是,hadoop在默认情况下提供了许多功能,如数据局部性问题,但没有将组合器作为默认值。为什么?这意味着在所有情况下合并器都是不可取的?当我们不使用合成器时。如果我将它设为默认值,会有什么问题呢?

  • 我在HadoopJavaAPI(1.0.3)中编写了一个Map Reduce作业。该作业包括对数据中特定字段(X)的所有值求和,并创建其他字段的加权分布。 输入: 由于我的数据中的任何一行都发出一对,并且我需要使用单个减法器来求和所有值,因此我想将相同的Reduce类设置为组合器。 总计 X 求和: 地图输出: 减少输出: 奇怪的是,合并器/缩减器会多次收到相同的密钥: 我很确定这一点,因为我正在

  • 我有一个简单的地图减少工作,我正在建立反向索引。 我的映射器工作正常(我检查过了),并输出了word和docID:TFIDF值的密钥对: 映射器(仅显示输出): 化简器的唯一工作是组合这些值。这是我的实现: 然而,它没有组合任何东西,输出看起来基本上与来自映射器的相同。输出中有一些行具有相同的键,尽管reducer应该将它们组合起来——基本上,使用reducer时,输出文件中的所有键都应该是唯一的

  • 我正在使用Guava缓存热数据。当缓存中不存在数据时,我必须从数据库中获取数据: 我的问题是当数据不存在于数据库中时,我希望它返回并且不做任何缓存。但Guava保存与缓存中的关键字,并抛出一个异常,当我得到它: com.google.common.cache.CacheLoader$InvalidCacheLoadExcION: CacheLoader为shisoft键返回null。 我们如何避免