运行 mapreduce 在 IDEA 中的本地机器上和集群上的 hadoop 中的不同输出
Different output while running mapreduce on local machine in IDEA and in hadoop on cluster
问题出在描述中。我有一些代码。
这是减速器。
public class RTopLoc extends Reducer<CompositeKey, IntWritable, Text, Text> {
private static int number = 0;
private static CompositeKey lastCK = new CompositeKey();
private static Text lastLac = new Text();
@Override
public void reduce(CompositeKey key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = sumValues(values);
String str = Integer.toString(sum);
String str2 = Integer.toString(number);
String str3 = key.getSecond().toString();
context.write(key.getFirst(), new Text(str3 + " " + str2 + " " + str));
if(number == 0){
number = sum;
lastCK = key;
context.write(new Text("1"), new Text("1"));
}
else if(lastCK.getFirst().equals(key.getFirst()) && sum > number){
lastCK = key;
context.write(new Text("2"), new Text("2"));
}
else if(!lastCK.getFirst().equals(key.getFirst())){
// context.write(lastCK.getFirst(), lastCK.getSecond());
context.write(new Text("3"), new Text("3"));
number = sum;
lastCK = key;
}
}
它 运行 没问题,直到减速器。然后,当我在 intelij idea 中 运行 时(在 windows 中),我得到
0000000000 44137 0 2
1 1
902996760100000 44137 2 6
3 3
9029967602 44137 6 8
3 3
90299676030000 44137 8 1
3 3
9029967604 44137 1 5
3 3
905000 38704 5 1
3 3
9050000001 38702 1 24
3 3
9050000001 38704 24 14
9050000001 38705 24 12
9050000001 38706 24 13
9050000001 38714 24 24
9050000002 38704 24 12
3 3
9050000002 38706 12 12
9050000011 38704 12 6
3 3
9050000011 38706 6 12
2 2
9050000021 38702 6 12
3 3
9050000031 38704 12 6
3 3
9050000031 38705 6 6
9050000031 38714 6 12
2 2
打包代码(我使用 maven)并 运行 在 hadoop 上(Linux)后,我得到
0000000000 44137 0 2
1 1
902996760100000 44137 2 6
2 2
9029967602 44137 2 8
2 2
90299676030000 44137 2 1
9029967604 44137 2 5
2 2
905000 38704 2 1
9050000001 38702 2 24
2 2
9050000001 38704 2 14
2 2
9050000001 38705 2 12
2 2
9050000001 38706 2 13
2 2
9050000001 38714 2 24
2 2
9050000002 38704 2 12
2 2
9050000002 38706 2 12
2 2
9050000011 38704 2 6
2 2
9050000011 38706 2 12
2 2
9050000021 38702 2 12
2 2
9050000031 38704 2 6
2 2
9050000031 38705 2 6
2 2
9050000031 38714 2 12
2 2
我用这个来 运行 代码。
hadoop jar Project.jar inputPath outputPath
看起来差异是由您存储的密钥 (lastCK) 的部分内容与当前密钥的比较问题造成的。
我会更改此行:
lastCK = key;
键和值在 Hadoop 中重复使用,因此当这是 运行 在真实集群上时,您的键将是相同的,因为 lastCK
和 key
都是相同的对象。
您需要将 key
正确复制到 lastCK
,也许使用 .set()
方法(您编写并且是 hadoop 中的常见模式)或创建一个新的使用接受 CompositeKey
.
的构造函数
问题出在描述中。我有一些代码。
这是减速器。
public class RTopLoc extends Reducer<CompositeKey, IntWritable, Text, Text> {
private static int number = 0;
private static CompositeKey lastCK = new CompositeKey();
private static Text lastLac = new Text();
@Override
public void reduce(CompositeKey key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = sumValues(values);
String str = Integer.toString(sum);
String str2 = Integer.toString(number);
String str3 = key.getSecond().toString();
context.write(key.getFirst(), new Text(str3 + " " + str2 + " " + str));
if(number == 0){
number = sum;
lastCK = key;
context.write(new Text("1"), new Text("1"));
}
else if(lastCK.getFirst().equals(key.getFirst()) && sum > number){
lastCK = key;
context.write(new Text("2"), new Text("2"));
}
else if(!lastCK.getFirst().equals(key.getFirst())){
// context.write(lastCK.getFirst(), lastCK.getSecond());
context.write(new Text("3"), new Text("3"));
number = sum;
lastCK = key;
}
}
它 运行 没问题,直到减速器。然后,当我在 intelij idea 中 运行 时(在 windows 中),我得到
0000000000 44137 0 2
1 1
902996760100000 44137 2 6
3 3
9029967602 44137 6 8
3 3
90299676030000 44137 8 1
3 3
9029967604 44137 1 5
3 3
905000 38704 5 1
3 3
9050000001 38702 1 24
3 3
9050000001 38704 24 14
9050000001 38705 24 12
9050000001 38706 24 13
9050000001 38714 24 24
9050000002 38704 24 12
3 3
9050000002 38706 12 12
9050000011 38704 12 6
3 3
9050000011 38706 6 12
2 2
9050000021 38702 6 12
3 3
9050000031 38704 12 6
3 3
9050000031 38705 6 6
9050000031 38714 6 12
2 2
打包代码(我使用 maven)并 运行 在 hadoop 上(Linux)后,我得到
0000000000 44137 0 2
1 1
902996760100000 44137 2 6
2 2
9029967602 44137 2 8
2 2
90299676030000 44137 2 1
9029967604 44137 2 5
2 2
905000 38704 2 1
9050000001 38702 2 24
2 2
9050000001 38704 2 14
2 2
9050000001 38705 2 12
2 2
9050000001 38706 2 13
2 2
9050000001 38714 2 24
2 2
9050000002 38704 2 12
2 2
9050000002 38706 2 12
2 2
9050000011 38704 2 6
2 2
9050000011 38706 2 12
2 2
9050000021 38702 2 12
2 2
9050000031 38704 2 6
2 2
9050000031 38705 2 6
2 2
9050000031 38714 2 12
2 2
我用这个来 运行 代码。
hadoop jar Project.jar inputPath outputPath
看起来差异是由您存储的密钥 (lastCK) 的部分内容与当前密钥的比较问题造成的。
我会更改此行:
lastCK = key;
键和值在 Hadoop 中重复使用,因此当这是 运行 在真实集群上时,您的键将是相同的,因为 lastCK
和 key
都是相同的对象。
您需要将 key
正确复制到 lastCK
,也许使用 .set()
方法(您编写并且是 hadoop 中的常见模式)或创建一个新的使用接受 CompositeKey
.