hadoop只有一个任务可以完成这项工作

czfnxgou  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(313)

我是hadoop的新手。现在我正在使用avro开发一个mapr程序。当在本地hadoop(1个reducer)上运行时,程序的逻辑是正确的,但是我在8节点cdh集群上遇到了一个问题:64个reducer中只有一个真正执行任务。其他63个还原器的日志显示,它们没有从mapper接收到任何数据。
我的数据处理并不复杂,其实很简单。下面是mapper和reducer签名。

public static class MyAvroMap extends Mapper<AvroKey<NetflowRecord>, NullWritable,
                                             Text, AvroValue<NetflowRecord>> {}
public static class MyAvroReduce extends Reducer<Text, AvroValue<NetflowRecord>, 
                                             AvroKey<NetflowRecord>, NullWritable> {}

Map的输出键来自netflowrecord的字符串字段。选择shuffle键或avro有什么问题吗?谢谢你。
更新:在上面的实验中,我使用了一个7gbavro文件,只有一个reducer工作。当我将输入容量增加到数百gb时,其他的减速机也开始工作了。据我所知,hadoop默认的文件分割限制是64mb。但为什么它在处理avro数据时会有不同的行为呢?
顺便说一句:我们不改变默认的文件分割参数的cdh,如果它有。
贾明

yzuktlbb

yzuktlbb1#

这个问题似乎是因为从map生成的键导致在partitioner生成called之后只调用一个reducer。由于这个原因,其他63个减速器变空。因此,reducer的调用取决于生成的键。请检查分区逻辑below:-

/**Partition keys by their {@link Object#hashCode()}. */

公共类hashpartitioner扩展了partitioner{
/**使用{@link object#hashcode()}进行分区。*/public int getpartition(k key,v value,int numreducetasks){返回(key.hashcode()&integer.max\u value)%numreducetasks;}
}
在这里,返回值决定调用哪个reducer。
我希望这能回答你的疑问。

相关问题