hadoop streaming/c++编程指南

1.       Hadoop streaming简介与工作机制

    Hadoop streaming可以帮助用户创建和运行一类特殊的Map/Reduce作业, 这些特殊的Map/Reduce作业是由一些可执行文件或脚本文件充当Mapper或者reducerMapperreducer都是可执行文件,它们从标准输入读入数据(一行一行读),并把计算结果发给标准输出。Hadoop Streaming会创建一个Map/Reduce作业,并把它发送给合适的集群,同时监视这个作业的整个执行过程。

如果一个可执行文件被用于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)作为valueMapReduce中的keyvalue的切分方式用户是可以自定义的。

 

2.       C++编程实例

下面以C++wordcount为例使用streaming编程接口。

a.       编写mapname:testmap.cpp

功能:将文本内容变为,输出到标准输出

//mapper

#include

#include

#include

using namespace std;

int main(){

        string key;

        int value = 1;

        while(cin>>key){

              if(!key.empty())

                 cout<<key<<"\t"<<value<<endl;

        }

        return 0;

}

 

b.       编写reduce

功能:对于相同的key,对其value相加

#include

#include

using namespace std;

int main() {

                map wordMap;

                map::iterator it;

                string key;

                int value;

                while(cin>>key>>value) {

                     wordMap[key] +=value;

                }

                for(it=wordMap.begin();it != wordMap.end();it++) {

                     cout<<it->first<<"\t"<<it->second<<endl;

                }

                return 0;

}

C.编译

 Makefile如下:

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

        $(CXX) $< -o $@

testreduce : testreduce.o

        $(CXX) $< -o $@

%.o : %.cpp

        $(CXX) -c $< -o $@ $(CXXFLAGS)

PHONY : clean

clean :

        -rm -rf $(target) $(target2) *.o

 

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                    Optional

分发本地文件

-cacheFile               Optional

分发HDFS文件

-cacheArchive            Optional

分发HDFS压缩文件

-numReduceTasks       Optional

reduce任务个数

-jobconf | -D NAME=VALUE    Optional

作业配置参数

-combiner     Optional

Combiner Java

-partitioner   Optional

Partitioner Java

-inputformat   Optional

InputFormat Java

-outputformat Optional

OutputFormat Java

-inputreader             Optional

InputReader配置

-cmdenv   =           Optional

传给mapperreducer的环境变量

-mapdebug              Optional

mapper失败时运行的debug程序

-reducedebug            Optional

reducer失败时运行的debug程序

-verbose                      Optional

详细输出模式

 

4.       –jobconf 作业参数

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, LOWVERY_LOW五种。

增加参数:-jobconf mapred.job.priority=NORMAL

不加参数时默认优先级为NORMAL

 

6.       Streaming程序本地测试

Streaming程序可以在单机上用下面的方式运行,因此可以先用小规模数据在单机调试,使用本地的调试方法和调试工具,节省开发测试的时间。

cat  input  |  mapper  |  sort  |  reducer  >  output

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值