writePath); exit(-1); } char* buffer = Hello

时间:2021-10-06 05:47:36

在通过Hadoop-2.6.0的C的API訪问HDFS的时候,编译和执行呈现了不少问题,花费了几天的时间,上网查了好多的资料,最终还是把问题给并吞了

參考文献:

系统:CentOS 6.6,hadoop-2.6.0, 在hadoop集群的datanode机器长进行

例子代码来源官方文档中的CAPI libhdfs:

#include"hdfs.h"

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main(int argc, char **argv) {

hdfsFS fs =hdfsConnect("10.25.100.130", 9000); //在这里做了一改削改

const char* writePath ="/tmp/testfile.txt";

hdfsFile writeFile = hdfsOpenFile(fs,writePath, O_WRONLY|O_CREAT, 0, 0, 0);

if(!writeFile) {

fprintf(stderr, "Failed toopen %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);

}

接下来就是编译。依照官网上给出的:

How To Link With The Library

See the CMake filefor test_libhdfs_ops.c in the libhdfssource directory (hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt) or something like: gcc above_sample.c -I$HADOOP_HDFS_HOME/include -L$HADOOP_HDFS_HOME/lib/native-lhdfs -o above_sample

试用此外一种:

[[email protected] ~]# gcc above_sample.c -I/home/hadoop/hadoop-2.6.0/include/ -L /home/hadoop/hadoop-2.6.0/lib/native/-lhdfs -o above_sample

能够通过,查了好多资料。非常少有人使用这一种。怎样使用这一种有错误,也能够换用第二种。


我使用的是这一种编译方法:

[[email protected] ~]# gcc above_sample.c -I/home/hadoop/hadoop-2.6.0/include/ -L /home/hadoop/hadoop-2.6.0/lib/native/-lhdfs /usr/java/jdk1.7.0_75/jre/lib/amd64/server/libjvm.so -o above_sample

这两种要领都能够生成一个可运行的文件above_sample

编译通过,能够在执行的时候呈现下面错误:

[[email protected] ~]# ./above_sample

./above_sample: error while loading sharedlibraries: libjvm.so: cannot open shared object file: No such file or directory

产生这样的报错的原因是,编译的措施执行期间必要依赖某个共享库,比喻上面,write可执行措施必要依赖一个叫“libxxxx.so”的共享库。(动态链接库与静态链接库的分歧。请百度相关文档)

/etc/ld.so.conf中插手路径,然后又一次载入共享库:

首先要找到缺掉这个库的存在路径

[[email protected] ~]# find / -name libhdfs.so.0.0.0

/home/hadoop/hadoop-2.6.0/lib/native/libhdfs.so.0.0.0

[[email protected] ~]# find / -name libjvm.so

/usr/java/jdk1.7.0_75/jre/lib/amd64/server/libjvm.so

 [[email protected] ~]# vi /etc/ld.so.conf

 编纂后例如以下:

include ld.so.conf.d/*.conf

/home/hadoop/hadoop-2.6.0/lib/native/

/usr/java/jdk1.7.0_75/jre/lib/amd64/server/

分袂插手了两个路径。每一个路径占一行。

编纂完后,又一次载入库:

[[email protected] ~]# /sbin/ldconfig –v

这一种要领是是针对整个系统,启动时就载入

 然后我们就继续运行可运行文件:

[[email protected] ~]# ./above_sample

loadFileSystems error:

(unable to get stack trace for java.lang.NoClassDefFoundError exception: ExceptionUtils::getStackTrace error.)

hdfsBuilderConnect(forceNewInstance=0, nn=172.25.40.171, port=9001, kerbTicketCachePath=(NULL), userName=(NULL)) error:

(unable to get stack trace for java.lang.NoClassDefFoundError exception: ExceptionUtils::getStackTrace error.)

颠末查找资料发明:

上述信息中的关键项是“NoClassDefFoundError”和“ExceptionUtils”。也就是找不到ExceptionUtils,一般可判断是由于找不到对应的jar文件,Google搜索“ExceptionUtils  jar”,发明“ExceptionUtils”该当是在包apache-commons-lang.jar中。

进一步用Google去搜索“apache-commons-lang.jar”,找到下载网址:,上面能够下载commons-lang3-3.3.2-bin.tar.gz,解压后就能够看到commons-lang3-3.3.2.jar。

hadoop的二进制安置包,该当自带了这个文件。通过努力。在hadoop安置文件夹下的share/hadoop/tools/lib子文件夹下发明了commons-lang-2.6.jar,该当就是它了

然后窜改我们的环境变量。在我们配置java环境变量之后插手hadoop的环境变量

[[email protected] ~]# vi /etc/profile

unset i

unset -f pathmunge

export JAVA_HOME=http://www.mamicode.com/usr/java/jdk1.7.0_75

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar

PATH=$PATH:$JAVA_HOME/bin

HADOOP_HOME=http://www.mamicode.com/home/hadoop/hadoop-2.6.0

exportPATH=$HADOOP_HOME/bin:$PATH

exportCLASSPATH=.:$HADOOP_HOME/share/hadoop/common/lib/commons-lang-2.6.jar

又一次执行措施。ExceptionUtils错误消掉了,但遇到新错误:

loadFileSystems error:

java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FileSystem

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FileSystem

at java.net.URLClassLoader$1.run(URLClassLoader.java:372)

at java.net.URLClassLoader$1.run(URLClassLoader.java:361)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:360)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

hdfsBuilderConnect(forceNewInstance=0, nn=10.25.100.130, port=9000, kerbTicketCachePath=(NULL), userName=(NULL)) error:

java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration

at java.net.URLClassLoader$1.run(URLClassLoader.java:372)

at java.net.URLClassLoader$1.run(URLClassLoader.java:361)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:360)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)