【问题标题】:Hadoop only one job do the workHadoop 只做一项工作
【发布时间】:2013-10-04 09:21:46
【问题描述】:

我是 hadoop 的新手。现在我正在使用 avro 开发 MapR 程序。 当针对本地hadoop(1个reducer)运行时,程序的逻辑是正确的, 但是我遇到了一个针对 8 节点 CDH 集群的问题,即 64 个减速器中只有一个 真正做好工作。 其他 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 文件,并且只有一个 reducer 工作。 当我将输入量增加到数百 GB 时,其他减速器也开始工作。 据我所知,Hadoop 默认的文件拆分限制为 64MB。但为什么它在处理 avro 数据时表现不同呢?

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

贾敏

【问题讨论】:

  • 你的记录需要覆盖hashCode。

标签: hadoop mapreduce avro


【解决方案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。

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

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 2022-11-25
    • 2016-09-09
    • 1970-01-01
    • 2017-10-07
    • 2017-02-25
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多