1、Hadoop Streaming 实战: 文件分发与打包分类: hadoop2011-05-06 14:56432 人阅读评论(0)收藏举报如果程序运行所需要的可执行文件、脚本或者配置文件在 Hadoop 集群的计算节点上不存在,则首先需要将这些文件分发到集群上才能成功进行计算。Hadoop 提供了自动分发文件和压缩包的机制,只需要在启动 Streaming 作业时配置相应的参数。 1. file 将本地文件分发到计算结点 2. cacheFile 文件已经存放在 HDFS 中,希望计算时在每个计算节点上将文件当作本地文件处理 3. cacheArchive 将存放在 HDFS 中的压缩包分发
2、并解压-file 实战: 使用-file 分发本地可执行文件和其他文件a. 待计算的数据放入 hdfs $ hadoop fs -put localfile /user/hadoop/hadoopfile b. 编写 map、reduce 脚本,记得给脚本加可执行权限。 mapper.sh view plaincopy to clipboardprint?1. #!/bin/sh 2. wc -l #!/bin/shwc -lreducer.shview plaincopy to clipboardprint?1. #!/bin/sh 2. a=0 3. while read i 4. do
3、5. let a+=$i 6. done 7. echo $a #!/bin/sha=0while read idolet a+=$idoneecho $ahello.txt 文件内容: helloworldc. 运行: $ hadoop streaming input /user/hadoop/hadoopfile -output /user/hadoop/result -mapper ./mapper.sh -reducer ./reducer.sh-file mapper.sh -file reducer.sh -file hello.txt -jobconf mapred.reduce
4、.tasks=1 -jobconf mapre.job.name=“sum_test“d. 查看结果: $ hadoop fs cat /user/hadoop/result/part-00000 -cacheFile 实战a. 待计算的数据和文件放入 hdfs $ hadoop fs -put hello.txt /user/hadoop/b.运行命令(mapper.sh 和 reducer.sh 脚本内容同上): $ hadoop streaming input /user/hadoop/hadoopfile -output /user/hadoop/result -mapper ./ma
5、pper.sh -reducer ./reducer.sh-file mapper.sh -file reducer.sh -cacheFilehdfs:/host:port /user/hadoop/hello.txt#./hello.txt-jobconf mapred.reduce.tasks=1 -jobconf mapre.job.name=“sum_test“ 可以通过配置文件 hadoop-site.xml 中的 fs.default.name 配置参数的值得到文件所在的host 和 port。c. 查看结果: $ hadoop fs cat /user/hadoop/resul
6、t/part-00000 -cacheArchive 实战a. 创建一个目录 test,目录中包含文件 mapper.txt,reducer,hello.txt 修改 mapper.sh: view plaincopy to clipboardprint?1. #!/bin/sh 2. a=wc -l 3. #使用参数 4. b=wc -l $1 | awk print $1 5. let c=a+b 6. echo $c #!/bin/sha=wc -l#使 用 参 数b=wc -l $1 | awk print $1let c=a+becho $cb.压缩文件夹并将压缩文件放入 hdfs:
7、 $ cd test $ tar zcvf test.tar.gz * $ hadoop fs put test.tar.gz /user/hadoop/test/c.运行命令: $ hadoop streaming input /user/hadoop/hadoopfile -output /user/hadoop/result -mapper “./test/mapper.sh ./test/hello.txt” -reducer ./test/reducer.sh-cacheArchive hdfs:/host:port/user/hadoop/test/test.tar.gz#test
8、 -jobconf mapred.reduce.tasks=1 -jobconf mapre.job.name=“sum_test“ d. 查看结果: $ hadoop fs cat /user/hadoop/result/part-00000 首先将本地 test 目录中的所有文件和目录打包压缩,然后上传到 HDFS 中。启动streaming 任务时使用 -cacheArchive 选项将 test.tar.gz 分发到计算节点并解压到 test 目录,然后在当前工作目录创建到 test 目录的链接,-mapper 选项指定为 mapper 程序及其运行参数,-reducer 选项指定 reducer 程序。本地打包时要进入目录 test 而不是在 test 的上层目录打包,否则要通过 test/test/mapper.sh 才能访问到 mapper.shl 文件。