1.问题:当一个mapreduce程序的输入是很多个mapreduce的输出时,由于input默认只能是一个路径,需要把这些文件合并起来成一个文件。hadoop里提供了这样的函数copyMerge。
函数实现如下:
public void copyMerge(String folder, String file) {
Path src = new Path(folder);
Path dst = new Path(file);
Configuration conf = new Configuration();
try {
FileUtil.copyMerge(src.getFileSystem(conf), src,
dst.getFileSystem(conf), dst, false, conf, null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这个能把folder子目录里的所有part-r-0000*组合成一个文件,此函数相当于又做了一次mapreduce,输出文件名为自己设定的dst。
2.在项目中,有时还会遇到hdfs内部文件拷贝,这个函数实现不再hadoop FileSystem中。当时找API很痛苦的,后来发现它在FileUtil中。
函数实现如下:
public void copy(String srcfile, String desfile) {
Path src = new Path(srcfile);
Path dst = new Path(desfile);
Configuration conf = new Configuration();
try {
FileUtil.copy(src.getFileSystem(conf), src,
dst.getFileSystem(conf), dst, false, conf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}