我是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的默认文件拆分参数。
贾敏
答案 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。
我希望这能回答你的疑问。