Hadoop Custom Partitioner 的行为不符合逻辑
Hadoop Custom Partitioner not behaving according to the logic
基于此示例 here,这有效。在我的数据集上尝试过相同的方法。
示例数据集:
OBSERVATION;2474472;137176;
OBSERVATION;2474473;137176;
OBSERVATION;2474474;137176;
OBSERVATION;2474475;137177;
将每一行视为字符串,我的 Mapper 输出是:
key-> string[2], value-> string.
我的分区程序代码:
@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 均匀分布在两个输出文件上。我的程序出了什么问题?
在 Driver 方法中明确设置您要使用自定义分区程序,方法是:job.setPartitionerClass(YourPartitioner.class);
。如果不这样做,将使用默认的 HashPartitioner。
将字符串比较方法从 ==
更改为 .equals()
。即,将 if(keyStr == "137176") {
更改为 if(keyStr.equals("137176")) {
。
为了节省一些时间,也许在分区程序的开头声明一个新的 Text 变量会更快,例如: Text KEY = new Text("137176");
然后,无需每次都将输入键转换为 String,只需将其与 KEY
变量(再次使用 equals()
方法)。但也许这些是等价的。所以,我的建议是:
Text KEY = new Text("137176");
@Override
public int getPartition(Text key, Text value, int reducersDefined) {
return key.equals(KEY) ? 0 : 1 % reducersDefined;
}
另一个建议,如果网络负载很重,将映射输出键解析为VIntWritable,并相应地更改Partitioner。
基于此示例 here,这有效。在我的数据集上尝试过相同的方法。
示例数据集:
OBSERVATION;2474472;137176;
OBSERVATION;2474473;137176;
OBSERVATION;2474474;137176;
OBSERVATION;2474475;137177;
将每一行视为字符串,我的 Mapper 输出是:
key-> string[2], value-> string.
我的分区程序代码:
@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 均匀分布在两个输出文件上。我的程序出了什么问题?
在 Driver 方法中明确设置您要使用自定义分区程序,方法是:
job.setPartitionerClass(YourPartitioner.class);
。如果不这样做,将使用默认的 HashPartitioner。将字符串比较方法从
==
更改为.equals()
。即,将if(keyStr == "137176") {
更改为if(keyStr.equals("137176")) {
。
为了节省一些时间,也许在分区程序的开头声明一个新的 Text 变量会更快,例如:Text KEY = new Text("137176");
然后,无需每次都将输入键转换为 String,只需将其与KEY
变量(再次使用equals()
方法)。但也许这些是等价的。所以,我的建议是:Text KEY = new Text("137176"); @Override public int getPartition(Text key, Text value, int reducersDefined) { return key.equals(KEY) ? 0 : 1 % reducersDefined; }
另一个建议,如果网络负载很重,将映射输出键解析为VIntWritable,并相应地更改Partitioner。