Hadoop lzo 正确安装及问题解决

之前有篇文章 http://www.linuxidc.com/Linux/2012-08/67021.htm 介绍解Hadoop-lzo相关问题,同时也介绍到了如何安装.但发现这种安装方法会出现一些问题.

同时这种安装方法也是网上流传的安装方法,我这里予以纠正.先说下大概原因:hadoop-lzo-xxx的前身是hadoop-gpl-compression-xxx,之前是放在google code下管理,地址:http://code.google.com/p/hadoop-gpl-compression/ .但由于协议问题后来移植到github上,也就是现在的hadoop-lzo-xxx,github,链接地址:https://github.com/kevinweil/hadoop-lzo.网上介绍hadoop lzo压缩都是基于hadoop-gpl-compression的介绍.而hadoop-gpl-compression还是09年开发的,跟现在hadoop版本已经无法再完全兼容,会发生一些问题.而按照网上的方法,为了兼容hadoop,使用hadoop-lzo-xxx,但安装hadoop-gpl-compression会报错.具体报错如下:

  1. 11/12/02 14:28:41 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library   
  2. 11/12/02 14:28:41 WARN lzo.LzoCompressor: java.lang.NoSuchFieldError: workingMemoryBuf   
  3. 11/12/02 14:28:41 ERROR lzo.LzoCodec: Failed to load/initialize native-lzo library   
  4. 11/12/02 14:28:41 WARN mapred.LocalJobRunner: job_local_0001   
  5. java.lang.RuntimeException: native-lzo library not available   
  6.     at com.hadoop.compression.lzo.LzoCodec.createCompressor(LzoCodec.java:165)   
  7.     at com.hadoop.compression.lzo.LzopCodec.createOutputStream(LzopCodec.java:50)   
  8.     at org.apache.hadoop.mapreduce.lib.output.TextOutputFormat.getRecordWriter(TextOutputFormat.java:132)   
  9.     at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.<init>(MapTask.java:520)   
  10.     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:635)   
  11.     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:322)   
  12.     at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:210)

我调试源码才发现原因,因为hadoop lzo实际上得依赖C/C++开发的lzo去压缩,而他们通过JNI去调用.如果使用hadoop-gpl-compression下的Native,但使用hadoop-lzo-xxx的话,会导致版本不一致问题.所以正确的做法是,将hadoop-lzo-xxx下的Native放入到/usr/local/lib下.而你每升级一个hadoop-lzo-xxx版本,或许就得重复将新lzo版本下的native目录放入/usr/local/lib下.具体需要测试.

同时这里说下,hadoop-lzo-xxx的验证原理,让我们更系统的了解为什么使用hadoop-lzo会报的一系列错误.

1)首先Hadoop-lzo会通过JNI调用gplcompression,如果调取不到会报Could not load native gpl library异常.具体代码如下:

  1. static {
  2.    try {   
  3.       //try to load the lib   
  4.       System.loadLibrary("gplcompression");   
  5.       nativeLibraryLoaded = true;   
  6.       LOG.info("Loaded native gpl library");   
  7.     } catch (Throwable t) {   
  8.       LOG.error("Could not load native gpl library", t);   
  9.       nativeLibraryLoaded = false;   
  10.     }   
  11. }

2)获取了gplcompression后需要初始化加载以便可以调用,如果加载不成功,如我刚才说的版本冲突等也会报一系列错误.

同时这里的加载和初始化分成两步,一步是压缩,对应Java的类是LzoCompressor.另一步解压缩,对应Java的类是LzoDecompressor.先看下LzoCompressor是如何加载初始化的,代码如下:

  1. static {   
  2.   if (GPLNativeCodeLoader.isNativeCodeLoaded()) {   
  3.     // Initialize the native library   
  4.     try {   
  5.       initIDs();   
  6.       nativeLzoLoaded = true;   
  7.     } catch (Throwable t) {   
  8.       // Ignore failure to load/initialize native-lzo   
  9.       LOG.warn(t.toString());   
  10.       nativeLzoLoaded = false;   
  11.     }   
  12.     LZO_LIBRARY_VERSION = (nativeLzoLoaded) ? 0xFFFF & getLzoLibraryVersion()   
  13.         : -1;   
  14.   } else {   
  15.     LOG.error("Cannot load " + LzoCompressor.class.getName() +    
  16.     " without native-hadoop library!");   
  17.     nativeLzoLoaded = false;   
  18.     LZO_LIBRARY_VERSION = -1;   
  19.   }   
  20. }

如我这里所报的警告WARN lzo.LzoCompressor: java.lang.NoSuchFieldError: workingMemoryBuf

就是由这里的LOG.warn(t.toString());所抛出.同时这里也会先加载gplcompression,加载不成功同样会报without native-hadoop library!错误.

再看看解压缩LzoDecompressor,原理差不多,不再阐述,代码如下:

  1. static {   
  2.   if (GPLNativeCodeLoader.isNativeCodeLoaded()) {   
  3.     // Initialize the native library   
  4.     try {   
  5.       initIDs();   
  6.       nativeLzoLoaded = true;   
  7.     } catch (Throwable t) {   
  8.       // Ignore failure to load/initialize native-lzo   
  9.       LOG.warn(t.toString());   
  10.       nativeLzoLoaded = false;   
  11.     }   
  12.     LZO_LIBRARY_VERSION = (nativeLzoLoaded) ? 0xFFFF & getLzoLibraryVersion()   
  13.         : -1;   
  14.   } else {   
  15.     LOG.error("Cannot load " + LzoDecompressor.class.getName() +    
  16.     " without native-hadoop library!");   
  17.     nativeLzoLoaded = false;   
  18.     LZO_LIBRARY_VERSION = -1;   
  19.   }   
  20. }

以上基本包含了hadoop-lzo安装使用所遇到的问题.最后回到本文的主题,正确安装hadoop-lzo.

1)首先下载https://github.com/kevinweil/hadoop-lzo/,我这里下载到/home/guoyun/Downloads//home/guoyun/hadoop/kevinweil-hadoop-lzo-2dd49ec

2)通过ant生成native和jar,命令如下:

ant tar

在build目录下生成对应的tar包,解压缩后,进入该目录可以看到对应的jar包hadoop-lzo-0.4.14.jar.同时将lib/native/Linux-amd64-64/目录下所有文件拷贝到$HADOOP_HOME/lib和/usr/local/lib两个目录下.

注明:拷贝到/usr/local/lib是便于调试,如是生产环境则无需拷贝.

2019-03-28 13:31

知识点

相关教程

更多

Hadoop LZO 安装教程

1.安装 Hadoop-gpl-compression 1.1 wget http://hadoop-gpl-compression.apache-extras.org.codespot.com/files/hadoop-gpl-compression-0.1.0-rc0.tar.gz 1.2 mv hadoop-gpl-compression-0.1.0/lib/native/Linux-amd

Hadoop集群上使用Lzo压缩

自从Hadoop集群搭建以来,我们一直使用的是Gzip进行压缩 当时,我对gzip压缩过的文件和原始的log文件分别跑MapReduce测试,最终执行速度基本差不多 而且Hadoop原生支持Gzip解压,所以,当时就直接采用了Gzip压缩的方式 Lzo压缩相比Gzip压缩,有如下特点:      压缩解压的速度很快  Lzo压缩是基于Block分块的,这样,一个大的文件(在Hadoop上可能会占用

Hadoop集群lzo的安装

主要步骤: 1,安装和更新gcc、ant(系统已经安装的话,略去下面步骤) yum -y install gcc gcc-c++ autoconf automake wget http://labs.renren.com/apache-mirror//ant/binaries/apache-ant-1.8.2-bin.tar.gz tar -jxvf apache-ant-1.8.2-bin.ta

使用Hadoop的lzo问题

使用lzo压缩替换Hadoop原始的Gzip压缩。相比之下有如下特点: 我们这使用的是hadoop客户端。 1.压缩解压的速度很快 2.lzo压缩是基于block分块的。这样,一个大文件(在hadoop上可能会占用多个block),就可以有多个 MapReduce并行来进行处理。 虽然Lzo的压缩比没有Gzip高,不过由于其前2个特性,在Hadoop上使用Lzo还是能整体提升集群的性能的。能提高效

Hadoop集群内lzo的安装与配置

最近我们部门在测试云计算平台Hadoop,我被lzo折腾了三四天,累了个够呛。在此总结一下,也给大家做个参考。         操作系统:CentOS 5.5,Hadoop版本:hadoop-0.20.2-CDH3B4         安装lzo所需要软件包:gcc、ant、lzo、lzo编码/解码器,另外,还需要lzo-devel依赖         配置lzo的文件:core-site.xml

ProtocolBuffer 结合 LZO在 Hadoop中的使用

1.ProtocolBuffer    首先介绍一下ProtocolBuffer吧,可以参考:Protocol Buffer官网 Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and s

Hadoop集群内lzo的安装与配置详解

操作系统:CentOS 5.5,Hadoop版本:hadoop-0.20.2-CDH3B4         安装lzo所需要软件包:gcc、ant、lzo、lzo编码/解码器,另外,还需要lzo-devel依赖         配置lzo的文件:core-site.xml、mapred-site.xml                 大致步骤:          1)安装和更新gcc、ant

使Hadoop支持Splittable压缩lzo

在Hadoop中使用lzo的压缩算法可以减小数据 的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理。这样的特点,就可以让lzo在hadoop上成为一种非常好用的压缩格式。 lzo本身不是splitable的,所以当数据为text格式时,用lzo压缩出来的数据当做job的输入是一个文件作为一个map。但是sequence

Hadoop中使用lzo压缩格式支持笔记

通常Hadoop中的mapreduce作业都会产生大量都中间文件 ,当要处理当原始数据 非常大,并且在一定大map处理逻辑的情况下,这些中间文件会非常的大,hadoop mapreduce的中间文件是通过slave上hadoop-site.xml配置文件中的mapred.local.dir 配置选项来指定的。 <property> <name>mapred.local.di

Hadoop无法处理中文问题解决方案

由于Hadoop默认编码为UTF-8,并且将UTF-8进行了硬编码,所以我们在处理中文时需要重写OutputFormat类。方法为: 1、新建类GBKFileOutputFormat,代码如下: import java.io.DataOutputStream;  import java.io.IOException;  import java.io.UnsupportedEncodingExcep

Hadoop lzo文件的并行map处理

Hadoop集群中启用了lzo后,还需要一些配置,才能使集群能够对单个的lzo文件进行并行的map操作,以提升job的执行速度。 首先,要为lzo文件创建index。下面的命令对某个目录里的lzo文件创建index: $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.10.jar com.hadoop.compression.l

Hadoop集群lzo文件的并行map处理

Hadoop集群中启用了lzo后,还需要一些配置,才能使集群能够对单个的lzo文件进行并行的map操作,以提升job的执行速度。        首先,要为lzo文件创建index。下面的命令对某个目录里的lzo文件创建index:                            $HADOOP_HOME/bin/hadoopjar $HADOOP_HOME/lib/hadoop-lzo-0.

查看Hadoop里的LZO文件的内容

最近常常需要查看LZO文件里面的内容,这些文件通常很大,放在hdfs上。我没有好的方法,我以前偶尔查看其中内容都是直接get到本地然后用lzop解压缩然后再more的。这样做当你偶尔使用的时候即使文件稍微大点,也许也是可以接受的。但现在我需要常常grep里面的内容,就不那么欢乐了。 所以写了个shell脚本lzoc[ lzo cat],用来专门查看HDFS里LZO文件的内容,正常情况下它不输出任何

Hadoop NameNode单点问题解决方案之一 AvatarNode

翻译自Facebook Hadoop架构师(Dhruba Borthakur)的一篇文章  我们遇到的情况  Hadoop NameNode存在单点问题。这个问题会影响分布式平台24*7运行。先说说我们的情况吧。  我们的团队负责管理一个1200节点的集群(总大小12PB),目前是运行版本为Hadoop 0.20,transaction logs写入一个共享的NFS filer(注:NetApp

ProtocolBuffer和LZO技术Hadoop系统上的使用

概述 基于Hadoop的集群分布式数据处理目前是淘宝搜索中心最重要的数据处理平台,在集群物理条件确定的情况下,有几个方面影响了数据处理的速度。 1、数据大小 (影响磁盘IO和网络IO) 2、数据格式 (影响数据的解析及构造速度) 3、并行度 使用 protocolBuffer + lzo技术,能帮我们做到数据小解析快并行度高这三点, 能帮我们大幅度提高处理的速度。下面详细介绍一下如何编译部署及开发

最新教程

更多

java线程状态详解(6种)

java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

redis从库只读设置-redis集群管理

默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

电商平台数据库设计

电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

HttpClient 上传文件

我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

MongoDB常用命令

查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

快速了解MongoDB【基本概念与体系结构】

什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

windows系统安装MongoDB

安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

Spring boot整合MyBatis-Plus 之二:增删改查

基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baom

分布式ID生成器【snowflake雪花算法】

基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案