阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Hadoop安装lzo-出现Could not load native gpl library问题解决

155次阅读
没有评论

共计 4113 个字符,预计需要花费 11 分钟才能阅读完成。

此篇是接着 Hadoop 安装 lzo 的续篇 http://www.linuxidc.com/Linux/2014-03/98602.htm,主要讲一下安装过程中出现的问题及解决方案。

Could not load native gpl library

异常堆栈:

12/11/07 10:15:02 ERROR lzo.GPLNativeCodeLoader: Could not load native gpl library 
java.lang.UnsatisfiedLinkError: no gplcompression in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
    at java.lang.System.loadLibrary(System.java:1028) 
    at com.Hadoop.compression.lzo.GPLNativeCodeLoader.<clinit>(GPLNativeCodeLoader.java:32) 
    at com.Hadoop.compression.lzo.LzoCodec.<clinit>(LzoCodec.java:71) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:247) 
    at org.apache.Hadoop.conf.Configuration.getClassByName(Configuration.java:943) 
    at org.apache.Hadoop.io.compress.CompressionCodecFactory.getCodecClasses(CompressionCodecFactory.java:89) 
    at org.apache.Hadoop.io.compress.CompressionCodecFactory.<init>(CompressionCodecFactory.java:134) 
    at com.twitter.elephantbird.mapreduce.input.LzoRecordReader.initialize(LzoRecordReader.java:61) 
    at com.twitter.elephantbird.mapreduce.input.LzoBinaryB64LineRecordReader.initialize(LzoBinaryB64LineRecordReader.java:79) 
    at org.apache.Hadoop.mapreduce.lib.input.DelegatingRecordReader.initialize(DelegatingRecordReader.java:80) 
    at org.apache.Hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:450) 
    at org.apache.Hadoop.mapred.MapTask.runNewMapper(MapTask.java:645) 
    at org.apache.Hadoop.mapred.MapTask.run(MapTask.java:322) 
    at org.apache.Hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:210) 

如果是按照上一篇(http://www.linuxidc.com/Linux/2014-03/98602.htm)来做的,出现以上异常的原因大多是以下两种情况:

1. 没有拷贝 lzo 本地库到相应目录造成的

在目录 /opt/modules/hadoop/hadoop-1.0.2/lib/native/Linux-i386-32 下需要有 libhadoop*.so 和 libgplcompression*.so 库。

-rw-r–r–. 1 hadoop hadoop  76938 Sep 30 18:17 libgplcompression.a
-rw-rw-r–. 1 hadoop hadoop  1140 Sep 30 18:17 libgplcompression.la
-rwxrwxr-x. 1 hadoop hadoop  59229 Sep 30 18:17 libgplcompression.so
-rwxrwxr-x. 1 hadoop hadoop  59229 Sep 30 18:17 libgplcompression.so.0
-rwxrwxr-x. 1 hadoop hadoop  59229 Sep 30 18:17 libgplcompression.so.0.0.0
-rw-rw-r–. 1 hadoop hadoop 301066 Jul 15 05:40 libhadoop.a
-rw-rw-r–. 1 hadoop hadoop    873 Jul 15 05:40 libhadoop.la
-rw-rw-r–. 1 hadoop hadoop 199000 Jul 15 05:40 libhadoop.so
-rw-rw-r–. 1 hadoop hadoop 199000 Jul 15 05:40 libhadoop.so.1
-rw-rw-r–. 1 hadoop hadoop 199000 Jul 15 05:40 libhadoop.so.1.0.0

2. 没有正常设置 LD_LIBRARY_PATH

<property>
        <name>mapred.child.env</name>
        <value>LD_LIBRARY_PATH=/opt/modules/hadoop/hadoop-1.0.2/lib/native/Linux-i386-32</value>
 </property>

在 mapred-site.xml 配置里需要配置本地库路径。

linux 共享库位置配置,Java 程序在启动时系统初始化 java.library.path 属性。

LD_LIBRARY_PATH 环境变量主要是用于指定动态链接器(ld)查找 ELF 可执行文件运行时所依赖的动态库(so)的路 java.library.path 径,其内容是以冒号分隔的路径列表。ld 链接器将优先在该变量设置的路径中查找,若未找到则在标准库路径 /lib 和 /usr/lib 中继续搜索。

所以有几种方式来设置 LD_LIBRARY_PATH,第一是环境变量,第二是更改 /etc/ld.so.conf 文件。

写了一段程序来测试:

import java.util.Properties;
import java.util.Set;

public class TestLD {
 
 public static void main(String[] args) {
  System.out.println(System.getProperty(“java.library.path”));
  Properties props = System.getProperties();
  Set<Object> keys = props.keySet();
  for (Object key : keys) {
   if (((String) key).equals(“java.library.path”))
    System.out.println(System.getProperty(“java.library.path”));
   if (((String) key).equals(“.”))
    System.out.println(System.getProperty(“.”));

  }
  try {
   //loading gplcompression…
   System.loadLibrary(“gplcompression”);
   System.out.println(“Load gplcompression success”);
   
   System.mapLibraryName(“lzohadoop”);
  } catch (Throwable t) {
   System.out.println(“Error”);
   t.printStackTrace();
  }
  System.out.println(System.mapLibraryName(“gplcompression”));
 }
}

可以在 debug 的时候动态修改 java.library.path 的值来测试路径可用性。

相关阅读

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm

更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计4113字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中