0508-如何使用Hadoop的Archive处理小文件

2019-11-28 23:36:14 浏览数 (1)

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1

文档编写目的

Fayson在前面的文章《如何在Hadoop中处理小文件》、《如何在Hadoop中处理小文件-续》和《如何使用Impala合并小文件》等,在文章中也详细说明了怎么去处理Hadoop中的小文件。文章中也提到小文件过多会对NameNode造成压力,导致NameNode内存使用过高。本篇文章Fayson主要使用Hadoop Archive Files功能将集群中的小文件进行归档。

  • 测试环境:

1.操作系统:Redhat7.4

2.CM和CDH版本为5.15.0

2

环境准备

在本地测试环境中准备大量的小文件,这里Fayson直接将/opt/cloudera/parcels/CDH/lib目录直接put到HDFS上(因为lib下有大量的jar包)。

1.在put小文件到HDFS前,集群中的Block数量为30418

2.将/opt/cloudera/parcels/CDH/lib目录put到HDFS的/tmp目录下

代码语言:javascript复制
[root@cdh05 CDH]# hadoop fs -put /opt/cloudera/parcels/CDH/lib /tmp
[root@cdh05 CDH]# hadoop fs -ls /tmp/lib

3.此时查看集群的Block数量增长到60446

通过上述环境准备Fayson将集群的blocks数量增加了30028将近一倍。

3

Hadoop Archive使用

使用Hadoop自带的Archive对集群中的小文件进行归档处理,将小文件打包到更大的HAR文件中,如下为归档操作步骤:

1.在命令行执行如下命令将/tmp/lib目录下所有的目录进行归档

代码语言:javascript复制
[root@cdh05 ~]# hadoop archive -archiveName libarchive.har -p /tmp/lib -r 3 * /tmp

参数说明:

-archiveName:指定归档文件名称

-p:指定要进行归档目录或文件的父目录

-r:指定归档文件的副本数

*:可以使用通配的方式归档一类文件或目录(如:test*表示以test开头的文件或目录)

/tmp:指定归档libarchive.har文件的输出目录

2.查看libarchive.har文件大小以及原始目录的文件大小

可以看到归档文件libarchive.har与原始/tmp/lib的大小一致,只是对小文件进行归档合并为一个大的har文件,并未对文件进行压缩处理。查看此时HDFS Blocks总数为60469,相较于之前增加了23个Block。

3.执行如下命令浏览libarchive.har文件内容

代码语言:javascript复制
[root@cdh05 ~]# hadoop fs -ls har:/tmp/libarchive.har

与/tmp/lib下的目录一致,HAR文件的浏览方式需要在hdfs路径前添加har:

4.将原始的/tmp/lib目录删除,观察集群的Blocks总数

代码语言:javascript复制
[root@cdh05 ~]# hadoop fs -rmr -skipTrash /tmp/lib
[root@cdh05 ~]# hadoop fs -ls /tmp

查看此时HDFS Blocks总数为30397,相较于之前减少了30072个Block。

可以看到通过使用Hadoop Archive Files方式可以将集群中的小文件打包成一个大的HAR文件以减少集群中小文件,来达到降低集群的Blocks数量减轻NameNode压力。

5.访问libarchive.har归档的文件及获取归档文件中的内容

代码语言:javascript复制
[root@cdh05 ~]# hadoop fs -ls har:///tmp/libarchive.har/avro
[root@cdh05 ~]# hadoop fs -get har:///tmp/libarchive.har/avro/avro-1.7.6-cdh5.15.0.jar

通过在hdfs路径前加上har:的方式访问归档中的目录及文件。如果不加上har:则会显示如下内容

4

Hadoop Archive解档

既然归档了就需要有解档的操作,可以使用hadoop distcp命令完成,具体操作如下:

代码语言:javascript复制
[root@cdh05 ~]# hadoop distcp har:/tmp/libarchive.har /tmp/lib

完成解档后,可以看到/tmp/lib目录与归档文件目录一致

5

总结

1.Hadoop的Archive只能将小文件合并为一个大的HAR文件,并未对归档文件大小进行压缩处理(即原始目录多大归档后的HAR文件依然维持原有大小不变)

2.使用hadoop命令访问归档文件时需要在HDFS路径前添加har:,添加har:后访问方式与普通的访问目录与文件方式无差别

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

0 人点赞