0
点赞
收藏
分享

微信扫一扫

C API libhdfs


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 条评论