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 を使って便利なツールを作ってください!!