Hadoop HDFS (4) Hadoop Archives

本文介绍了HadoopArchives(HAR文件)作为一种有效的文件打包工具,帮助用户更高效地管理HDFS上的小文件。通过将多个小文件打包成一个HAR文件,不仅可以节省namenode的内存资源,还提供了方便的访问方式和作为MapReduce输入的功能。此外,文章详细阐述了HAR文件的使用方法、限制以及如何删除HAR文件。
用HDFS存储小文件是不经济的,因为每个文件都存在一个block里,每个block的metadata又在namenode的内存里存着,所以,大量的小文件,会吃掉大量的namenode的内存。(注意:一个小文件占用一个block,但是这个block的大小不是设定的值,比如设定每个block是128M,但是一个1M的文件存在一个block里,实际占用的datanode的硬盘大小是1M,而不是128M。所以这里说的不经济是指占用大量namenode的内存资源,而不是说占用大量datanode的磁盘资源。)

Hadoop Archives(HAR文件)是一个文件打包工具,它把文件打包放进HDFS,以更加有效地利用block,从而降低namenode的内存使用。同时,Hadoop Archives还允许客户端透明访问HAR包里的文件,像访问文件夹里的文件一样方便,更重要的是,HAR文件还可以作为MapReduce的输入。

Hadoop Archives的使用方法

$hadoop fs -ls -R /user/norris/
列出/user/norris/目录下的所有文件,-R表示递归列出子目录里的文件。
然后我们可以使用下面命令:
$hadoop archive -archiveName files.har -p /user/norris/ /user/norris/har/
这个命令把/user/norris/目录下的所有内容打成files.har包放在/user/norris/har/下。
-p表示父目录(parent)。
之后使用
$hadoop fs -ls /user/norris/har/
查看/user/norris/har/目录下生成一个files.har文件。
$hadoop fs -ls /user/norris/har/files.har
可以看到files.har包由两个index文件和一组part文件组成。
part文件就是把所有文件内容拼接在一起,index文件存储文件起始位置的偏移量和文件长度。
如果要查看har文件的内容,可以用URI Scheme har来查看:
$hadoop fs -ls -R har:///user/norris/har/files.har
列出har里的文件和目录
HAR文件系统位于底层文件系统(HDFS)之上。

删除一个har文件要使用:
$hadoop fs -rm -R /user/norris/har/files.har
要用-R选项,因为在底层文件系统看来,.har文件其实是一个目录。

Hadoop Archives的使用限制

1. 创建一个HAR需要跟源文件相同大小的空间,所以,在准备创建一个HAR之前,要保证有相同大小的磁盘空间,创建之后,可以删除原来的文件。目录Hadoop Archives只打包,不压缩。
2. HAR文件一旦创建不可修改,不能向其中增加或删除文件。在实际使用中,一般对于一旦生成就不再更改的文件做定期的archive,比如,每天把当天生成的日志文件打成一个包。
3. 之前提到HAR文件可以作为MapReduce的输入,但是多个小文件打成包输入给MapReduce,并不比单独小文件输入给MapReduce更有效率,关于解决众多小文件输入的效率问题,后面要讨论其他解决方案。
4. 如果namenode的内存不够用了,在考虑减少系统中的大量小文件之后,应该考虑HDFS Federation。我们之前提到过: http://blog.youkuaiyun.com/norriszhang/article/details/39178041







### Hadoop `-archives` 参数使用说明 在分布式计算环境中,Hadoop 提供了多种方式来管理文件系统中的资源。其中,`-archives` 是一个非常有用的命令行选项,用于解压存档文件并将其作为软链接放置到运行时的工作目录下。 当指定 `-archives` 选项时,Hadoop 将会自动处理这些压缩包,在作业执行期间将它们解压,并创建指向已解压内容的符号链接[^1]。这使得应用程序可以方便地访问所需的库或其他依赖项而无需手动分发这些文件给集群节点。 具体来说,该参数接受逗号分隔的一个或多个 URI 列表,每个 URI 可能代表本地路径、HDFS 路径或者其他支持协议下的位置: ```bash hadoop jar your-application.jar com.example.MainClass -D some.property=value -archives hdfs://namenode/path/to/your-archive.zip#optionalLinkName ``` 上述命令中 `#optionalLinkName` 部分为可选配置;如果不提供,则默认采用档案名称去掉扩展名后的部分作为链接名字。 对于所提到的不同类型的压缩格式,默认情况下 Hadoop 支持 ZIP 和 TAR.GZ 文件。如果需要其他特定格式的支持,则可能要通过自定义实现相应的 Codec 类来进行适配[^2]。 #### 实际应用案例展示 假设有一个 MapReduce 应用程序依赖于 Python 解释器及其标准库之外的一些额外模块(比如 NumPy)。为了简化部署流程,可以把整个 Anaconda 发行版打包成 tarball 并上传至 HDFS 上某个公共可读取的位置 `/shared/libraries/python-env.tar.gz` 。接着修改提交脚本如下所示: ```bash yarn jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming*.jar \ -file mapper.py -mapper mapper.py \ -file reducer.py -reducer reducer.py \ -input /input/data.csv \ -output /output/result \ -archives hdfs:///shared/libraries/python-env.tar.gz#pyenv ``` 在这个例子里面,“pyenv”就是被创建出来的临时工作区内的相对路径,Python 程序可以通过这个路径找到所需要的环境变量和第三方库。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值