C API libhdfs

概述

libhdfs是一个基于JNI的C语言API,用于Hadoop分布式文件系统(HDFS)。它提供了一组C语言API来操作HDFS文件和文件系统,这些API是HDFS API的子集。libhdfs是Hadoop发行版的一部分,预编译在$HADOOP_HDFS_HOME/lib/native/libhdfs.so中。libhdfs兼容Windows系统,可以通过在源代码树的hadoop-hdfs-project/hadoop-hdfs目录下运行mvn compile命令在Windows上进行构建。

API接口

libhdfs API是Hadoop FileSystem APIs的一个子集。

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源代码目录中的test_libhdfs_ops.c的CMake文件(hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt),或者类似这样的命令: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中的通配符条目。

线程安全

libhdfs是线程安全的。

  • 并发性与Hadoop FS "句柄"

    Hadoop FS实现包含一个基于namenode URI和连接用户的FS句柄缓存。因此,所有对hdfsConnect的调用将返回相同的句柄,而对不同用户调用hdfsConnectAsUser将返回不同的句柄。但由于HDFS客户端句柄是完全线程安全的,这对并发性没有影响。

  • 并发性与libhdfs/JNI

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