我对AWS EMR执行的MapReduce机制感到困惑。根据我的理解,您只需要确定输入文件的目录,识别mapper和reducer函数,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
...
放在同一目录下。我的映射器程序只是打印出这些行,并希望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确实在每个文件中单独减少了工作,而不是整个目录。以前有人遇到过这种情况吗?我认为结果文件应该完全排序,我可以通过连接每个部分来构建整个排序文件。