HDFS 小文件处理——应用程序实现
Posted Do My Code
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS 小文件处理——应用程序实现相关的知识,希望对你有一定的参考价值。
在真实环境中,处理日志的时候,会有很多小的碎文件,但是文件总量又是很大。普通的应用程序用来处理已经很麻烦了,或者说处理不了,这个时候需要对小文件进行一些特殊的处理——合并。
在这通过编写java应用程序实现文件的合并并上传到HDFS。整体的处理思路是,从本地加载琐碎的小文件并写到HDFS中。
package study.smallfile.javaapp; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class AppDemo { private static final String OUT_PATH = "hdfs://cluster1/smallfile/combined/app"; private static final String LOCAL_PATH = "/root/logs"; public void CombinedLocalFile() { FSDataOutputStream out = null; InputStreamReader reader = null; try { Configuration conf = new Configuration(); Path local = new Path(OUT_PATH); out = FileSystem.get(conf).create(local); File dir = new File(LOCAL_PATH); for (File file : dir.listFiles()) { reader = new InputStreamReader(new FileInputStream(file), "UTF-8"); List<String> readLines = IOUtils.readLines(reader); for (String line : readLines) { out.write(line.getBytes()); out.write("\n".getBytes()); } } System.out.println("合并成功"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (out != null) out.close(); if (reader != null) reader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
这个方法有个缺点:
1、从代码实现可以看出,是对小文件先完全加载到内存中,然后进行单行处理,写入HDFS。如果某个小文件过大,会占用大量的内存,影响本机的其他应用正常运行。
2、这种方法传到HDFS的时候,文件是未压缩的
以上是关于HDFS 小文件处理——应用程序实现的主要内容,如果未能解决你的问题,请参考以下文章