Hadoop 1.x 实现文件上传合并功能

     具体的见下面代码中注释

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);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值