Tag Archives: inmexes

Hadoop java.library.path 問題

今回はSWIGを利用してC++で書かれたプログラムをHadoop MapReduceから使おうとした。
これを参考にして以下のような処理を実行。

swig -c++ -java -package yayamamo -outdir yayamamo -noproxy hoge.i
g++ -fPIC -c HogeFuga.cpp
g++ -fPIC -c hoge_wrap.cxx -I/usr/local/java/include -I/usr/local/java/include/linux
g++ -shared HogeFuga.o hoge_wrap.o -o hoge.so

これに倣った実行テストプログラムはめでたく動作、かと思われたが、実はC++で書かれたそのサブルーチンは引数に文字列 (= char * ) を取り、それを直接書き換えるもので、javaから呼び出すとその引数である文字列は変化しない。javaのStringオブジェクトの中身を直接書き換えるようにはなっていないから。なので、C++側で、引数で与えられた文字列を変更した結果が戻り値となる新規ルーチンを用意。

続いて Hadoop で使うための環境を整える。ここを見るとどうやら mapred-site.xml で mapred.child.java.optsプロパティの値に -Djava.library.path=/home/mycompany/lib を加えるだけのように思われた。しかし、ここに設定するとジョブが失敗する。それまで正常に動作していたものも。Hadoop 本体を実行するするスクリプト内で設定している JAVA_LIBRARY_PATH と競合している模様。仕方ないので、Hadoop にバンドルされているネイティブコードライブラリの置かれるディレクトリ lib/native/Linux-amd64-64 以下に先ほど生成した hoge.so をコピー。問題無く動作することを確認。

動的MEDLINE検索 for LSDB

無事公開可能になりました。
DBCLSによる公開バージョンinMeXesのURLはhttp://docman.dbcls.jp/im/

以下のアプリは同APIを利用しています。4文字以上入力すると検索開始です。