我是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,如果它有。
贾明
1条答案
按热度按时间yzuktlbb1#
这个问题似乎是因为从map生成的键导致在partitioner生成called之后只调用一个reducer。由于这个原因,其他63个减速器变空。因此,reducer的调用取决于生成的键。请检查分区逻辑below:-
公共类hashpartitioner扩展了partitioner{
/**使用{@link object#hashcode()}进行分区。*/public int getpartition(k key,v value,int numreducetasks){返回(key.hashcode()&integer.max\u value)%numreducetasks;}
}
在这里,返回值决定调用哪个reducer。
我希望这能回答你的疑问。