我只是对aws emr执行的mapreduce机制感到困惑。据我所知,您只需要识别输入文件的目录,识别Map器和缩减器函数,emr将帮助您进行无序排列和排序。然而,当我试着运行一个类似字数统计的程序时,却失败了。
我试图从csv文件中删除重复的ID(第一个字段),如下所示:
1712783,AA,B,C
28218,m,wiw,oo
28218,oqoo,now,ee
76812,wpq,oei,od
23192,kwl,lqo,pr,
23192,qow,pd,82,
1712783,qow,lf,s
...
它们被放在同一个目录下。我的mapper程序只是打印出这些行,希望emr能帮助我对具有相同id的条目进行排序。
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while((line = br.readLine()) != null){
System.out.println(line);
}
}
我的reducer程序试图读取每个条目,并试图识别这个条目是否与上一个条目具有相同的id。忽略与以前具有相同id的。
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
String lastId = null;
String currentId = null;
while((line = br.readLine()) != null){
currentId = line.split(",")[0];
if(lastId == null || !currentId.equals(lastId){
lastId = currentId
System.out.println(line);
}
}
}
当我试着在本地机器上用一个特定的文件和bash脚本运行程序来模拟bash排序过程时,效果很好。然而,当我在emr上尝试我的程序时,我发现了结果文件 part-00000, part-00001, part00002 ...
是部分排序的,条目是按每个文件中的id排序的,有时相同的id出现在不同的文件中。怎么会这样?看起来emr确实在每个文件中单独Map减少了工作量,而不是整个目录。以前有人遇到过这种情况吗?我认为结果文件应该全部排序,我可以通过连接每个部分来构建一个完整的排序文件。
暂无答案!
目前还没有任何答案,快来回答吧!