libhbase编译小记

从MapR的Github上下下来的libhbase后不论在OS X上还是Linux上都编译失败,对照着错误修改了多处地方,使得在OS X上和Linux上都能正常编译和运行。修改过的代码地址:

1
git@github.com:haosdent/libhbase.git

编译前先保证ant已安装,使用1.6的JDK作为JAVA_HOME,同时加下203.208.46.222 googletest.googlecode.comhosts文件(感谢伟大的GFW)。
clone代码后直接执行:

1
mvn install -DskipTests

正常结束后可以看到target/libhbase-1.0-SNAPSHOT/这个目录,说明已经编译成功。

libhbase的样例代码可参考example_async这个文件。

在Linux下,编译代码时,需要将libhbase.solibjvm.so加入动态链接库的搜索路径,同时加入先前编译得到的头文件。头文件和libhbase.so分别在target/libhbase-1.0-SNAPSHOT/include目录和target/libhbase-1.0-SNAPSHOT/native目录下,libjvm.so${JAVA_HOME}/jre/lib/amd64/server目录下,
编译命令如下所示:

1
gcc example_async.c -I ${LIB_HBASE_HOME}/target/libhbase-1.0-SNAPSHOT/include -L ${LIB_HBASE_HOME}/target/libhbase-1.0-SNAPSHOT/lib/native -L ${JAVA_HOME}/jre/lib/amd64/server -l hbase -l jvm -std=c99

Linux上运行编译好后的文件,也需要将${JAVA_HOME}/jre/lib/amd64/servertarget/libhbase-1.0-SNAPSHOT/native加入到LD_LIBRARY_PATH环境变量。

在OS X下,编译代码与Linux上类似,但需要加入动态链接库搜索路径的是libhbase.dyliblibjvm.dyliblibhbase.dylibtarget/libhbase-1.0-SNAPSHOT/native目录下,libhbase.dylib则在${JAVA_HOME}/../Libraries。编译命令如下所示:

1
gcc example_async.c -I ${LIB_HBASE_HOME}/target/libhbase-1.0-SNAPSHOT/include -L ${LIB_HBASE_HOME}/target/libhbase-1.0-SNAPSHOT/lib/native -L ${JAVA_HOME}/../Libraries -l hbase -l jvm -std=c99

值得注意的是,OS X上所用gcc需为GNU GCC,而非Apple LLVM Clang,可通过HomeBrew直接安装GCC。

OS X上运行编译好后的文件,也需要将${JAVA_HOME}/../Librariestarget/libhbase-1.0-SNAPSHOT/native加入到LD_LIBRARY_PATH环境变量。

最后简单测了下libhbase的写入性能,由于libhbase提供的接口都是异步接口,所以只用了一个线程,往HBase里面插入100w条数据。在写HLog的情况下,写入的QPS在5W每秒左右,基本跑满网卡。