Origin
- 我们首先理解一下SequenceFile试图解决什么问题,然后看SeqFile怎么解决这些问题。
In HDFS
- 序列文件是解决Hadoop小文件问题的一个方法;
- 小文件是显著小于HDFS块(128M)的文件;
- 在HDFS中,每个文件、目录、块都被表示成一个对象,占用150bytes;
- 10million文件,会占用NameNode 3gb内存;
In MapReduce
- map task通常一次处理一个input block(使用default FileInputFormat);
- 文件数量越多,就需要越多的map task,并且job时间会变慢
Small file scenarios
- 这些小文件是一个大的logical file的pieces; ----> 可以通过写一个程序来连接这些小文件
- 这些小文件是inherently small,比如,images -----> 需要某种容器按某种方式来group这些文件。
Solutions in Hadoop
HAR
- HAR(Hadoop Archives)是用来减轻大量文件给NameNode内存带来的压力的;
- HAR are probably best used purely for archival purposes.
- HAR可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件,并且可以做为mapreduce任务的输入。
- About HAR:
- Hadoop Archives是特殊的档案格式。
- 一个HAR对应一个文件系统目录。
- HAR包含原数据(_index和_masterinx)和数据文件(part-*)文件
SequenceFile
- SeqFile的概念就是将每个小文件放到一个更大的single file中;
- 比如,有10,000,100KB文件,那么可以写一个程序将他们放到一个单一的SeqFile中,其中你可以使用filename作为key,内容作为value。
- 这样做的好处:
- NameNode中占用更少的内存
- SeqFile是可分割的(splittable),因此很适合与MapReduce;
- SeqFile支持压缩
Summary
- SequenceFile是Hadoop API提供的一种二进制文件,它的数据以<key, value>形式序列化到文件中。
- 这种二进制文件内部使用Hadoop的标准Writable接口实现序列化和反序列化。