目录
概要
Hadoop mapreduce的shell脚本启动方式。免去繁琐的java代码,只需专注于数据如何处理。依旧使用的MapReduce计算框架。
详细MapReduce计算框架讲解请自行百度。
以下内容默认读者了解MapReduce的基本内容和shell脚本的基本内容。
HadoopStreaming
主要格式
hadoop streaming中mapper和reducer的输入输出均为标准输入输出,这意味着任何【可以从标准输入读取数据,输出数据到标准输出】的语言均可作为hadoop streaming的mapper和reducer
大致使用如下:(注意每一行结尾\之前的空格)
${HADOOP_BIN} streaming \
-mapper $mapper \
-reducer $reducer \
-input $input \
-output $output \
-file $file \
-jobconf $config1 \
-jobconf $config2
${HADOOP_BIN}为hadoop的执行文件(例:/usr/bin/hadoop)。
mapper\reducer
$mapper、$reducer可为任意语言编写的从标准输入输出读写内容的脚本:
以python语言为例:
#mapper.py
import sys
for line in sys.stdin:
line = line.strip()
if line == '': continue
if "Hello" in line:
print line
streaming配置:
...
-mapper "/usr/bin/python2.6 mapper.py" \
...
mapper.py从标准输入(sys.stdin)逐行读取数据,并将其输出到标准输出(print)。reuduce同理。
支持直接运行shell脚本:
#case1######################
-mapper "cat" \
-reducer "uniq" \
#case2######################
-mapper "sh mapper.sh" \
-reducer "sh reducer.sh" \
支持reduce为空,设置如下:(jobconf配置后面有讲)
-reducer None \
#或者###########
-jobconf mapred.reduce.tasks=0 \
input\output
$input、$output为其在HDFS(分布式文件系统)上的输入路径和输出路径。
多路输入
hadoop streaming支持多路输入(支持通配符等方式),使用格式为:
#方式一#################################################
INPUT="path1","path2/part-*","path3/2019*/part-000[1-9]","path4/{1,2}"...
...
-input $INPUT \
...
#方式二#################################################
INPUT_1="path1"
INPUT_2="path2/part-*"
INPUT_3="path3/2019*/part-000[1-9]"
INPUT_4="path4/{1,2}"
...
-input $INPUT_1 \
-input $INPUT_2 \
-input $INPUT_3 \
-input $INPUT_4 \
...
更为详细的多路输入讲解请见: MapReduce工作笔记——Hadoop Streaming多目录/多路输入(作者:Congying-Wang)
多路输出
目前我并没有找到多目录输出的方式。(如有大神告诉我将不胜感激)
仅有同目录下的多路输出:MapReduce如何使用多路输出(作者:前进的菜鸟)
file
$file选项为将本地文件上传到集群,所有在本地引用的文件均需要以此方式配置。
例如:本地有mapper.py、reducer.py、config文件需要在streaming中使用,则需要以下配置:
...
-file "path1/mapper.py" \
-file "path2/reducer.py" \
-file "path3/config" \
...
jobconf
jobconf选项为任务配置选项(在新版本中为-D)
其中包含很多配置,常用参数配置如下:
使用范例:
...
-jobconf mapred.success.file.status=true \
...
常用配置:
参数 | 值 | 说明 |
mapred.success.file.status | true|false | 是否输出_SUCCESS文件 |
mapred.job.name | 字符串 | job名称 |
mapred.job.priority | VERY_HIGH | HIGH | NORMAL | LOW | VERY_LOW | job优先级 |
mapred.job.map.capacity | 数字 | 设置同时最多运行M个map任务 |
mapred.job.reduce.capacity | 数字 | 设置同时最多运行N个reduce任务 |
mapred.map.tasks | 数字 | 设置map任务个数 |
mapred.reduce.tasks | 数字 | 设置reduce任务个数(这个数字有多少就表示分了多少part) |
mapred.output.compression.codec | 压缩包名(例:gz压缩:org.apache.hadoop.io.compress.GzipCodec) | 压缩方式 |
mapred.output.compress | true|false | 是否压缩输出(能极大的节省存储空间) |
mapred.task.timeout | 数字 | 任务没有响应的最大时间 |
mapred.ignore.badcompress | true|false | 忽略输入的压缩文件的解压失败的情况 |
mapred.use.multimembergzip | true|false | 对输入解压缩操作 |
mapred.reduce.slowstart.completed.maps | 0-1之间浮点数 | 表示reducer在mapper执行到何时时启动,数字显示的是mapper运行百分比 |
以上配置设置完就可以跑一些简单的hadoop streaming脚本了。
额外配置
还有一些更为详细的配置MapReduce计算框架运行的配置项:
分桶、排序
我也只是不求甚解罢了,就不在此献丑。
详细配置请见:hadoop streaming 按字段排序与输出分割详解(作者: bitcarmanlee)
jobtracker
用于配置jobtracker(应置于第一项,否则会有报错)
${HADOOP_BIN} streaming \
-jt $jobtracker \ #host:端口
...
cacheFile\cacheArchive
用于分发大文件或档案(archive)到计算节点:
#分发大文件
-cacheFile ${myfile}#myfile \
#分发大档案(压缩包)
-cacheArchive ${myarchive}#myarchive \
此处的大文件和大档案均为HDFS集群中文件
这里的大文件、大档案可以在streaming及mapper\reducer中直接调用,#号后面的即时此文件的符号链接
在分发大档案(压缩包)时需要注意如果压缩的是文件夹(如filefold)则调用应为myarchive/filefold/.......
此方法可用于使用自定义的环境运行文件,例如想使用python3,则打包python3文件夹为python3.tar.gz上传HDFS后
...
-mapper "python3/python3/bin/python mapper.sh" \
...
-cacheArchive path/python3.tar#python3 \
...
后记
官方的文档真的真的是一个很好的学习资料:http://hadoop.apache.org/docs/r1.0.4/cn/streaming.html
本人也只是初学,还望各位大神多多指教。