【问题标题】:Hadoop Custom Partitioner not behaving according to the logicHadoop Custom Partitioner 的行为不符合逻辑
【发布时间】:2015-07-20 13:09:22
【问题描述】:

基于此示例here,此方法有效。在我的数据集上尝试过同样的方法。

样本数据集:

OBSERVATION;2474472;137176;
OBSERVATION;2474473;137176;
OBSERVATION;2474474;137176;
OBSERVATION;2474475;137177;

将每一行视为字符串,我的 Mapper 输出为:

键-> 字符串[2],值-> 字符串。

我的分区代码:

@Override
public int getPartition(Text key, Text value, int reducersDefined) {

    String keyStr = key.toString();
    if(keyStr == "137176") {
        return 0;
    } else {
        return 1 % reducersDefined;
    }
}

在我的数据集中,大多数 id 是 137176。Reducer 声明为 -2。我希望有两个输出文件,一个用于 137176,第二个用于剩余的 ID。我得到两个输出文件,但是 Id 均匀分布在两个输出文件上。我的程序出了什么问题?

【问题讨论】:

  • 您能否也发布您的 Mapper 代码和 Reducer 代码。你设置了这个属性。 job.setNumReduceTasks(2);并检查您是否传递了正确的键值对。

标签: java hadoop mapreduce partitioner


【解决方案1】:
  1. 通过使用:job.setPartitionerClass(YourPartitioner.class);,在您要使用自定义分区器的驱动程序方法中显式设置。如果不这样做,则使用默认的 HashPartitioner。

  2. 将字符串比较方法从== 更改为.equals()。即,将if(keyStr == "137176") { 更改为if(keyStr.equals("137176")) {
    为了节省一些时间,在分区器的开头声明一个新的 Text 变量可能会更快,例如:Text KEY = new Text("137176"); 然后,无需每次都将输入键转换为字符串,只需将其与 KEY 进行比较变量(再次使用equals() 方法)。但也许这些是等价的。所以,我的建议是:

    文本键 = 新文本(“137176”); @覆盖 public int getPartition(Text key, Text value, int reducersDefined) { 返回 key.equals(KEY) ? 0 : 1 % 减速器定义; }

另外一个建议,如果网络负载很重,将map输出key解析为VIntWritable,并相应更改Partitioner。

【讨论】:

  • 谢谢。我已经评论了 job.setPartitionerClass(Partitioner.class)。感谢第 2 点的建议。
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2016-03-18
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
相关资源
最近更新 更多