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

在安装Hadoop lzo过程中遇到'Could not load native gpl library'异常,主要原因是缺少libhadoop*.so和libgplcompression*.so库,以及未正确设置LD_LIBRARY_PATH。解决方案包括将库文件拷贝到指定目录,并在mapred-site.xml中配置本地库路径,同时理解LD_LIBRARY_PATH环境变量的作用和设置方法。

此篇是接着hadoop安装lzo的续篇,主要讲一下安装过程中出现的问题及解决方案.

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)   

如果是按照上一篇来做的,出现以上异常的原因大多是以下两种情况:

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的值来测试路径可用性。


参考:

http://wiredrevolution.com/system-administration/how-to-correctly-use-ld_library_path


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值