ITPub博客

首页 > 大数据 > Hadoop > libhdfs的编译安装和配置(转)

libhdfs的编译安装和配置(转)

Hadoop 作者:david_dai2010 时间:2013-07-24 15:12:11 0 删除 编辑
实验环境:

硬件:IBM HS21

      2 Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz

      150G*2 SAS

      4G

操作系统:Centos 6.2, 2.6.32内核版本

hadoop版本:hadoop-0.20.203.1

安装目录:hadoop:/home/shim/hadoop

                 JAVA:/usr/java/jdk1.6.0_31

libhdfs是hadoop为C/C++访问分布式文件系统提供的JNI接口,不同于JNI编程,libhdfs为C/C++开发者提供了较为丰富的API函数,可以直接调用,而不需要在本地先成生DLL文件,再由java程序加载。libhdfs的开发滞后于hadoop的版本发行,分布式文件系统的一些新的功能可能没有实现。详细的API函数参见:http://hadoop.apache.org/common/docs/r0.20.2/api/org/apache/hadoop/fs/FileSystem.html。

样例代码:

-——————————————————————————————————————————————

#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' %sn", writePath);
          exit(-1);
    }
   hdfsCloseFile(fs, writeFile);
}
———————————————————————————————————————————————
主要有三个注意点:

1、环境变量

$vim /etc/profile

把运行libhdfs的需要的.jar文件加到CLASSPATH中。一种方法是把$HADOOP_HOME、$HADOOP_HOMElib下的所有jar文件都加入进来;另一种方法是只加入用到的.jar包,后一种方法参看了网上的文章

http://blog.csdn.net/deqingguo/article/details/7004898

实验中采用后一种方法:

——————————————————————————————————————————————

#add $HADOOP_HOME/*.jar to CLASSPATH
export    CLASSPATH=$CLASSPATH:$HADOOP_HOME/hadoop-core-0.20.203.1-SNAPSHOT.jar:$HADOOP_HOME/hadoop-example-0.20.203.1-SNAPSHOT.jar:$HADOOP_HOME/contrib/streaming/hadoop-streaming-0.20.203.1-SNAPSHOT.jar:$HADOOP_HOME/lib/commons-lang-2.4.jar:$HADOOP_HOME/lib/commons-logging-api-1.0.4.jar:$HADOOP_HOME/lib/commons-configuration-1.6.jar
——————————————————————————————————————————————
$source /etc/profile

常见提示错误:

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

...

Call to org.apache.hadoop.fs.Filesystem::get(URI, Configuration) failed!
Exception in thread "main" java.lang.NullPointerException
Call to get configuration object from filesystem failed!

2、动态链接库

为什么需要添加动态链接库,可以参考JNI编程的一般方法。java调用native方法,都需要从从本地加载动态链接库,才能完成JVM与本地操作系统的交互。JNI编程中,DLL文件需要自己编写生成,hadoop则提供了完整的函数,只需要把相关.so文件加入到/etc/ld.so.conf.d中即可。
一般的错误提示信息如下:
./testHdfs: error while loading shared libraries: xxx.so.0:cannot open shared object file: No such file or directory

我这个版本JAVA的动态链接库在$JAVA_HOME/jre/lib/amd64目录下
libhdfs的动态链接库在$HADOOP_HOME/build/c++/Linux-amd64-64/lib目录下


/etc/ld.so.conf.d是一个目录信息,可用root权限直接添加一条文件信息进去:
$vim /etc/ld.so.conf.d/hdfs.conf
————————————————————————————————————————————
/home/shim/hadoop/c++/Linux-amd64-64/lib
/usr/java/jdk1.6.0_31/jre/lib/amd64/server

————————————————————————————————————————————
保存退出,运行命令使生效:
$/sbin/ldconfig -v
或
$ldcofig

3、Makefile文件

简单的小程序可以用shell命令行的方式进行编译,一般而言用Makefile是更为方便简洁的方法。提供一个Makefile的模板:
————————————————————————————————————————————
HADOOP_INSTALL=/home/shim/hadoop
PLATFORM=Linux-i386-32
JAVA_HOME=/usr/java/jdk1.6.0_31
CPPFLAGS= -I$(HADOOP_INSTALL)/src/c++/libhdfs
LIB = -L$(HADOOP_INSTALL)/c++/Linux-amd64-64/lib/
libjvm=/usr/java/jdk1.6.0_31/jre/lib/amd64/client/libjvm.so
LDFLAGS += -lhdfs

testHdfs: testHdfs.c
    gcc testHdfs.c  $(CPPFLAGS) $(LIB) $(LDFLAGS) $(libjvm) -o testHdfs

clean:
    rm testHdfs
————————————————————————————————————————————
Makefile中LIB和libjvm的变量其实在动态链接库中已经设置,这里依然列出来是为了Makefile的规范性

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23630255/viewspace-1120162/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-03-31