Hadoop雖然用java實現,可是一樣能夠支持其餘語言的Map和Reduce。因爲須要學習C++方面的Hadoop實現,因此最近一直在研究Hadoop Streaming編程,其中Hadoop pipes容許C++程序員編寫mapreduce程序,它容許用戶混用C++和Java的RecordReader, Mapper, Partitioner,Rducer和RecordWriter等五個組件,下面是個人搭建以及遇到的問題。php
通常這種搭建的流程都是從官網看比較好,參考http://wiki.apache.org/hadoop/C++WordCount,裏面的流程簡單易懂。進入hadoop的安裝目錄,執行:html
ant -Dcompile.c++=yes examples
根據錯誤提示,安裝ant:java
sudo apt-get install ant
下面是源源不斷的錯誤以及源源不斷的解決辦法。。。linux
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 directoryc++
Solution1:根據報錯是因爲沒有安裝automake工具,因此執行:程序員
sudo apt-get install automake
Error2:build.xml:634: exec returned: 1express
Solution2:http://stackoverflow.com/questions/23112074/building-hadoop-1-2-1-core-jar-using-ant-failed,執行:apache
sudo apt-get install libtool
Error3:build.xml:2164: exec returned: 255編程
Solution3:forum.hadoop.tw/viewtopic.php?f=7&t=37970,參考裏面的實現步驟。app
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。