文档章节

Hadoop Pipes编程之C++实现WordCount

韩来明
 韩来明
发布于 2014/04/25 23:27
字数 1002
阅读 1.6K
收藏 1

Hadoop虽然用java实现,但是同样可以支持其他语言的Map和Reduce。由于需要学习C++方面的Hadoop实现,所以最近一直在研究Hadoop Streaming编程,其中Hadoop pipes允许C++程序员编写mapreduce程序,它允许用户混用C++和Java的RecordReader, Mapper, Partitioner,Rducer和RecordWriter等五个组件,下面是我的搭建以及遇到的问题。

一般这种搭建的流程都是从官网看比较好,参考http://wiki.apache.org/hadoop/C++WordCount,里面的流程简单易懂。进入hadoop的安装目录,执行:

ant -Dcompile.c++=yes examples

根据错误提示,安装ant:

 sudo apt-get install ant

下面是源源不断的错误以及源源不断的解决办法。。。

Error1:/build.xml:634: Execute failed: java.io.IOException: Cannot run program "autoreconf" (in directory "/home/hadoop/hadoop-1.2.1/src/native"): error=2, No such file or directory

Solution1:根据报错是由于没有安装automake工具,所以执行:

 sudo apt-get install automake

Error2:build.xml:634: exec returned: 1

Solution2http://stackoverflow.com/questions/23112074/building-hadoop-1-2-1-core-jar-using-ant-failed,执行:

sudo apt-get install libtool

Error3:build.xml:2164: exec returned: 255

Solution3forum.hadoop.tw/viewtopic.php?f=7&t=37970,参考里面的实现步骤。

1)安装g++

sudo apt-get install g++

2)编译wordcount.cpp

g++ -I/home/hadoop/hadoop-1.2.1/c++/Linux-i386-32/include -c wordcount.cpp

3)生成可执行文件

g++ wordcount.o -o wordcount -L/home/hadoop/hadoop-1.2.1/c++/Linux-i386-32/lib -lnsl -lpthread -lhadooppipes –lhadooputils

Error4:In function `HadoopPipes::BinaryProtocol::createDigest(std::string&, std::string&)':

Solution4http://blog.sina.com.cn/s/blog_605f5b4f010195w6.html

Step1:

sudo apt-get install libssl-dev

Step2:

g++ wordcount.o -o wordcount -L/home/hadoop/hadoop-1.2.1/c++/Linux-i386-32/lib -lnsl -lpthread -lhadooppipes -lhadooputils –lcrypto

经历了上面的重重问题,现在终于生成了可执行程序WordCount了,然后需要上传到HDFS,利用可执行文件执行。下面是命令:

</pre>
hadoop fs -mkdir wordcount/bin

hadoop fs -mkdir wordcount/input

hadoop fs -put wordcount.cpp /user/hadoop/wordcount/input/

hadoop fs -put wordcount /user/hadoop/wordcount/bin/

hadoop pipes -D hadoop.pipes.java.recordreader=true -D hadoop.pipes.java.recordwriter=true -program /user/hadoop/wordcount/bin/wordcount -input /user/hadoop/wordcount/input/ -output /user/hadoop/wordcount/output

其中我以wordcount.cpp为输入文件,将可执行文件上传到bin目录,输出目录是output。

执行的过程中又遇到问题:

Error5:java.io.IOException

at org.apache.hadoop.mapred.pipes.OutputHandler.waitForAuthentication(OutputHandler.java:188)

Solution5http://blog.csdn.net/sigxxl/article/details/12293435,终于找到同仁了。。。主要的解决方法就是重新编译生成libhadooppipes.a和libhadooputils.a这两个静态库,然后覆盖原先的静态库。

1)  进入hadoop/src/c++/pipes目录,执行./ configure。

Error6:./configure: line 413: test: please: integer expression expected

./configure: line 416: $4: Bad file descriptor

configure: error: check

./configure: line 302: return: please: numeric argument required

./configure: line 312: exit: please: numeric argument required

Solution6:找到configure文件的这一行,一般报错会指定这一行的,将as_fn_exit注释掉,如下:

</pre>
solution:as_fn_error ()

{

as_status=$1; test $as_status -eq 0 && as_status=1

if test "$4"; then

as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack

$as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4

fi

$as_echo "$as_me: error: $2" >&2

#as_fn_exit

$as_status

} # as_fn_error

2)   ./configure

make install(遇到同样的报错再次修改configure文件如上)

3)  进入hadoop/src/c++/utils,执行同样的步骤

./configure

make install

生成好新的libhadooppipes.a和libhadooputils.a这两个静态库和相关的头文件之后,将这些文件覆盖到~/hadoop/c++/Linux-i386-32/ 文件夹中的include目录和lib目录中去。重启hadoop,然后重新运行C++程序。

补充:之后我再次编译的时候,某次又抛出了error:g++ :error: -lcrypto: No such file or directory

这可急坏我了,多次查证,,原因是没有找到 libcrypto.so

解决办法:http://blog.csdn.net/yasi_xi/article/details/8658191

以我自身为例,进入到/lib/i386-linux-gnu目录,ll libcrypto*,查看一下当前链接情况,结果是没有libcrypto.so,没有指向libcrypto.so.1.0.0,也就是说,无法在ld中找到,所以添加软连接:

ln -s /lib/i386-linux-gnu/libssl.so.1.0.0 /lib/libssl.so.1.0.0/libssl.so

ln -s /usr/i386-linux-gnu/libcrypto.so.1.0.0 /lib/libssl.so.1.0.0/libcrypto.so

当然,这些libssl.so.1.0.0文件你得自己去找,找不到就去下一个,理论上安装了openssl就应该有的,ok,补充一下,终于不报错了

再次运行,OK。

转载请注明出处:http://www.ming-yue.cn/hadoop-pipes-wordcount/


© 著作权归作者所有

上一篇: 用hadoop计算PI值
下一篇: HBase配置安装
韩来明
粉丝 2
博文 9
码字总数 9242
作品 0
成都
私信 提问
Pydoop 架构和模块包介绍

背景 Hadoop支持Java以及C/C++开发,其中Hadoop Pipes(C++)支持MapReduce,而Hadoop libhdfs(C)支持HDFS的访问。但Python的解决方案仅能支持Hadoop部分功能,具体如下。 Hadoop Streaming:1...

索隆
2012/09/13
447
0
hadoop-2.8-src源码包中的hadoop pipes的例子之wordcount-nopipe.cc如何编译运行?

各位好!我的虚拟机是centos6.7(64位),已经安装了Hadoop-2.8的伪分布式集群,我使用Java编写MR程序,然后打包、提交、运行,都没问题。现在公司的要求是,使用C++编写MR程序(使用Hadoop ...

Chao8309
2015/11/18
222
0
Linux下使用Eclipse开发Hadoop应用程序 测试成功

参考:http://blog.sina.com.cn/s/blog62186b4601012acs.html HDFS 测试文件: 测试结果: 详细配置参考它的原文: Hadoop版本:hadoop-0.20.2 Eclipse版本:eclipse-java-helios-SR2-linux...

杨泽
2012/07/13
976
0
今天听人说了下hadoop底层是C++实现的

今天听人说了下hadoop底层是C++实现的,运行时搞了的个java环境,不知此说法对不对? 又挺他说好像有帮牛人用C++实现了一套和hadoop功能一模一样的东西,好像是功能还强一些。不知是真是假?...

金大胖
2011/12/27
1.4W
21
C++ 并行任务编程库 - cpp-taskflow

cpp-taskflow 是一个开源的 C++ 并行任务编程库,cpp-tastflow 非常快,只包含头文件,可以帮你快速编写包含复杂任务依赖的并行程序。 与现有的并行任务编程库(如OpenMP Tasking和Intel TBB...

匿名
2019/07/27
6.6K
6

没有更多内容

加载失败,请刷新页面

加载更多

应急广播户户通平台

一、平台概述 应急广播户户通平台为软硬一体化广播服务解决方案。实现了应急广播、视音频及图片文字信息、调频及数字广播FM、天气预报信息接收功能,以及视音频播放、智能机器人、电子日历等...

neocean
28分钟前
39
0
如何为Apache 2.2启用mod_rewrite

我已经在我的Vista机器上安装了新的Apache 2.2,一切正常,除了mod重写。 我没有注释 LoadModule rewrite_module modules/mod_rewrite.s 但是我的重写规则都没有,即使是简单的重写规则 Re...

javail
34分钟前
23
0
移除Python unicode字符串中的重音符号的最佳方法是什么?

我在Python中有一个Unicode字符串,我想删除所有的重音符号(变音符号)。 我在网上发现了一种用Java实现此目的的优雅方法: 将Unicode字符串转换为长规范化格式(带有单独的字母和变音符号)...

技术盛宴
50分钟前
48
0
ActiveMQ学习之SpringBoot整合ActiveMQ------>主题生产者和消费者

一、pom <!--聚合工程集成关系--> <!--统一整合第三方框架依赖信息--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</a......

冥焱
今天
75
0
两周自制脚本语言-第11天 优化变量读写性能

第11天 优化变量读写性能 以变量值的读写为例,向读者介绍基于这种理念的语言处理器性能优化方式。 11.1 通过简单数组来实现环境 假如函数包含局部变量x与y,程序可以事先将x设为数组的第0个...

果汁分你一半
今天
52
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部