C API libhdfs

概觀

libhdfs 是一個基於 JNI 的 C API,用於 Hadoop 的分散式檔案系統 (HDFS)。它提供 C API 給 HDFS API 的子集,用於處理 HDFS 檔案和檔案系統。libhdfs 是 Hadoop 發行版的一部分,並預先編譯在 $HADOOP_HDFS_HOME/lib/native/libhdfs.so 中。libhdfs 與 Windows 相容,並可以在 Windows 上透過執行 mvn compile 在來源樹的 hadoop-hdfs-project/hadoop-hdfs 目錄中建置。

API

libhdfs API 是 Hadoop 檔案系統 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 控制代碼快取,其根據名稱節點的 URI 以及連線使用者進行快取。因此,所有對 hdfsConnect 的呼叫都會傳回相同的控制代碼,但對 hdfsConnectAsUser 的呼叫會傳回不同的控制代碼(使用不同的使用者)。但是,由於 HDFS 處理控制代碼是完全執行緒安全的,因此這與並行處理無關。

  • 並行處理和 libhdfs/JNI

    對 JNI 的 libhdfs 呼叫應始終建立執行緒局部儲存,因此(理論上)libhdfs 應與對 Hadoop FS 的基礎呼叫一樣執行緒安全。