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 |
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 |