0 一些背景说说:
小文件: 是那些size比HDFS的block size(默认64M)小的多的文件
因为: 任何一个文件,目录和block,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个object占用150 bytes的内存空间。
如果有10million个文件,每一个文件对应一个block,那么就将要消耗namenode 3G的内存来保存这些block的信息。文件在大的话,对内存要求会更多。
1 合并小文件方式:
a) 应用程序自己控制, 缺点是: 红墨水蓝墨水都混合在一起,以后无法区分
import java.io.File; import java.io.FileInputStream; import java.net.URI; 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 CopyOfApp1 { public static void main(String[] args) throws Exception { // 0 初始化filesystem客户端 final Configuration conf = new Configuration(); final FileSystem fileSystem = FileSystem.get(new URI("hdfs://chinadaas109:9000/"), conf); System.out.println(fileSystem); final Path path = new Path("/combinedfile"); final FSDataOutputStream create = fileSystem.create(path); // hdfs创建目标文件 final File dir = new File("C:\\Windows\\System32\\drivers\\etc"); // 将此文件夹下的内容写到hdfs path中 for(File fileName : dir.listFiles()) { System.out.println(fileName.getAbsolutePath()); final FileInputStream fileInputStream = new FileInputStream(fileName.getAbsolutePath()); final List<String> readLines = IOUtils.readLines(fileInputStream); for (String line : readLines) { create.write(line.getBytes()); } fileInputStream.close(); } create.close(); }
b) archive:
HAR文件是通过在HDFS上构建一个层次化的文件系统来工作。 一个HAR文件是通过hadoop的archive命令来创建,而这个命令实 际上也是运行了一个MapReduce任务来将小文件打包成HAR。 对于client端来说,使用HAR文件没有任何影响。所有的原始文件都 (using har://URL)。但在HDFS端它内部的文件数减少了。 过HAR来读取一个文件并不会比直接从HDFS中读取文件高效, 而且实际上可能还会稍微低效一点,因为对每一个HAR文件的访问都需要完成两层 index文件的读取和文件本身数据的读取。 并且尽管HAR文件可以被用来作为MapReduce job的input,但是并没有特殊的方法来使maps将HAR文件中打包的文件当作一个HDFS文件处理。 创建文件 hadoop archive -archiveName xxx.har -p /src /dest 查看内容 hadoop fs -lsr har:///dest/xxx.har
c) sequence file/map file
sequence file:
filename作为key,file contents作为value
比如10000个100KB的文件,可以写一个程序来将这些小文件写入到一个单独的 SequenceFile中。
可以在一个streaming fashion(directly or using mapreduce)中来使用这个sequenceFile。
并且,SequenceFiles也是splittable的,所以mapreduce 可以break them into chunks,并且分别的被独立的处理。
这种方式还支持压缩。
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.SequenceFile.CompressionType; import org.apache.hadoop.io.SequenceFile.Reader; import org.apache.hadoop.io.SequenceFile.Writer; import org.apache.hadoop.io.Text; public class TestSequenceFile { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // // TODO Auto-generated method stub Configuration conf = new Configuration(); Path seqFile = new Path("/test/seqFile2.seq"); // Writer内部类用于文件的写操作,假设Key和Value都为Text类型 SequenceFile.Writer writer = SequenceFile.createWriter(conf, Writer.file(seqFile), Writer.keyClass(Text.class), Writer.valueClass(Text.class), Writer.compression(CompressionType.NONE)); // 通过writer向文档中写入记录 writer.append(new Text("key"), new Text("value")); IOUtils.closeStream(writer);// 关闭write流 // 通过reader从文档中读取记录 SequenceFile.Reader reader = new SequenceFile.Reader(conf, Reader.file(seqFile)); Text key = new Text(); Text value = new Text(); while (reader.next(key, value)) { System.out.println(key); System.out.println(value); } IOUtils.closeStream(reader);// 关闭read流 } }
两个格式的参考文档: http://blog.csdn.net/javaman_chen/article/details/7241087
关于 sequencefile textfile 源码写法上的区别和案例参考链接:
http://tangjj.blog.51cto.com/1848040/1535555/
d) combinefileinputformat
相关推荐
Hadoop示例程序1把多个文件合并,有助于理解分布式文件系统
hadoop的dll文件 hadoop.zip
hadoop处理海小文件的一种改进方法的文章,可供参考。
通过指定目录进行多线程执行合并小文件程序,由于hdfs小文件过多,可用于自定义合并orc小文件。
Hadoop3.1.3 配置文件
Hadoop 2.2.0 配置文件 在4台CentOs 6.4版本下运行成功
基于Hadoop的在线文件管理系统-开题报告.pdf基于Hadoop的在线文件管理系统-开题报告.pdf基于Hadoop的在线文件管理系统-开题报告.pdf基于Hadoop的在线文件管理系统-开题报告.pdf基于Hadoop的在线文件管理系统-开题...
hadoop的默认配置文件,下载记得关注我哦
windows安装需要的Hadoop库文件,windows安装需要的Hadoop库文件.
Hadoop HA 集群搭建所需要的配置文件:core-site,hdfs-site,mapred-site,yarn-site四个xml文件和一个slaves文件
hadoop配置文件hadoop配置文件hadoop配置文件hadoop配置文件hadoop配置文件hadoop配置文件hadoop配置文件hadoop配置文件hadoop配置文件
hadoop config 配置文件
包含了在windows下连接linux hadoop需要的文件winutils和hadoop.dll 支持hadoop 2.6.* 和2.7.* 的hadoop版本
Hadoop分布式文件系统的模型分析,Hadoop 分布式文件系统是遵循Google 文件系统原理进行开发和实现的,受到了业界极大关注,并 已被广泛应用。 鉴于当前缺乏从系统设计理论的角度对其开展的相关研究,本文从 Hadoop ...
以词频统计为例,通过在单机环境下一些典型文件测试集的实验,对比了不同文件输入格式对Hadoop处理小文件性能的差异。从Hadoop的工作流程和原理上解释了出现此性能差异的原因。通过分析得出多个小文件整合为一个数据...
为了比较在相同的Hadoop分布式环境下这四种技术处理大量小文件时的性能,选用了典型的数据集,利用词频统计程序,来比较四种小文件处理技术的性能差异。实验研究表明,在不同需求下处理大量小文件的时候,选用适当的...
本文根据 Hadoop 平台现 有小文件处理的思想,对海量小文件进行合并然后建立索引。其中索引结构的设 计是本文的创新点及研究重点,包括索引预处理、索引分层、索引分片等。通过 对小文件按类型进行合并,建立多层...
hadoop在windows上运行需要winutils支持和hadoop.dll等文件
Hadoop小文件存储方法改进研究,陈洋,黄岚,Hadoop是一个开源的分布式计算框架。运用Hadoop所提供的分布式文件系统(Hadoop distributed file system, HDFS)处理农业生物领域不断增加的大量科�
我的报错:Could not locate Hadoop executable: E:\big_data\hadoop-3.3.0\bin\winutils.ex hadoop的winutils.exe及hadoop.dll文件,可以用于hadoop3.3. 下载好直接将两个文件复制到我们hadoop的bin目录下就行了