Ubuntuでlibhdfsのサンプルコードを動かしてみた

libhdfs を使ってコードを書いてみました系のエントリーが全然見つからなく、情弱な自分にとってはサンプルコードを動かすことすら敷居が高かったのでメモがてらエントリーを書いてみます。
環境は 64bit版 Ubuntu 10.04 です。

Hadoopのインストール

apt を使って CDH3 をインストールします。次のエントリーを見れば簡単にインストールできると思うので説明は割愛します。サービスの起動まで行います。
きりんさん日記: 1台構成のHadoopを30分で試してみる(Ubuntu + Cloudera)

libhdfsのインストール

Hadoop のインストールの際に Cloudera のリポジトリを追加していれば apt でインストールできます。

$ sudo aptitude install libhdfs0 libhdfs0-dev

サンプルコードの実行

C API to HDFS: libhdfs のサンプルを使います。
hdfs.h をインクルードパスから読み込むようにしているのと、出力文字に改行をつけているだけで他に変更はしていません。

libhdfs_sample.c

#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!\n";
    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);
}

次のようにコンパイルします。諸々のパスは環境に合わせて変更してください。
インクルードパスに hdfs.h, jni.h, jni_md.h が存在し、
共有ライブラリパスに libjvm.so と Hadoop 関連のライブラリが存在し、
CLASSPATH に Hadoop 関連の jar ファイルと conf ディレクトリが含まれていれば OK かと思います。

$ export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-sun/jre/lib/amd64/server:/usr/lib/hadoop/lib/native/Linux-amd64-64
$ for jar in $(ls /usr/lib/hadoop/*.jar); do CLASSPATH=$CLASSPATH:$jar; done
$ for jar in $(ls /usr/lib/hadoop/lib/*.jar); do CLASSPATH=$CLASSPATH:$jar; done
$ export CLASSPATH=$CLASSPATH:/etc/hadoop/conf
$ gcc -o libhdfs_sample libhdfs_sample.c  -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -lhdfs

※libhdfs では CLASSPATH の内容をそのまま -Djava.class.path に渡すのでワイルドカードは使えません

実行

$ hadoop fs -lsr /  # 現在の状況を確認
12/02/09 22:39:28 INFO security.UserGroupInformation: JAAS Configuration already set up for Hadoop, not re-installing.
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var/lib
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var/lib/hadoop-0.20
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var/lib/hadoop-0.20/cache
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var/lib/hadoop-0.20/cache/mapred
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var/lib/hadoop-0.20/cache/mapred/mapred
drwx------   - mapred supergroup          0 2012-02-01 23:48 /var/lib/hadoop-0.20/cache/mapred/mapred/system
-rw-------   1 mapred supergroup          4 2012-02-01 23:48 /var/lib/hadoop-0.20/cache/mapred/mapred/system/jobtracker.info
$ ./libhdfs_sample  # 実行
12/02/09 22:40:07 INFO security.UserGroupInformation: JAAS Configuration already set up for Hadoop, not re-installing.
$ hadoop fs -lsr /  # /tmp/testfile.txt が作成されている!
12/02/09 22:40:25 INFO security.UserGroupInformation: JAAS Configuration already set up for Hadoop, not re-installing.
drwxr-xr-x   - arabiki supergroup          0 2012-02-09 22:40 /tmp
-rw-r--r--   1 arabiki supergroup         15 2012-02-09 22:40 /tmp/testfile.txt
drwxr-xr-x   - mapred  supergroup          0 2012-02-01 23:48 /var
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var/lib
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var/lib/hadoop-0.20
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var/lib/hadoop-0.20/cache
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var/lib/hadoop-0.20/cache/mapred
drwxr-xr-x   - mapred supergroup          0 2012-02-01 23:48 /var/lib/hadoop-0.20/cache/mapred/mapred
drwx------   - mapred supergroup          0 2012-02-01 23:48 /var/lib/hadoop-0.20/cache/mapred/mapred/system
-rw-------   1 mapred supergroup          4 2012-02-01 23:48 /var/lib/hadoop-0.20/cache/mapred/mapred/system/jobtracker.info
$ hadoop fs -cat /tmp/testfile.txt  # 中身の確認
12/02/09 22:40:53 INFO security.UserGroupInformation: JAAS Configuration already set up for Hadoop, not re-installing.
Hello, World!

ちゃんとファイルが作成できてますね!
というわけで誰か libhdfs を使って便利なツールを作ってください!!