@Arslan6and6
2016-05-02T06:04:03.000000Z
字数 1378
阅读 543
第四章、深入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流中的内容放入out
in.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);
}
}