hadoop通过hadoop streaming 来实现用非Java语言写的mapreduce代码。 对于一个一点Java都不会的我来说,这真是个天大的好消息。

官网上hadoop streaming的介绍在:http://hadoop.apache.org/docs/r2.6.0/hadoop-mapreduce-client/hadoop-mapreduce-client-core/HadoopStreaming.html

我们用wordcount的例子来说明,输入文件我用的是从网上下载的哈利波特第七部的英文版,命名为h.txt

用C++写map程序,只要能够从标准输入中读取信息,并且能用标准输出来输出<key, value>键值对就行。

对于wordcount单词计数来说,map程序非常简单,只要把每个单词分别输出 后面再输出个1就行, 表示每个单词出现了1次

wordcount_map.cpp程序如下:

#include <iostream>
#include <string>
using namespace std; int main(int argc, char** argv)
{
string word;
while(cin >> word)
{
cout << word << "/t" << "" << endl;
}
return ;
}

reduce程序要能够读取map的输出键值对,并且把key值(单词)相同的键值对做整合,并且输出整合后结果

wordcount_reduce.cpp程序如下:

#include <iostream>
#include <string>
#include <map>
using namespace std; int main(int argc, char** argv)
{
string key, num;
map<string, int> count;
map<string, int>::iterator it;
while(cin >> key >> num)
{
it = count.find(key);
if(it != count.end())
{
it->second++;
}
else
{
count.insert(make_pair(key, ));
}
} for(it = count.begin(); it != count.end(); it++)
{
cout << it->first << "/t" << it->second << endl;
}
return ;
}

把两个.cpp文件编译为可执行文件,并且把这两个可执行文件放在hadoop根目录下

g++ -o mapperC wordcount_map.cpp
g++ -o reduceC wordcount_reduce.cpp

上传待处理文件h.txt到 hdfs 的 /user/kzy/input中

bin/hdfs dfs -put h.txt  /user/kzy/input

要运行hadoop streaming需要hadoop-streaming-2.6.0.jar,位置在hadoop-2.6.0/share/hadoop/tools/lib/hadoop-streaming-2.6.0.jar 开始我各种运行不了,就是因为新版本里面文件的位置和以前不一样了。

执行mapreduce,里面的选项我并不是完全理解,但是这样可以正常运行。 注意,老版本里的-jobconf 已经改名叫 -D 了

bin/hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.6..jar  \
-D mapred.job.name="word count~" \
-input /user/kzy/input/h.txt
-output /user/output/c++_out \
-mapper ./mapperC \
-reducer ./reduceC \
-file mapperC -file reduceC

查看结果,sort中 -k 2 表示用以tab为分隔符的第二个字段来排序 -n表示用数字形式排序 -r表示从大到小排序 显示结果前20行

bin/hadoop dfs -cat /user/output/c++_out/* | sort -k 2 -n -r|head -20

结果如下:

【hadoop2.6.0】用C++ 编写mapreduce的更多相关文章

  1. 国内最全最详细的hadoop2.2.0集群的MapReduce的最简单配置

    简介 hadoop2的中的MapReduce不再是hadoop1中的结构已经没有了JobTracker,而是分解成ResourceManager和ApplicationMaster.这次大变革被称为M ...

  2. Hadoop2.2.0 第一步完成MapReduce wordcount计算文本数量

    1.完成Hadoop2.2.0单机版环境搭建之后需要利用一个例子程序来检验hadoop2 的mapreduce的功能 //启动hdfs和yarn sbin/start-dfs.sh sbin/star ...

  3. Hadoop-2.2.0中文文档——MapReduce 下一代 -——集群配置

    目的 这份文档描写叙述了怎样安装.配置和管理从几个节点到有数千个节点的Hadoop集群. 玩的话,你可能想先在单机上安装.(看单节点配置). 准备 从Apache镜像上下载一个Hadoop的稳定版本号 ...

  4. Hadoop-2.2.0中国文档—— MapReduce 下一代 -- 公平调度

    目的 此文档描写叙述了 FairScheduler, Hadoop 的一个可插入式的调度器,同意 YARN 应用在一个大集群中公平地共享资源. 简单介绍 公平调度是一种分配资源给应用的方法.以致到最后 ...

  5. Hadoop-2.2.0中文文档—— MapReduce下一代- 可插入的 Shuffle 和 Sort

    简单介绍 可插入的 shuffle 和 sort 功能,同意在shuffle 和 sort 逻辑中用可选择的实现类替换.这个情况的样例是:用一个不是HTTP的应用协议,如RDMA来 shuffle 从 ...

  6. Hadoop-2.2.0中文文档—— MapReduce 下一代 - Encrypted Shuffle

    简单介绍 Encrypted Shuffle capability (加密洗牌功能? )同意用HTTPS 和 可选的client验证 (也称作双向的 HTTPS, 或有client证书的 HTTPS) ...

  7. Hadoop-2.2.0中文文档—— MapReduce 下一代--容量调度器

    目的 这份文档描写叙述 CapacityScheduler,一个为Hadoop能同意多用户安全地共享一个大集群的插件式调度器,如他们的应用能适时被分配限制的容量. 概述 CapacitySchedul ...

  8. 【hadoop2.6.0】一句话形容mapreduce

    网上看到的: We want to count all the books in the library. You count up shelf #1, I count up shelf #2. Th ...

  9. 编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行

    今天主要来说说怎么在Hadoop2.2.0分布式上面运行写好的 Mapreduce 程序. 可以在eclipse写好程序,export或用fatjar打包成jar文件. 先给出这个程序所依赖的Mave ...

随机推荐

  1. Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.

    Error: An App ID with identifier "*****" is not avaliable. Please enter a different string ...

  2. mycat1.5~1.6的一个bug

    以下语句在mysql单库中执行正常: SELECT * FROM device WHERE devicetype='AMS.Monitoring.XlCloud.QKL8154.XLCloudDevi ...

  3. 《如何将windows上的软件包或文件上传到linux服务上》

    昨天晚上朋友让我帮他简单的搭建个环境,他公司让他做款软件测试温度的,他自己搞的是嵌入式,在公司担任的是软件工程师,应届毕业生.也可能他们搞嵌入式的对这个linux系统不太熟,不会把windows上的软 ...

  4. 《samba服务配置的文本》

    创建简单的samba服务器 samba  很少用于互联网 /大部分用于局域网  网页更新/ 首先看下你是否安装后了samba. rpm -qa | grep samba samba的简介 1)samb ...

  5. ADO.NET笔记——将DataReader作为函数返回值

    相关知识: 在很多情况下,可能把数据库的访问封装到一个函数中,通过该函数返回一个DataReader对象给调用者.例如定义函数:SqlDataReader returnDR(),然后再Main函数中调 ...

  6. 了解jsonp

    <script>                //创建全局函数,用来处理 跨域 获取到的信息:        function name(data){            ....   ...

  7. JavaScript 中的 replace 方法

    定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. stringObject.replace(regexp/substr,replaceme ...

  8. Oracle 动态视图4 V$SESSION_WAIT & V$SESSION_EVENT

    一.视图V$SESSION_WAIT显示了session的当前等待事 Column Datatype Description SID NUMBER Session identifier SEQ# NU ...

  9. 使用另一种方式实现js中Function的调用(call/apply/bind)

    在JavaScript中函数的调用可以有多种方式,但更经典的莫过于call和apply.call跟apply都绑定在函数上,他们两个的第一个参数意义相同,传入一个对象,他作为函数的执行环境(实质上是为 ...

  10. [JQuery]学习总结

    1. Jquery 选择多个class 如何精确匹配 $("div[class='class1 class2']").css({ "margin-bottom" ...