前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hadoop安装lzo-出现Could not load native gpl library问题解决

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

作者头像
星哥玩云
发布2022-06-30 19:38:09
8150
发布2022-06-30 19:38:09
举报
文章被收录于专栏:开源部署

此篇是接着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的值来测试路径可用性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档