Hadoop C API libhdfs

本文固定链接:https://www.askmaclean.com/archives/hadoop-c-api-libhdfs.html

原文地址:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/LibHdfs.html

 

1介绍

Libhdfs 是一个在HDFS中JNI 基础的C API 。它提供了一个HDFS APIs的子集C APIs来操作HDFS文件和文件系统。Libhdfs

Libhdfs是Hadoop分布式的一部分,并且在$HADOOP_HDFS_HOME/lib/native/libhdfs.so中预编译。Libhdfs 兼容Winddows并且可以通过hadoop-hdfs-project/hadoop-hdf根目录下的mvn来编译。(www.askmaclean.com)

 

 

2 APIs

Libhdfs apis 时 Hadoop 文件系统API的一个子集。

在$HADOOP_HDFS_HOME/include/hdfs.h中的头文件描述了每个API的详细详细。(www.askmaclean.com)

 

 

3例子

#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);

}

 

 

 

4.如何连接这些库

在libhdfs的源目录(hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt)查看CMake文件或者例如:(www.askmaclean.com)

gcc above_sample.c -I$HADOOP_HDFS_HOME/include -L$HADOOP_HDFS_HOME/lib/native -lhdfs -o above_sample

 

5.常见问题

最常见的问题是在调用libhdfs过程中,CLASSPATH没有被设置正确。确保在正确路径中的hdfs-site.xml中包含所有hadoop运行所需的jar包。不能使用通配符来指定多个jars。可以使用hadoop classpath –glob 或 hadoop classpath –jar <path>来生产当前环境的正确classpath。参考http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/CommandsManual.html#classpath 获得更多命令。

 

6.线程安全

 

Libdhfs 是线程安全的

 

并发和Hadoop FS ‘句柄’:

Hadoop FS 处理包括FS缓存处理,缓存基于namenode的单独用户连接的URI。所以调用hdfsConnect会返回相同的句柄,但是调用hdfsConnectAsUser不同的用户返回不同的句柄。但是HDFS客户端句柄都是线程安全的,它们都是无关系的并发。(www.askmaclean.com)

 

并发和 libhdfs/JNI

Libhdfs调用的JNI应该总是本地存储创建的线程,所以在理论上,libhdfs应该是线程安全的作为底层调用Hadoop FS

 

Comment

*

沪ICP备14014813号

沪公网安备 31010802001379号