libhdfs配置使用


libhdfs簡介

libhdfs是hadoop為C/C++訪問分布式文件系統提供的JNI接口。

配置環境:

linux:CentOS5.5

hadoop:hadoop-0.21.0

jdk:jdk1.6.0_26

libhdfs環境變量配置

把libhdfs需要的jar包加入CLASSPATH中。因為不知道所需的jar包是哪些,並且因為配置的hadoop版本也不同,因此肯定能跑的方法就是將全部jar包添加進CLASSPATH變量內。PS:直接將兩個目錄包進去好像是不行的,也不知道為什么。

使用root用戶執行命令

vim /etc/profile

打開profile文件,在文件尾部添加

# #號開頭的為注釋,文件內是不需要的

#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

動態鏈接庫的配置

添加動態鏈接庫到/etc/ld.so.conf.f中,使用root權限輸入命令
vim /etc/ld.so.conf.d/hdfs.conf
java的動態鏈接庫路徑$JAVA_HOME/jre/lib/i386/server
libhdfs的動態鏈接庫路徑$HADOOP_HOME/c++/Linux-i386-32/lib
向里面添加java的動態鏈接庫路徑和libhdfs的動態鏈接庫路徑
/usr/java/jdk1.6.0_26/jre/lib/i386/server
/usr/local/hadoop/hadoop-0.21.0/c++/Linux-i386-32/lib

保存退出后,執行命令使其生效

ldconfig -v

Makefile文件

linux下編過程序都知道,當多文件時,使用makefile文件是必不可少的。你也可以使用命令行,只不過繁瑣一點而已。

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測試代碼

#include "hdfs.h"

int main(int argc, char **argv) {

    hdfsFS fs = hdfsConnect("192.168.1.147", 9000);//default為本地文件系統,ip地址為HDFS系統
    const char* writePath = "/tmp/testfile.txt";//要事先創建一個測試文件
    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);
}

執行並測試

在makefile文件的目錄下執行命令

第一條:make
第二條:./hadoop

打開瀏覽器輸入你的HDFS地址http://192.168.1.147:50070

進入HDFS系統查看是否存在此文件。

image
點擊Browse the filesystem進入
image
進入/tmp查看到文件testfile.txt。證明上傳成功!
image

常見錯誤

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

問題:Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/commons/configuration/Configuration……

解決方案:

肯定是CLASSPATH路徑沒有設置正確,沒有添加到所需的jar包,回到上文查看libhdfs環境變量配置即可。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

問題: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
重新創建一個鏈接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
保存退出后,執行ldconfig -v使其生效

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

※問題:配置環境后,提示CLASSPATH=……:No such file or directory

解決方案:

還是CLASSPATH配置錯誤。如循環添加hadoop的jar包,直接復制網上代碼,從而導致出錯。
原因是網上代碼與vim內字符集不同,CLASSPATH=$CLASSPATH:$i 前面的空格與vim內看似一樣實則不一樣,因此我一個下午就廢在這里了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

參考資料

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM