利用libhdfs访问分布式文件系统(hdfs)
操作系统:Ubuntu 16.04
Hadoop版本:2.7.3
Java版本:1.8.0_131
参考:
http://www.cnblogs.com/yedezhanghao/archive/2012/07/30/2615818.html
一:libhdfs环境配置
需要把jar包加入到CLASSPATH中。
修改 /etc/profile文件
添加以下内容:
export JAVA_HOME=/opt/jdk1.8.0_131 # java的主目录
export JAVA_BIN=$JAVA_HOME/bin # java的bin目录
export JAVA_LIB=$JAVA_HOME/lib # java的lib目录
export CLASSPATH=.:$JAVA_LIB/tools.jar:$JAVA_LIB/dt.jar # classpath路径
export PATH=$JAVA_HOME/bin:$PATH # java的主目录添加到path路径
# 以下将hadoop的*.jar包,添加到CLASSPATH下面
for i in /opt/hadoop-2.7.3/share/hadoop/hdfs/*.jar
do
CLASSPATH=$CLASSPATH:$i
done
for i in /opt/hadoop-2.7.3/share/hadoop/hdfs/lib/*.jar
do
CLASSPATH=$CLASSPATH:$i
done
for i in /opt/hadoop-2.7.3/share/hadoop/common/*.jar
do
CLASSPATH=$CLASSPATH:$i
done
for i in /opt/hadoop-2.7.3/share/hadoop/common/lib/*.jar
do
CLASSPATH=$CLASSPATH:$i
done
export CLASSPATH # 导出CLASSPATH
export HADOOP_HOME=/opt/hadoop-2.7.3
二:动态连接库的配置
(1)在/etc/ld.so.conf.f目录下,添加hdfs.conf文件
# hdfs default configuration
/opt/hadoop-2.7.3/lib/native
/opt/jdk1.8.0_131/jre/lib/amd64/server
(2)执行以下命令,使其生效
ldconfig –v
三:Makefile的编写
HADOOP_HOME=/opt/hadoop-2.7.3
JAVA_HOME=/opt/jdk1.8.0_131
CPPFLAGS= -I/opt/hadoop-2.7.3/include
LIB = -L/opt/hadoop-2.7.3/lib/native
libjvm=/opt/jdk1.8.0_131/jre/lib/amd64/server/libjvm.so
LDFLAGS += -lhdfs
hadoop: hadoopTest.c
gcc hadoopTest.c $(CPPFLAGS) $(LIB) $(LDFLAGS) $(libjvm) -o hadoop
clean:
rm hadoop
四:测试代码
#include "/opt/hadoop-2.7.3/include/hdfs.h"
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv) {
hdfsFS fs = hdfsConnect("192.168.1.150", 9000); // 服务器ip地址,端口号默认为9000
const char* writePath = "/herb.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);
}
常见问题:
参考:http://www.cnblogs.com/yedezhanghao/archive/2012/07/30/2615818.html
问题: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内看似一样实则不一样,因此我一个下午就废在这里了。
Call to master/192.168.41.134:9000 failed on connection exception: java.net.ConnectException: Conne
一般造成错误的原因可能为:
1.hadoop未启动(未全部启动),hadoop正常启动包括以下几个服务,如果服务没有全部启动,可以查看日志,根据日志查找原因
2.伪分布模式安装,在配置文件是使用了localhost 或 127.0.0.1,此时应该改为真实的ID,包括core-site.xml,mapred-site.xml,slaves,
masters,修改IP后,dataNode可能会无法启动,
把hdfs-site.xml 配置文件里面 dfs.data.dir 的值:
<property>
<name>dfs.data.dir</name>
<value>/data/hdfs/data</value>
</property>
中的文件夹中的所有文件删掉,重启hadoop