Hadoop只有一份工作

时间:2013-10-04 09:21:47

标签: hadoop mapreduce avro

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

我的数据处理并不复杂,实际上非常简单。 下面是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的字符串字段派生的。 是否有选择随机播放键或其他任何关于avro的问题?谢谢。

更新:在上面的实验中,我参与了一个7GB的avro文件,只有一个减速器工作。 当我将输入量增加到数百GB时,其他减速器也开始工作。 据我所知,默认情况下Hadoop的文件分割限制为64MB。但是,为什么在对抗avro数据时它会有不同的行为?

BTW:我们不会更改CDH的默认文件拆分参数。

贾敏

1 个答案:

答案 0 :(得分:1)

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

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

public class HashPartitioner扩展了Partitioner {

/ **使用{@link Object#hashCode()}进行分区。 * /   public int getPartition(K key,V value,                           int numReduceTasks){     return(key.hashCode()&amp; Integer.MAX_VALUE)%numReduceTasks;   }

}

此处返回值决定调用哪个reducer。

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