@Arslan6and6
2016-05-02T06:04:03.000000Z
字数 1378
阅读 607
第四章、深入Hadoop 2.x
---HDFS API基本操作
作业描述:
需求:合并小文件,存放到HDFS上,例如,当需要分析许多来自服务器的apache日志时,各个文件可能比较小,然后 Hadoop 更适合处理大文件,效率会更高,此时就需要合并分散的文件,一般都是在向HDFS复制上传文件的过程中将小文件进行合并(场景描述也可参考上课视频),开发一个PutMerge程序,用于合并本地文件后存入 HDFS 系统中。(比如把/opt/modules/hadoop-2.5.0/etc/hadoop/下面所有的xml文件合并上传到HDFS形成一个大文件)
先把目标文件夹内所有xml文件复制到临时文件夹tmp中

package org.apache.hadoop.studyhdfs;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;import org.apache.hadoop.io.IOUtils;public class PutMerge {public static void putMergeFunc(String LocalDir, String fsFile) throws IOException{Configuration conf = new Configuration();//fs是HDFS文件系统FileSystem fs =FileSystem.get(conf);FileSystem local = FileSystem.getLocal(conf);Path localDir = new Path(LocalDir);Path HDFSFlie = new Path(fsFile);FileStatus[] status = local.listStatus(localDir);FSDataOutputStream out = fs.create(HDFSFlie); //在HDFS上创建输出文件for(FileStatus st: status) {Path temp =st.getPath();FSDataInputStream in =local.open(temp);IOUtils.copyBytes(in, out, 4096, false); //读取in流中的内容放入outin.close(); //完成后,关闭当前文件输入流}out.close();}public static void main(String [] args) throws IOException{String l = "/opt/modules/hadoop-2.5.0/tmp";String f = "hdfs://hadoop-senior01.ibeifeng.com:8020/text/test.txt";putMergeFunc(l,f);}}