C API libhdfs

来源:互联网 发布:淘宝客服电话人工接听 编辑:程序博客网 时间:2024/05/20 21:59

C API libhdfs

Overview

Libhdfs是一个基于C的HDFS的JNI。它为一部分HDFS的API提供了一个C的 API,以使用C来管理HDFS文件和文件系统。Libhdfs是Hadoop发行版的一部分,预编译文件是 $HADOOP_PREFIX/libhdfs/libhdfs.so

The APIs

Libhdfs APIs是下面的一部分:

Libhdfs的头文件详细的描述了每个API,可以在头文件$HADOOP_PREFIX/src/c++/libhdfs/hdfs.h查看。

A Sample Program

 

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

查看libhdfs源代码目录中的hdfs_test.c的Makefile文件($HADOOP_PREFIX/src/c++/libhdfs/Makefile) ,都是些类似于下面这样的语句:

gcc above_sample.c -I$HADOOP_PREFIX/src/c++/libhdfs -L$HADOOP_PREFIX/libhdfs -lhdfs -oabove_sample

Common Problems

最常见的问题是,当调用一个使用了libhdfs的程序时,CLASSPATH没有被正确设置。确保你将所有的Hadoop需要的jar包放到环境变量中去。目前,无法以编程的方式生成classpath,但是一个好的方式是包含所有$HADOOP_PREFIX and $HADOOP_PREFIX/lib目录中的jar文件,同时配置一个正确的包含hdfs-site.xml的配置目录。

Thread Safe

Libhdfs是线程安全的:

1.      同步和HDFS FS处理

Hadoop FS的实现包括一个FS缓存处理器,缓存基于namenode的URL和用户的连接。所以,调用hdfsConnect将返回相同的handle,但是用不同用户调用hdfsConnectAsUser将返回不同的handle。但是,因为HDFS客户端handle是完全线程安全的,这对于并发没有影响。

2.      同步和libhdfs/JNI

Libhdfs调用JNI应该总是创建线程的本地存储,所以,理论上,libhdfs应该像底层调用HDFS FS一样是线程安全的。

0 0