0

我是hadoop的新手。现在我正在使用 avro 开发 MapR 程序。当针对本地hadoop(1个reducer)运行时程序的逻辑是正确的,但是我在8节点CDH集群上遇到了一个问题,即64个reducer中只有一个真正在做作业。其他 63 个 reducer 的日志显示,他们没有从 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 的字符串字段。选择随机播放键或其他关于 avro 的问题是否有任何问题?提前谢谢。

更新:在上面的实验中,我涉及了一个 7GB 的 avro 文件,只有一个减速器工作。当我将输入量增加到数百 GB 时,其他减速器也开始工作。据我所知,Hadoop 默认的文件拆分限制为 64MB。但是,为什么它在处理 avro 数据时表现不同呢?

顺便说一句:如果有,我们不会更改 CDH 的默认文件拆分参数。

贾敏

4

1 回答 1

1

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

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

公共类 HashPartitioner 扩展 Partitioner {

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

}

这里的返回值决定了调用哪个reducer。

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

于 2013-10-04T10:19:03.800 回答