因为Hadoop更适合处理连续的流文件,则把众多小文件合并后放入HDFS,更适合Hadoop。则我们编写一个程序实现这个功能。
普通的流程为把本地文件复制到HDFS后,用Hadoop来处理,这里要实现在本地向HDFS复制的过程中实现合并。这样省去了本地硬盘空间的消耗。
Hadoop API 在org.apache.hadoop.fs 包内,Hadoop的文件API是通用的,也可用于其他文件系统
package wordcount;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class PutMerge {
public static void main(String[] args) throws IOException{
Configuration conf = new Configuration();
//用来保留键值参数的类.
FileSystem hdfs = FileSystem.get(conf);
// 默认获得HDFS文件系统
FileSystem local = FileSystem.getLocal(conf);
// 获得本地文件系统
Path inputDir = new Path(args[0]);
// 第一个参数为输入目录
Path outputDir = new Path(args[1]);
// 第二个参数为输出路径
try{
byte[] buffer = new byte[50];
int len;
FileStatus[] inputFiles = local.listStatus(inputDir);
// FileStatus 存储一个文件的元数据(文件长度,权限,修改时间)
FSDataOutputStream out = hdfs.create(outputDir);
// 写入HDFS的输出流。
for(int i=0;i<inputFiles.length;i++){
System.out.println("路径"+inputFiles[i].getPath().getName()+"正在处理");
FSDataInputStream in = local.open(inputFiles[i].getPath());
// 构建输入流
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
}
out.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
运行命令
HDFS内合并的文件