执行Hadoop job提示SequenceFile doesn't work with GzipCodec without native-hadoop code的解决过程记录
参照Hadoop.The.Definitive.Guide.4th的例子,执行SortDataPreprocessor作业时失败,输出的错误信息
SequenceFile doesn't work with GzipCodec without native-hadoop code!
根据提示初步猜测应该是没有加载到对应的库,怀疑是java的某个jar包没有加载到。根据提示搜索参考了一些解决方案,应该是hadoop native lib没有加载到,于是继续了解什么是hadoop native lib。
hadoop native lib
字面上意思就是hadoop的本地运行库,由于hadoop的一些操作(比如压缩)为了提高性能,不适合使用java的库运行,所以提供一批本地库。
参考http://www.cnblogs.com/gpcuster/archive/2011/02/17/1957042.html
好了,搞明白hadoop native lib后,现在要定位为什么没有加载成功
继续搜索,找到了相似的解决方案,参考http://blog.csdn.net/jiedushi/article/details/7496327,学习到了如下debug命令
export HADOOP_ROOT_LOGGER=DEBUG,console
通过这个设置,可以显示hadoop执行作业时的调试信息,也就是可以输出错误信息
启用调试之后,执行hadoop checknative(这是检测hadoop本地库是否加载成功的命令)
输出如下调试信息
16/03/18 03:44:41 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /usr/hadoop/lib/native/libhadoop.so.1.0.0: libc.so.6: version `GLIBC_2.14' not found (required by /usr/hadoop/lib/native/libhadoop.so.1.0.0)
根据调试信息继续进入另外一个洞,什么是GLIBC?
简单了解GLIBC,发现是一个C运行库,功能很强大,linux系统的重要基础组件。
根据提示信息"GLIBC_2.14"搜索,引出了一个更根本的问题,本机的GLIBC的版本不是2.14,是2.12,参考http://www.cnblogs.com/gw811/p/3676856.html(这篇文章的export方式升级版本无效果,还会导致命令行完全不可用)
现在确定需要升级GLIBC到2.14版本,直接用yum install不行,仅仅只是给2.12版本打升级包,但是版本没有升级。找了好几个解决方案,最终找到一个可行的
http://blog.csdn.net/niying/article/details/42491557
安装2.14版的步骤还算简单,只是比较长特别是执行make -j4,需要点耐心,关键步骤是通过更新软链接升级GLIBC版本
ln -fs /opt/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6
/lib64/libc.so.6本身就是一个已存在软链接,指向的是同目录的llibc-2.12.so,通过上述命令将新版的库链接到libc.so.6
完成上述步骤执行,再次执行hadoop checknative
INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
看到上述信息说明本地库加载成功
接着继续执行SortDataPreprocessor作业,成功运行,到此问题解决。