具体的见下面代码中注释
package org.dragon.hadoop.hdfs.util;
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;
/**
* HDFS 实现若干小文件上传后合并功能
* 思路:
* 1、本地每个文件打开输入流,进行内容读取
* 2、HDFS文件打开输出流,进行内容写入
* 3、循环上述操作
* 4、关闭流
* @author Administrator
*
*/
public class HDFSPutMergeImpl {
/**
* 复制上传文件,并进行合并
* @param localDir
* 本地要上传的文件目录
* @param hdfsFile
* HDFS上的文件全路径名称
*/
public static void putMerge(String localDir,String hdfsFile){
//获取配置信息
Configuration conf = new Configuration();
//本地路径
Path localPath = new Path(localDir);
//HDFS路径
Path hdfsPath = new Path(hdfsFile);
try{
//获取本地文件系统
FileSystem localFs = FileSystem.getLocal(conf);
//获取HDFS文件系统
FileSystem hdfsFs = FileSystem.get(conf);
//获取本地文件系统目录中的所有文件
FileStatus[] status = localFs.listStatus(localPath);
//打开HDFS文件的输出流
FSDataOutputStream fsDataOutputStream = hdfsFs.create(hdfsPath);
//循环遍历本地文件
for(FileStatus fileStatus:status){
//获取文件路径
Path path = fileStatus.getPath();
//打开输入流
FSDataInputStream fsDataInputStream = localFs.open(path);
//进行流的读写操作
byte[] buffer = new byte[1024];
int len = 0;
//读到缓冲区
while((len = fsDataInputStream.read(buffer))>0){
//从缓冲区写入
fsDataOutputStream.write(buffer,0,len);
}
//关闭本次循环流
fsDataInputStream.close();
}
//关闭输出流
fsDataOutputStream.close();
System.out.println("success!!");
}catch(Exception e){
e.printStackTrace();
}
}
//测试
public static void main(String[] args) {
String localDir = "D:/temp/demo";
String hdfsFile = "hdfs://hadoop-master.dragon.org:9000/opt/data/test01/all.debug.log";
putMerge(localDir, hdfsFile);
}
}