C API libhdfs

概要

libhdfsは、Hadoopの分散ファイルシステム(HDFS)のためのJNIベースのC APIです。HDFSファイルとファイルシステムを操作するための、HDFS APIのサブセットをC 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 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`を含む正しい設定ディレクトリに設定されていることを確認してください。`CLASSPATH`内のワイルドカードエントリは、現在libhdfsでサポートされています。

スレッドセーフ

libdhfsはスレッドセーフです。

  • 並行性とHadoop FS「ハンドル」

    Hadoop FSの実装には、NameNodeのURIと接続するユーザーに基づいてキャッシュするFSハンドルキャッシュが含まれています。そのため、`hdfsConnect`へのすべての呼び出しは同じハンドルを返しますが、異なるユーザーで`hdfsConnectAsUser`を呼び出すと、異なるハンドルが返されます。しかし、HDFSクライアントハンドルは完全にスレッドセーフであるため、これは並行性に影響しません。

  • 並行性とlibhdfs/JNI

    JNIへのlibhdfs呼び出しは常にスレッドローカルストレージを作成する必要があるため(理論上)、libhdfsはHadoop FSへの基礎となる呼び出しと同じくらいスレッドセーフであるはずです。