一、环境
操作系统:centos 6.3 64bits
Hadoop版本:1.0.4
本文假设Hadoop的安装目录为<Hadoop>,Java的安装目录为<Java>
二、编译:
在<Hadoop>目录下,执行
1
|
ant compile-c++-libhdfs -Dislibhdfs=
true
|
三、配置
主要解决g++ 寻找头文件和动态链接库的问题。
1、头文件
libhdfs的头文件hdfs.h在目录<Hadoop>/src/c++/libhdfs下,因此需要告知头文件路径。
由于libhdfs是基于JNI的,所以Java的头文件也要告知g++,分别为<Java>/include 和 <Java>/include/linux。
2、动态链接库
Java的动态链接库在<Java>/jre/lib/amd64/server,编译时需要加-ljvm;
hdfs的动态链接库在<Hadoop>/c++/Linux-amd64-64/lib/,编译时需要加-lhdfs
3、设置必要的环境变量
sudo vim /etc/profile,加入下列内容
1
2
3
4
5
6
7
8
9
10
|
# JAVA
export
JAVA_HOME=
/usr/lib/java/jdk1
.7.0_40
export
JRE_HOME=${JAVA_HOME}
/jre
export
CLASSPATH=.:${JAVA_HOME}
/lib
:${JRE_HOME}
/lib
export
PATH=$PATH:${JAVA_HOME}
/bin
# HADOOP HDFS CPLUS
export
HADOOP_DIR=
/home/wm/work/hadoop/hadoop-1
.0.4
export
LD_LIBRARY_PATH=${JAVA_HOME}
/jre/lib/amd64/server
export
CLASSPATH=$CLASSPATH:${HADOOP_DIR}
/lib/commons-lang-2
.4.jar:${HADOOP_DIR}
/lib/commons-logging-api-1
.0.4.jar:${HADOOP_DIR}
/lib/commons-configuration-1
.6.jar:${HADOOP_DIR}
/hadoop-core-1
.0.4.jar:${HADOOP_DIR}
/contrib/streaming/hadoop-streaming-1
.0.4.jar
|
其中“# JAVA”部分,应当是安装配置JAVA时就设置的;“# HADOOP HDFS CPLUS”部分是专门位libhdfs设置的。编辑之后,记得source /etc/profile。
设置环境变量是为了让程序在运行时,找到链接库和java的相关class,所以主要是设置LD_LIBRARY_PATH和CLASSPATH。
四、使用hdfs,运行测试程序
1、编写测试源码
从官网上找到sample,testHDFS.cpp。代码大意是在hdfs添加文件/tmp/testfile.txt,内容为“Hello, World!”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include "hdfs.h"
int
main(
int
argc,
char
**argv) {
// @param: host, port
// hdfsFS fs = hdfsConnect("default", 0);
hdfsFS fs = hdfsConnect(
"127.0.0.1"
, 9000);
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);
return
0;
}
|
2、编译运行
执行下列执行编译
1
|
g++ testHdfs.cpp -I<Hadoop>
/src/c
++
/libhdfs
-I<Java>
/include
-I<Java>
/include/linux
-L<Hadoop>
/c
++
/Linux-amd64-64/lib/
-lhdfs -L<Java>
/jre/lib/amd64/server
-ljvm -o testHdfs
|
指令看起来有点繁杂,其实就是告知g++头文件和动态链接库的位置,具体内容在上文已经讲解。
将<Hadoop> <Java>变为我本机实际的安装路径,则编译指令如下:(很长。。)
1
|
g++ testHdfs.cpp -I
/home/wm/work/hadoop/hadoop-1
.0.4
/src/c
++
/libhdfs
-I
/usr/lib/java/jdk1
.7.0_40
/include
-I
/usr/lib/java/jdk1
.7.0_40
/include/linux
-L
/home/wm/work/hadoop/hadoop-1
.0.4
/c
++
/Linux-amd64-64/lib/
-lhdfs -L
/usr/lib/java/jdk1
.7.0_40
/jre/lib/amd64/server
-ljvm -o testHdfs
|
当然,为了使用方便,大家也可以根据上述指令写自己的Makefile。我在工程中使用CMake,因此就不用写Makefile。这里就不贴出CMake具体文档了,本质都差不多,就是设置头文件路径、动态链接库路径等。