本地打包Har文件实现

HDFS需要为每个文件分片的副本维护元数据,当文件的体积过小,文件数目过多的情况下,会因元数据过多,给master节点带来大量内存开销。然而将小文件存储到hdfs的需求又常常有,hdfs本身也提供了一种解决方案,har打包。下文将会介绍这一方式的原理,并实现一个不使用mapreduce的本地打包程序。

1.HAR打包文件介绍

Har文件是一种HDFS可支持的打包方式,将小文件合并,并可以像普通hdfs文件一样作为MapReduce输入。

本地打包Har文件实现_第1张图片
本地打包Har文件实现_第2张图片

Har文件结构:是一个以”.har”结尾命名的目录,其中有至少三个文件”_index”、”_masterindex”、”part-0”、……。其中”part-X”文件中直接拼接了原始文件内容,无压缩处理,每个map操作的节点生成一个”part-X”文件。”_index”文件中存储包内目录、文件的元数据信息,并按路径java字符串hashCode()运算的哈希值排序。”_masterindex”记录”_index”文件中每1000条信息的起止哈希值、在”_index”文件中起止位置。

Har文件的访问:在使用Hadoop命令行工具时,只有使用带有har的schema文件路径,就可以像普通hdfs文件一样的使用。例如:./hadoopfs -cat

har:///pack1.har/Noname1.txt。

2.本地文件系统中打包Har文件实现

1、遍历指定目录下的所有目录、文件,并将所有目录、文件路径java字符串hashCode()运算的哈希值作为key,元数据作为value,存储到一个TreeMap中。同时将文件内容连接写入同个文件”part-0”。

2、将排序的元数据信息,写入”_index”文件,每1000条信息的起止哈希值、在”_index”文件中起止位置,记录到”_masterindex”文件。

以上代码,已经没有源码了,请反编译查看:http://pan.baidu.com/s/1geTiwKj

你可能感兴趣的:(本地打包Har文件实现)