1.
如果一个可执行文件被用于Mapper,则在Mapper初始化时,每一个Mapper任务会把这个可执行文件作为一个单独的进程启动。 Mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。同时,Mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为Mapper的输出。默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。如果没有tab,整行作为key值,value值为null。如果一个可执行文件被用于reducer,每个reducer任务会把这个可执行文件作为一个单独的进程启动。 Reducer任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。同时,reducer收集可执行文件进程标准输出的内容,并把每一行内容转化成key/value对,作为reducer的输出。默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。Map和Reduce中的key和value的切分方式用户是可以自定义的。
2.
下面以C++的wordcount为例使用streaming编程接口。
a.
功能:将文本内容变为,输出到标准输出
//mapper #include #include #include using namespace std; int main(){ } |
b.
功能:对于相同的key,对其value相加
#include #include using namespace std; int main() { } |
C.编译
CXX = g++ CXXFLAGS = -g -Wall -O2 sources = testmap.cpp sources2 = testreduce.cpp target = $(basename $(sources)) target2 = $(basename $(sources2)) .PHONY : all all : $(target) $(target2) testmap : testmap.o testreduce : testreduce.o %.o : %.cpp PHONY : clean clean : |
d.编写运行脚本
run.sh
编写运行脚本,需要指定HADOOP_HOME,例如提交到yuqing资源池队列,如下:
PWD=/home/zhaizhouwei/wordcount HADOOP_HOME=/home/zhaizhouwei /hadoop-0.20.2-cdh3u5 streaming=$HADOOP_HOME/ hadoop-streaming-0.20.2-cdh3u5.jar $HADOOP_HOME/bin/hadoop jar $streaming \ -file $PWD/testmap \ -mapper $PWD/testmap \ -file $PWD/testreduce \ -reducer $PWD/testreduce \ -input /data0/yuqing/zhaizhouwei/tinput \ -output /data0/yuqing/zhaizhouwei/toutput \ -numReduceTasks 1 \ -jobconf mapred.job.name="test_wordcount" \ -jobconf mapred.job.queue.name="yuqing" |
然后运行run.sh就可以提交作业到hadoop集群。
3. Streaming命令
streaming参数,下面是参数列表:
-input | 输入数据路径 |
-output | 输出数据路径 |
-mapper | mapper可执行程序或Java类 |
-reducer | reducer可执行程序或Java类 |
-file | 分发本地文件 |
-cacheFile | 分发HDFS文件 |
-cacheArchive | 分发HDFS压缩文件 |
-numReduceTasks | reduce任务个数 |
-jobconf | -D NAME=VALUE | 作业配置参数 |
-combiner | Combiner Java类 |
-partitioner | Partitioner Java类 |
-inputformat | InputFormat Java类 |
-outputformat Optional | OutputFormat Java类 |
-inputreader | InputReader配置 |
-cmdenv | 传给mapper和reducer的环境变量 |
-mapdebug | mapper失败时运行的debug程序 |
-reducedebug | reducer失败时运行的debug程序 |
-verbose | 详细输出模式 |
4.
mapred.job.name | 作业名 |
mapred.job.priority | 作业优先级 |
mapred.job.map.capacity | 最多同时运行map任务数 |
mapred.job.reduce.capacity | 最多同时运行reduce任务数 |
hadoop.job.ugi | 作业执行权限 |
mapred.map.tasks | map任务个数 |
mapred.reduce.tasks | reduce任务个数 |
mapred.job.groups | 作业可运行的计算节点分组 |
mapred.task.timeout | 任务没有响应(输入输出)的最大时间 |
mapred.compress.map.output | map的输出是否压缩 |
mapred.map.output.compression.codec | map的输出压缩方式 |
mapred.output.compress | reduce的输出是否压缩 |
mapred.output.compression.codec | reduce的输出压缩方式 |
stream.map.output.field.separator | map输出分隔符 |
5.
目前调度器支持可以使用的优先级从高到低依次有VERY_HIGH, HIGH, NORMAL, LOW和VERY_LOW五种。
增加参数:-jobconf mapred.job.priority=NORMAL
不加参数时默认优先级为NORMAL。
6.
Streaming程序可以在单机上用下面的方式运行,因此可以先用小规模数据在单机调试,使用本地的调试方法和调试工具,节省开发测试的时间。
cat |