hadoop-Archives har归档历史文件(小文件)

应用场景

我们的hdfs中保存大量小文件(当然不产生小文件是最佳实践),这样会把namenode的namespace搞的很大。namespace保存着hdfs文件的inode信息,文件越多需要的namenode内存越大,但内存毕竟是有限的(这个是目前hadoop的硬伤)。

下面图片展示了,har文档的结构。har文件是通过mapreduce生成的,job结束后源文件不会删除。

har命令说明

1、archive命令

(1).什么是Hadoop archives?
Hadoop archives是特殊的档案格式。一个Hadoop archive对应一个文件系统目录。 Hadoop archive的扩展名是*.har。Hadoop archive包含元数据(形式是_index和_masterindx)和数据文件(part-*)。_index文件包含了档案中的文件的文件名和位置信息。

(2).如何创建archive?
用法:hadoop archive -archiveName NAME <src>* <dest>
命令选项:
-archiveName NAME 要创建的档案的名字。
src 源文件系统的路径名。
dest 保存档案文件的目标目录。
范例:
例1.将/user/hadoop/dir1和/user/hadoop/dir2归档到/user/zoo/文件系统目录下–/user/zoo/foo.har。
[email protected]:~/ hadoop archive -archiveName foo.har /user/hadoop/dir1 /user/hadoop/dir2 /user/zoo/
当创建archive时,源文件foo.har不会被更改或删除。

(3).如何查看archives中的文件?
archive作为文件系统层暴露给外界。所以所有的fs shell命令都能在archive上运行,但是要使用不同的URI。另外,archive是不可改变的。所以创建、重命名和删除都会返回错误。Hadoop Archives的URI是har://scheme-hostname:port/archivepath/fileinarchive。
如果没提供scheme-hostname,它会使用默认的文件系统。这种情况下URI是这种形式har:///archivepath/fileinarchive。
范例:
例1.archive的输入是/dir,该dir目录包含文件filea和fileb,现把/dir归档到/user/hadoop/foo.bar。
[email protected]:~/ hadoop archive -archiveName foo.har /dir /user/hadoop
例2.获得创建的archive中的文件列表
[email protected]:~/hadoop dfs -lsr har:///user/hadoop/foo.har
例3.查看archive中的filea文件
[email protected]:~/hadoop dfs -cat har:///user/hadoop/foo.har/dir/filea

生成HAR文件

  • 单个src文件夹:

hadoop archive -archiveName 419.har -p /fc/src/20120116/ 419 /user/heipark

  • 多个src文件夹

hadoop archive -archiveName combine.har -p /fc/src/20120116/ 419 512 334 /user/heipark

  • 不指定src path,直接归档parent path(本例为“ /fc/src/20120116/ ”, “ /user/heipark ”仍然为输出path),这招是从源码里翻出来的,嘿嘿。

hadoop archive -archiveName combine.har -p /fc/src/20120116/ /user/heipark

  • 使用模式匹配的src path,下面的示例归档10、11、12月文件夹的数据。这招也是从源码发出来的。

hadoop archive -archiveName combine.har -p /fc/src/2011 1[0-2] /user/heipark

查看HAR文件

hadoop fs -ls har:////user/heipark/20120108_15.har/
#输出如下:
drw-r--r-- - hdfs hadoop 0 2012-01-17 16:30 /user/heipark/20120108_15.har/2025
drw-r--r-- - hdfs hadoop 0 2012-01-17 16:30 /user/heipark/20120108_15.har/2029

#使用hdfs文件系统查看har文件
hadoop fs -ls /user/yue.zhang/20120108_15.har/ 
#输出如下:
-rw-r--r-- 2 hdfs hadoop 0 2012-01-17 16:30 /user/heipark/20120108_15.har/_SUCCESS
-rw-r--r-- 5 hdfs hadoop 2411 2012-01-17 16:30 /user/heipark/20120108_15.har/_index
-rw-r--r-- 5 hdfs hadoop 24 2012-01-17 16:30 /user/heipark/20120108_15.har/_masterindex
-rw-r--r-- 2 hdfs hadoop 191963 2012-01-17 16:30 /user/heipark/20120108_15.har/part-0

Har Java API (HarFileSystem )

public static void main(String[] args) throws Exception {
	Configuration conf = new Configuration();
	conf.set("fs.default.name", "hdfs://xxx.xxx.xxx.xxx:9000");

	HarFileSystem fs = new HarFileSystem();
	fs.initialize(new URI("har:///user/heipark/20120108_15.har"), conf);
	FileStatus[] listStatus = fs.listStatus(new Path("sub_dir"));
	for (FileStatus fileStatus : listStatus) {
		System.out.println(fileStatus.getPath().toString());
	}
}

  

时间: 2024-10-02 06:42:24

hadoop-Archives har归档历史文件(小文件)的相关文章

hadoop 将HDFS上多个小文件合并到SequenceFile里

背景:hdfs上的文件最好和hdfs的块大小的N倍.如果文件太小,浪费namnode的元数据存储空间以及内存,如果文件分块不合理也会影响mapreduce中map的效率. 本例中将小文件的文件名作为key,其内容作为value生成SequenceFile 1.生成文件 //将目标目录的所有文件以文件名为key,内容为value放入SequenceFile中 //第一个参数是需要打包的目录,第二个参数生成的文件路径和名称 private static void combineToSequenceF

Hadoop的小文件解决方案

小文件指的是那些size比HDFS的block size(默认64M)小的多的文件.任何一个文件,目录和block,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个object占用150bytes的内存空间.所以,如果有10million(一千万)个文件,每一个文件对应一个block,那么就将要消耗namenode3G的内存来保存这些block的信息,如果规模再大一些,那么将会超出现阶段计算机硬件所能满足的极限. 相同大小下,小文件越多,对namenode造成的内存

大数据-Hadoop小文件问题解决方案

HDFS中小文件是指文件size小于HDFS上block(dfs block size)大小的文件.大量的小文件会给Hadoop的扩展性和性能带来严重的影响.HDFS中小文件是指文件size小于HDFS上block大小的文件.大量的小文件会给Hadoop的扩展性和性能带来严重的影响. 大数据学习群:716581014 小文件是如何产生的? 动态分区插入数据,产生大量的小文件,从而导致map数量剧增 reduce数量越多,小文件也越多,reduce的个数和输出文件个数一致 数据源本身就是大量的小文

小文件的解决方案

小文件指的是那些size比HDFS的block size(默认64M)小的多的文件.任何一个文件,目录和block,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个object占用150 bytes的内存空间.所以,如果有10million个文件,每一个文件对应一个block,那么就将要消耗namenode 3G的内存来保存这些block的信息.如果规模再大一些,那么将会超出现阶段计算机硬件所能满足的极限. 解决小文件的四种解决方案: 1.应用程序自己控制 2.ar

Hive之小文件问题及其解决方案

小文件如何产生 1.动态分区插入数据,产生大量小文件,导致map数剧增 2.Reduce数越多,小文件越多 3.数据直接导入小文件 小文件的影响 从hive的角度看,小文件会开很多map,一个map开一个jvm去执行,所以这些任务的初始化,启动,执行浪费大量资源,严重影响集群性能 在HDFS中,每个小文件对象越占150byte,如果小文件过多会占用大量内存.这样namenode内存容量严重制约了集群的扩展. 解决思路 使用sequence file作为表的存储格式,不要用TextFile 减少R

ATS写小文件

与读缓存类似,写缓存也有大文件小文件的区分,这里讨论写小文件.整个流程如下: Cache::open_write: 根据key生成一个新key作为earliest_key,不过小文件的话貌似earlist_key没用.根据CacheV->first_key计算的到vol.执行Vol::open_write,在Vol::open_write中进行了简单的aggregation buf的错误检查就执行了OpenDir::open_write.最后将CacheVC::openWriteMain设置为回

hadoop文件系统上的小文件合并-Hadoop Archives

1. 什么是Hadoop archives Hadoop archives是特殊的档案格式.一个Hadoop archive对应一个文件系统目录. Hadoop archive的扩展名是.har.Hadoop archive包含元数据(形式是_index和_masterindx)和数据(part-)文件._index文件包含了档案中的文件的文件名和位置信息. 2. 创建archives 创建archives是一个Map/Reduce job.你应该在map reduce集群上运行这个命令. 用法

Hadoop小文件解决之道之一 Hadoop archive

简介 hdfs并不擅长存储小文件,因为每个文件最少一个block,每个block的元数据都会在namenode节点占用内存,如果存在这样大量的小文件,它们会吃掉namenode节点的大量内存. hadoop Archives可以有效的处理以上问题,他可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件,并且可以做为mapreduce任务的输入. 用法 hadoop Archives可以使用archive工具创建,同上一篇讲的distcp一样,archive也是一个mapre

关于hadoop处理大量小文件情况的解决方法

小文件是指那些size比HDFS的block size(默认64m)小的多的文件.任何一个文件,目录和bolck,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个object占用150bytes的内存空间.所以,如果有10milion个文件,每一个文件对应一个block,那么就会消耗namenode 3G来保存这些block的信息.如果规模再大一点,那么将会超出现阶段计算机硬件所能满足的极限. 控制小文件的方法有: 1应用程序自己控制 2archieve 第一种是我