现在的位置: 首页 > 综合 > 正文

【hadoop】streaming 文件分发与打包

2014年02月10日 ⁄ 综合 ⁄ 共 1632字 ⁄ 字号 评论关闭
文章目录

如果程序运行所需要的可执行文件、脚本或者配置文件在Hadoop集群的计算节点上不存在,则首先需要将这些文件分发到集群上才能成功进行计算。Hadoop提供了自动分发文件和压缩包的机制,只需要在启动Streaming作业时配置相应的参数。以下为介绍与对比:

more:http://hadoop.apache.org/mapreduce/docs/current/streaming.html

用-file分发文件

我们一般使用它分发mapper reducer程序以及配置文件,甚至字典文件。使用-file /path/to/FILENAME选项分发文件,将本地文件/path/to/FILENAME上传到集群,计算节点会分发到此文件,并且是在默认的临时计算路径下。对于本地可执行的文件,除了指定的mapper或reducer程序外,可能分发后没有可执行权限,所以需要在包装程序如mapper.sh中运行chmod +x ./FILENAME设置可执行权限,然后设置-mapper “mapper.sh”。

用-cacheFile分发文件

如果文件(如字典文件等大文件,他们一般很少更新,如果使用-file,则每次启动都需要从本地上传,会降低启动效率)存放在HDFS中,希望计算时在每个计算节点上将文件当作本地文件处理,可以使用-cacheFile hdfs://host:port/path/to/file#linkname选项在计算节点缓存文件,Streaming程序通过./linkname访问文件。

被分发字典文件从HDFS分发到计算节点并链接到当前工作目录下(即同一个机器上的多个计算节点共用):

注意:不能向-cacheFile分发的文件写入任何内容(避免写冲突等)。

用-cacheArchive分发压缩包

首先将本地app目录中的所有文件和目录打包压缩,然后上传到HDFS的/user/test/app.tar.gz,启动streaming任务时使用-cacheArchive选项将app.tar.gz分发到计算节点并解压到app目录,然后在当前工作目录创建到app目录的链接,-mapper选项指定app/mapper.pl为mapper程序,-reducer选项指定app/reducer.pl为reducer程序,它们都可以读取./dict/dict.txt文件。本地打包时要进入目录app而不是在app的上层目录打包,否则要通过app/app/mapper.pl才能访问到mapper.pl文件。

hadoop支持zip, jar, tar.gz格式的压缩包,由于Java解压zip压缩包时会丢失文件权限信息而且遇到中文文件名会出错,所见建议采用tar.gz压缩包。

$ tar zcf app.tar.gz –C app . #本地打包

$ $HADOOP_HOME/bin/hadoop fs –put app.tar.gz /user/test/app.tar.gz #包上传到HDFS

$ $HADOOP_HOME/bin/hadoop streaming -input /user/test/input -output /user/test/output -mapper “perl app/mapper.pl” -reducer “perl app/reducer.pl”
-cacheArchive hdfs://namenode:port/user/test/ app.tar.gz #app \

-jobconf mapred.job.name=”cache-archive-demo”

注意:和cacheFile一样,解压后的压缩包中,不要cd进入到里面的目录创建或修改文件,多个任务同时修改一个文件可能会造成相互影响

三种文件分发方式的区别:-file将客户端本地文件打成jar包上传到HDFS然后分发到计算节点,-cacheFile将HDFS文件分发到计算节点,-cacheArchive将HDFS压缩文件分发到计算节点并解压。

抱歉!评论已关闭.