C API libhdfs

概述

libhdfs 是基于 JNI 的 C API,用于 Hadoop 的分布式文件系统 (HDFS)。它为 HDFS API 的子集提供 C API,以操作 HDFS 文件和文件系统。libhdfs 是 Hadoop 发行版的一部分,并预编译在 $HADOOP_HDFS_HOME/lib/native/libhdfs.so 中。libhdfs 与 Windows 兼容,并且可以通过在源树的 hadoop-hdfs-project/hadoop-hdfs 目录中运行 mvn compile 在 Windows 上构建。

API

libhdfs API 是 Hadoop FileSystem API 的子集。

libhdfs 的头文件详细描述了每个 API,并且可以在 $HADOOP_HDFS_HOME/include/hdfs.h 中找到。

示例程序

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

如何链接到库

请参阅 libhdfs 源目录(hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt)中的 test_libhdfs_ops.c 的 CMake 文件,或类似内容:gcc above_sample.c -I$HADOOP_HDFS_HOME/include -L$HADOOP_HDFS_HOME/lib/native -lhdfs -o above_sample

常见问题

最常见的问题是,在调用使用 libhdfs 的程序时,未正确设置 CLASSPATH。请确保将其设置为运行 Hadoop 本身所需的所有 Hadoop jar,以及包含 hdfs-site.xml 的正确配置目录。libhdfs 现在支持 CLASSPATH 中的通配符条目。

线程安全

libdhfs 是线程安全的。

  • 并发性和 Hadoop FS“句柄”

    Hadoop FS 实现包括 FS 句柄缓存,该缓存基于 namenode 的 URI 以及连接的用户进行缓存。因此,对 hdfsConnect 的所有调用都将返回相同的句柄,但使用不同用户对 hdfsConnectAsUser 的调用将返回不同的句柄。但是,由于 HDFS 客户端句柄是完全线程安全的,因此这与并发性无关。

  • 并发性和 libhdfs/JNI

    对 JNI 的 libhdfs 调用应始终创建线程本地存储,因此(理论上),libhdfs 应与对 Hadoop FS 的底层调用一样线程安全。