3

我只是按照 Cloudera 文档中的步骤,在集群上安装了 GPL Extras Parcel,并通过 Cloudera Manager 配置了 HDFS 服务。但是尝试读取 HDFS 上的 .lzo 文件时出现错误:

$hadoop fs -text /tmp/Lzo/log.txt.lzo 
INFO lzo.GPLNativeCodecLoader: Loaded native gpl library
WARN lzo.LzoCompressor: java.lang.NoSuchFiledError: lzoCompressLevelFunc
ERROR lzo.LzoCodec: Failed to load/initialize native-lzo library
-text: Fatal internal error
java.lang.RuntimeException: native-lzo library not available

我已经阅读了十几篇文章,并且知道这是由于 JNI 加载 lzo 库失败引起的,但是没有一个可以正确解决我的问题。以下是我所做的努力:
1.所有datanodes都安装了lzop。
2.mapred-site.xml中的JAVA_LIBRARY_PATH设置为/opt/cloudera/parcels/CDH/lib/hadoop/lib/native,其中包含liblzo2.*文件。
3.HADOOP_CLASSPATH 设置为包含 hadoop-lzo.jar 文件的 /usr/local/lib。

我还可以做些什么?任何建议,将不胜感激!

4

2 回答 2

2

问题解决了!它是由 java.lang.NoSuchFiledError 引起的。Hadoop-lzo-0.4.15 没有字段 lzoCompressLevelFunc,当我切换到 hadoop-lzo0.4.20 时,WARN 和 ERROR 消失了。

于 2016-07-12T06:54:07.470 回答
0

我今天也遇到了这个问题,花了很长时间才弄清楚真正的根本原因是什么。

所以我想在这里总结一下这个问题:简而言之,jar和native库需要兼容,而确保这一点的最佳方法是从相同版本的源代码生成(构建)它们。

我昨天受苦的是我正在使用 hadoop-gpl-compression.jar,但是我正在使用的本机库是从 hadoop-lzo 构建的。所以这里存在兼容性问题。我之后做的是从 hadoop-gpl-compression 项目而不是 hadoop-lzo 构建本机库,然后它就可以工作了。

如果你使用的是从hadoop-lzo构建的jar,那么你也应该使用从那个库构建的native library,并且最好使用相同版本的source来构建native library。

如果你使用的是hadoop-gpl-compression项目构建的jar,那么你也应该使用它构建的native library,并且最好使用相同版本的source来构建native library。

于 2017-09-01T02:30:26.863 回答