hadoop streaming的单词统计C++版

    Hadoop的Streaming框架允许任何程序语言实现的可执行程序或者脚本在Hadoop MapReduce中使用,方便已有程序向Hadoop平台移植。Streaming的原理是用Java实现一个包装用户程序的MapReduce程序,该程序负责调用MapReduce Java接口获取key/value对输入,创建一个新的进程启动包装的用户程序,将数据通过管道传递给包装的用户程序处理,然后调用MapReduce Java接口将用户程序的输出切分成key/value对输出。Mapper重-input中读入数据(默认是一行一行读),然后提交到output。

举个C++的统计单词个数的例子:

1. Mapper函数:

#include <iostream>
#include <string>
using namespace std;

int main()
{
 string str;
 while(cin>>str)
  cout<<str<<"\t"<<"1"<<endl;
 return 0;
}

2.reduce

#include <iostream>
#include <map>

using namespace std;

int main() {
 map<string,int> wordMap;
  map<string,int>::iterator it;
 string key;
 int value;
 int count;
 while(cin>>key>>value) {
  wordMap[key] +=value;
 }
 for(it=wordMap.begin();it != wordMap.end();it++) {
  cout<<it->first<<"\t"<<it->second<<endl;
 }
 return 0;
}

3.参数意义

-file, -cacheFile, -cacheArchive:分别用于向计算节点分发本地文件(特别是当可执行文件在本地时,一定要记得指定)、HDFS文件和HDFS压缩文件。
-inputformat, -outputformat:指定inputformat和outputformat Java类,用于读取输入数据和写入输出数据,分别要实现InputFormat和OutputFormat接口。如果不指定,默认使用TextInputFormat和TextOutputFormat。
-numReduceTasks:指定reducer的个数,如果设置-numReduceTasks 0或者-reducer NONE则没有reducer程序,mapper的输出直接作为整个作业的输出。
-combiner:指定combiner Java类,对应的Java类文件打包成jar文件后用-file分发。
-partitioner:指定partitioner Java类,Streaming提供了一些实用的partitioner实现。
-cmdenv NAME=VALUE:给mapper和reducer程序传递额外的环境变量,NAME是变量名,VALUE是变量值。

4.也可以通过改变"-D<property>=<value>"来增加一些其他的配置,比如:

-D dfs.data.dir=/tmp
-D mapred.reduce.tasks=0
-D mapred.local.dir=/tmp/local
-D mapred.system.dir=/tmp/system
-D mapred.temp.dir=/tmp/temp

5. 运行

bin/hadoop fs -rmr output
bin/hadoop jar contrib/streaming/hadoop-streaming-x.y.z.jar -file Test/C++/Mapper -mapper "Test/C++/Mapper" -file Test/C++/Reducer -reducer "Test/C++/Reducer"   -input input -output output

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值