libhdfs編譯,安裝,配置,使用


我是把hadoop 0.20.2安裝到/opt/hadoop目錄下,故 HADOOP_HOME=/opt/hadoop

而我系統安裝的是openjdk-1.6.0,主目錄 JAVA_HOME= /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64

一、編譯

 

$cd /opt/hadoop
$ant compile-c++-libhdfs -Dislibhdfs=true

 

 

二、安裝、配置

就是解決gcc尋找頭文件、連接動態鏈接庫問題以及環境變量。
其中gcc尋找頭文件以及動態鏈接庫可以通過設置環境變量,也可以通過Makefile來完成。
而libhdfs需要用到的JAVA的相關東西只能通過環境變量設置。其實就是CLASSPATH需要必須通過環境變量來設置。

1)環境變量設置(CLASSPATH必須通過這個來設置,其它項可以通過Makefile完成)

GCC尋找頭文件方面需要用到的環境變量:
我這個版本libhdfs的頭文件hdfs.h在 $HADOOP_HOME/src/c++/libhdfs 下,而libhdfs是基於JNI的,所以JAVA的頭文件也在哪也要告訴GCC。
JAVA頭文件在$JAVA_HOME/include和$JAVA_HOME/include/linux下。
所以設置環境變量
HADOOP_HOME=/opt/hadoop
JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64

# 此項可以通過Makefile設置
C_INCLUDE_PATH=$HADOOP_HOME/src/c++/libhdfs:$JAVA_HOME/include:$JAVA_HOME/include/linux

 

 
其它環境變量:
在安裝JAVA的時候就要設置CLASSPATH變量,其值一般為
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
我們在這基礎上,將$HADOOP_HOME/*.jar 以及 $HADOOP_HOME/lib/*.jar 全部添加到CLASSPATH環境變量中。雖然只是用到其中兩三個就行了,但我不知道到底是用哪個jar,所以就全部添加了。
 
具體環境變量的設置有兩種方法:

a)export設置立即生效,但只當次有效。重啟機器需要重新設置環境變量。

$export HADOOP_HOME=/opt/hadoop

其它環境變量設置參照上面命令。

 

b)修改/etc/profile設置環境變量。修改完並非立即生效,而是重啟機器后有效,而且以后都有效。

$gedit /etc/profile

 在這個文件中找到一行

export PATH MAIL USER ...

 在這行的前面添加

JAVA_HOME=你的JAVA主目錄
HADOOP_HOME=你的HADOOP主目錄

# 此項可以通過Makefile設置
C_INCLUDE_PATH
=那些頭文件所在目錄,用冒號:隔開 # 添加 $HADOOP_HOME/*.jar 到 CLASSPATH變量中 for i in $HADOOP_HOME/*.jar ; do   CLASSPATH=$CLASSPATH:$i done # 添加 $HADOOP_HOME/lib/*.jar 到 CLASSPATH變量中 for i in $HADOOP_HOME/lib/*.jar ; do   CLASSPATH=$CLASSPATH:$i done

 


 在這行的后面添加

export PATH MAIL USER ... JAVA_HOME HADOOP_HOME C_INCLUDE_PATH

 注:其中...表示省略的變量,還有很多變量,各個系統不一樣,沒必須全面寫在這里,而且不是重點。

 

2)動態鏈接庫(可通過Makefile設置)

我這個版本JAVA的動態鏈接庫在$JAVA_HOME/jre/lib/amd64目錄下
libhdfs的動態鏈接庫在$HADOOP_HOME/build/c++/Linux-amd64-64/lib目錄下
在centos 6中設置動態鏈接庫的方法為
在/etc/ld.so.conf.d/目錄下新建一個.conf文件,然后在文件里填入鏈接庫所在目錄。
$gedit /etc/ld.so.conf.d/hdfs.conf

在此文件中填入目錄

/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64
/opt/hadoop/build/c++/Linux-amd64-64/lib

 保存,退出,然后執行命令使配置文件生效

$ldconfig

 

3)通過Makefile設置相關項

Makefile寫法

#指定hadoop安裝目錄
HADOOP_INSTALL=/opt/hadoop
#使用的平台類型,32位的是Linux-i386-32,64位的是Linux-amd64-64
PLATFORM
=Linux-i386-32

#JAVA安裝目錄 JAVA_HOME
=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64

#尋找頭文件的目錄
CPPFLAGS
= -I$(HADOOP_INSTALL)/src/c++/libhdfs -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
#尋找動態鏈接庫的目錄
LIB
= -L$(HADOOP_INSTALL)/c++/Linux-i386-32/lib/ libjvm=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client/libjvm.so LDFLAGS += -lhdfs testHdfs: testHdfs.c gcc testHdfs.c $(CPPFLAGS) $(LIB) $(LDFLAGS) $(libjvm) -o testHdfs clean: rm testHdfs

 

Makefile.am的寫法

SUBDIRS=
HADOOP_INSTALL=/opt/hadoop
PLATFORM=Linux-amd64-64
JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
INCLUDES=-I$(HADOOP_INSTALL)/src/c++/libhdfs -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
LDADD
=-L$(HADOOP_INSTALL)/c++/$(PLATFORM)/lib -lhdfs
export INCLUDES LDADD

 

 

 

三、使用

測試代碼

/* testLibhdfs.c */

#include "hdfs.h" int main(int argc, char **argv) { hdfsFS fs = hdfsConnect("default", 0); 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); }

 編譯、運行:

$gcc -o testLibhdfs testLibhdfs.c -lhdfs
$./testLibhdfs




免責聲明!

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



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