libhdfs簡(jiǎn)介
libhdfs是hadoop為C/C++訪問分布式文件系統(tǒng)提供的JNI接口。
配置環(huán)境:
linux:CentOS5.5
hadoop:hadoop-0.21.0
jdk:jdk1.6.0_26
libhdfs環(huán)境變量配置
把libhdfs需要的jar包加入CLASSPATH中。因?yàn)椴恢浪璧膉ar包是哪些,并且因?yàn)榕渲玫膆adoop版本也不同,因此肯定能跑的方法就是將全部jar包添加進(jìn)CLASSPATH變量?jī)?nèi)。PS:直接將兩個(gè)目錄包進(jìn)去好像是不行的,也不知道為什么。
使用root用戶執(zhí)行命令
vim /etc/profile打開profile文件,在文件尾部添加
# #號(hào)開頭的為注釋,文件內(nèi)是不需要的 #libhdfs所在的文件夾$HADOOP_HOME /hdfs/src/c++/ libhdfs.PS:可能跟你的版本不一樣 #java的頭文件所在文件夾$JAVA_HOME /include:$JAVA_HOME/include/ Linux,也就是jni所在文件夾 export C_INICLUDE_PATH =$HADOOP_HOME/hdfs/src/c++/libhdfs:$JAVA_HOME/include:$JAVA_HOME/include/ Linux # export LD_LIBRARY_PATH =/usr/local/hadoop/hadoop- 0.21 . 0 /c++/Linux-i386- 32 /lib:/usr/java/jdk1. 6 .0_26/jre/lib/i386/ server #將$HADOOP_HOME目錄下的jar包全部添加 for i in $HADOOP_HOME/* .jar do CLASSPATH = $CLASSPATH:$i done #將$HADOOP_HOME / lib目錄下的jar全部添加 for i in $HADOOP_HOME/lib/* .jar do CLASSPATH = $CLASSPATH:$i done export CLASSPATH
動(dòng)態(tài)鏈接庫(kù)的配置
添加動(dòng)態(tài)鏈接庫(kù)到/etc/ld.so.conf.f中,使用root權(quán)限輸入命令vim /etc/ ld .so.conf.d/hdfs.conf
java的動(dòng)態(tài)鏈接庫(kù)路徑$JAVA_HOME/jre/lib/i386/server
libhdfs的動(dòng)態(tài)鏈接庫(kù)路徑$HADOOP_HOME/c++/Linux-i386-32/lib
向里面添加 java的動(dòng)態(tài)鏈接庫(kù)路徑和 libhdfs的動(dòng)態(tài)鏈接庫(kù)路徑
/usr/java/jdk1. 6 .0_26/jre/lib/ i386 /server/usr/local/hadoop/hadoop- 0.21 . 0 /c++/Linux-i386- 32 /lib
保存退出后,執(zhí)行命令使其生效
ldconfig -v
Makefile文件
linux下編過程序都知道,當(dāng)多文件時(shí),使用makefile文件是必不可少的。你也可以使用命令行,只不過繁瑣一點(diǎn)而已。
HADOOP_HOME=/usr/local/hadoop/hadoop- 0.21 . 0 PLATFORM =Linux-i386- 32 JAVA_HOME =/usr/java/jdk1. 6 .0_26 CPPFLAGS = -I$(HADOOP_INSTALL)/hdfs/src/c++/ libhdfs LIB = -L$(HADOOP_HOME)/c++/Linux-i386- 32 / lib libjvm =/usr/java/jdk1. 6 .0_26/jre/lib/i386/client/ libjvm.so LDFLAGS += - lhdfs hadoop: hadoop.c gcc hadoop.c $(CPPFLAGS) $(LIB) $(LDFLAGS) $(libjvm) - o hadoop clean: rm hadoop
libhdfs測(cè)試代碼
#include " hdfs.h " int main( int argc, char ** argv) { hdfsFS fs = hdfsConnect( " 192.168.1.147 " , 9000 ); // default為本地文件系統(tǒng),ip地址為HDFS系統(tǒng) const char * writePath = " /tmp/testfile.txt " ; //要 事先創(chuàng)建一個(gè)測(cè)試文件 hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY|O_CREAT, 0 , 0 , 0 ); if (! writeFile) { fprintf(stderr, " Failed to open %s for writing!\n " , writePath); exit( - 1 ); } char * buffer = " Hello, World! " ; tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+ 1 ); if (hdfsFlush(fs, writeFile)) { fprintf(stderr, " Failed to 'flush' %s\n " , writePath); exit( - 1 ); } hdfsCloseFile(fs, writeFile); }
執(zhí)行并測(cè)試
在makefile文件的目錄下執(zhí)行命令
第一條:make
第二條:./hadoop
打開瀏覽器輸入你的HDFS地址 http://192.168.1.147:50070
進(jìn)入HDFS系統(tǒng)查看是否存在此文件。
點(diǎn)擊Browse the filesystem進(jìn)入
進(jìn)入/tmp查看到文件testfile.txt。證明上傳成功!![]()
常見錯(cuò)誤
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------
問題:Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/commons/configuration/Configuration……
解決方案:
肯定是CLASSPATH路徑?jīng)]有設(shè)置正確,沒有添加到所需的jar包,回到上文查看libhdfs環(huán)境變量配置即可。----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------
問題:error while loading shared libraries: libhdfs.so.0:cannot open shared object file: No such file or directory
解決方案:
先將libhdfs.so.0刪除rm ./libhdfs.so.0
重新創(chuàng)建一個(gè)鏈接 ln?-s?./libhdfs.so.0.0.0?./libhdfs.so.0 ?
在/etc/ld.so.conf中加入一行/usr/local/hadoop/hadoop- 0.21 . 0 /c++/Linux-i386- 32 /lib保存退出后,執(zhí)行l(wèi)dconfig -v使其生效?
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------
※問題:配置環(huán)境后,提示CLASSPATH=……:No such file or directory
解決方案:
還是CLASSPATH配置錯(cuò)誤。如循環(huán)添加hadoop的jar包,直接復(fù)制網(wǎng)上代碼,從而導(dǎo)致出錯(cuò)。原因是網(wǎng)上代碼與vim內(nèi)字符集不同,CLASSPATH=$CLASSPATH:$i 前面的空格與vim內(nèi)看似一樣實(shí)則不一樣,因此我一個(gè)下午就廢在這里了。----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------
參考資料
http://www.cnblogs.com/amboyna/archive/2008/02/06/1065322.html
http://blog.sina.com.cn/s/blog_4e4ee8ed01010ezr.html
http://www.cnblogs.com/niocai/archive/2012/03/15/2398303.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
