本文固定链接:https://www.askmac.cn/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.askmac.cn)
2 APIs
Libhdfs apis 时 Hadoop 文件系统API的一个子集。
在$HADOOP_HDFS_HOME/include/hdfs.h中的头文件描述了每个API的详细详细。(www.askmac.cn)
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.askmac.cn)
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.askmac.cn)
并发和 libhdfs/JNI
Libhdfs调用的JNI应该总是本地存储创建的线程,所以在理论上,libhdfs应该是线程安全的作为底层调用Hadoop FS
Comment