18.4.4 Hadoop Libhdfs的使用举例
Libhdfs可以用在POSIX线程编写的线程应用程序中。无论是与JNI的全局还是局部引用交互,使用者都必须显式地调用hdfsConvertToGlobalRef/hdfsDeleteGlobalRef API。
下面是一个Libhdfs应用的程序。
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'%s\n",writePath);
exit(-1);
}
hdfsCloseFile(fs, writeFile);
}
接下来再介绍一些具体情况的解决办法。
(1)如何连接到库
使用Libhdfs源文件目录(${HADOOP_HOME}/src/c++/libhdfs/Makefile)下的makefile或者使用下面的命令来连接库:
gcc above_sample.c-I${HADOOP_HOME}/src/c++/libhdfs-L${HADOOP_HOME}/libhdfs
-lhdfs-o above_sample
(2)CLASSPATH配置问题
使用Libhdfs最常见的问题就是在运行一个使用了Libhdfs的程序时CLASSPATH没有正确配置Libhdfs。请确保在每个运行Hadoop所必需的Hadoop jar包中对其进行了正确配置。另外,目前还没有使用程序自动生成CLASSPATH的方法,但有一个很好的办法就是引用${HADOOP_HOME}和${HADOOP_HOME}/lib下的所有JAR包,并且正确配置hdfs-site.xml中的目录。