mac os上配置CDH4.1.1版hbase并启用snappy

这两天乘周末时间在我的mac机器上配置了CDH4.1.1版的hadoop和hbase。hbase配置在伪分布式的hdfs上。整个配置倒也非常简单。使用CDH版hadoop和hbase比用社区版要简单太多了,需要特别配置的东西也少很多。很快我的hdfs和hbase服务都起来了。但当我要创建一个带snappy压缩的opentsdb表时,却发生了错误。regionserver的日志报告,载入native snappy library出错。这下倒是停出乎我的意料。在公司centos上,明明跑得很好,怎么会出错。一想之下,立刻明白,native lib的格式不对。在linux下应该native library是libsnappy.so,是ELF 64-bit LSB格式。但mac os上应该libsnappy.jnilib,是Mach-O 64-bit格式。于是没多想,从http://code.google.com/p/snappy/上下了1.0.5版,编译一把,生成了libsnappy.dylib。于是将其放在了jni native lib的指定路径下。没想到运行仍是有问题,好生诧异。一查之下,原来CDH自带的是snappy java1.0.4.1版本。于是乎找到http://code.google.com/p/snappy-java/,下载相应版本,呵呵,发现这个版本倒是自带了mac版的libsnappy.jnilib。好,省得自己编译了。然而将该lib放到指定位置后再次创建带snappy压缩的表,仍是报错。于是略有些恍惚,决定到代码里去找线索。看到代码里,才发觉这个水有点深。原来要在正常启用snappy压缩的一个前提必须是libhadoop必须能工作。但是开发社区竟然压根都没有打算要在cgywin和mac os上支持完整版的hadoop native library。My Godness! 具体可以参见JIRA issue: https://issues.apache.org/jira/browse/HADOOP-3659。

这下有点蒙。虽然libhadoop能够workaround,但libsnappy和libhadoop的装载是紧耦合,这个耦合真是有点缺心眼呀!但随念一想,我既然有屠龙刀,为何不用?屠龙刀吗,就是我有完整的源代码,我怕谁?于是乎,开始hack源代码。其实需要改的代码也不是很多,也就以下几个地方:

org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.hbase.util.CompressionTest以及org.apache.hadoop.io.compress.snappy.LoadSnappy。重新编译后,将新编译的jar放到相应位置,重启hdfs和hbase,创建test table,设置COMPRESSION=>'SNAPPY',哈哈,这次正确创建,再无问题。这下终于可以歇口气了。至于libhadoop,要等我有时间在来搞了。估计完整版的libhadoop十分困难,但要搞个hack版的,应该也不会太难。

你可能感兴趣的:(mac os上配置CDH4.1.1版hbase并启用snappy)