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系统查看是否存在此文件。

点击Browse the filesystem进入
进入/tmp查看到文件testfile.txt。证明上传成功!

常见错误

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

问题: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

转载于:https://www.cnblogs.com/yedezhanghao/archive/2012/07/30/2615818.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值