Hadoop只有一个任务可以完成这项工作
我是hadoop的新手。现在我正在使用avro开发一个MapR程序。 在本地hadoop(1减速机)上运行时,程序逻辑正确, 但我在8节点CDH集群上遇到了一个问题,64个还原器中只有一个 真的做工作。 其他63名还原者的日志显示,他们并没有从mapper收到任何数据 我的数据处理并不复杂,其实很简单。 下面是映射器和还原器签名Hadoop只有一个任务可以完成这项工作,hadoop,mapreduce,avro,Hadoop,Mapreduce,Avro,我是hadoop的新手。现在我正在使用avro开发一个MapR程序。 在本地hadoop(1减速机)上运行时,程序逻辑正确, 但我在8节点CDH集群上遇到了一个问题,64个还原器中只有一个 真的做工作。 其他63名还原者的日志显示,他们并没有从mapper收到任何数据 我的数据处理并不复杂,其实很简单。 下面是映射器和还原器签名 public static class MyAvroMap extends Mapper<AvroKey<NetflowRecord>, NullWr
public static class MyAvroMap extends Mapper<AvroKey<NetflowRecord>, NullWritable,
Text, AvroValue<NetflowRecord>> {}
public static class MyAvroReduce extends Reducer<Text, AvroValue<NetflowRecord>,
AvroKey<NetflowRecord>, NullWritable> {}
公共静态类MyAvroMap扩展映射器{}
公共静态类MyAvroReduce扩展了Reducer{}
映射的输出键来自NetflowRecord的字符串字段。
选择洗牌键或avro的其他方面是否有问题?谢谢
更新:在上面的实验中,我使用了一个7GB的avro文件,只有一个减速机工作。
当我将输入量增加到数百GB时,其他减速机也开始工作。
正如我所知,Hadoop默认有64MB的文件拆分限制。但为什么在处理avro数据时,它的行为会有所不同
顺便说一句:我们不会更改CDH的默认文件分割参数(如果有)
Jamin这个问题似乎是因为从map生成的键导致在partitioner生成called之后只调用一个reducer。由于这个原因,其他63个减速器变空。因此,减缩器的调用取决于生成的键。请检查以下分区器逻辑:-
/** Partition keys by their {@link Object#hashCode()}. */
公共类HashPartitioner扩展了Partitioner{
/**使用{@link Object#hashCode()}进行分区*/
public int getPartition(K键,V值,
int NUMREDUCTAKS){
返回(key.hashCode()&Integer.MAX_值)%numReduceTasks;
}
}
在这里,返回值决定调用哪个减速机
我希望这能回答您的疑问。您的记录需要覆盖哈希代码。