Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop只有一个任务可以完成这项工作_Hadoop_Mapreduce_Avro - Fatal编程技术网

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

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

我是hadoop的新手。现在我正在使用avro开发一个MapR程序。 在本地hadoop(1减速机)上运行时,程序逻辑正确, 但我在8节点CDH集群上遇到了一个问题,64个还原器中只有一个 真的做工作。 其他63名还原者的日志显示,他们并没有从mapper收到任何数据

我的数据处理并不复杂,其实很简单。 下面是映射器和还原器签名

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; }

}

在这里,返回值决定调用哪个减速机


我希望这能回答您的疑问。

您的记录需要覆盖哈希代码。