本篇文章给大家分享的是有关Hadoop Pipes编程中C++如何实现WordCount,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
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
Solution2:http://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
Solution3:forum.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&)':
Solution4:http://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)
Solution5:http://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。
以上就是Hadoop Pipes编程中C++如何实现WordCount,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。