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会报错.具体报错如下:
- 11/12/02 14:28:41 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library
- 11/12/02 14:28:41 WARN lzo.LzoCompressor: java.lang.NoSuchFieldError: workingMemoryBuf
- 11/12/02 14:28:41 ERROR lzo.LzoCodec: Failed to load/initialize native-lzo library
- 11/12/02 14:28:41 WARN mapred.LocalJobRunner: job_local_0001
- java.lang.RuntimeException: native-lzo library not available
- at com.hadoop.compression.lzo.LzoCodec.createCompressor(LzoCodec.java:165)
- at com.hadoop.compression.lzo.LzopCodec.createOutputStream(LzopCodec.java:50)
- at org.apache.hadoop.mapreduce.lib.output.TextOutputFormat.getRecordWriter(TextOutputFormat.java:132)
- at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.<init>(MapTask.java:520)
- at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:635)
- at org.apache.hadoop.mapred.MapTask.run(MapTask.java:322)
- 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异常.具体代码如下:
- static {
- try {
- //try to load the lib
- System.loadLibrary("gplcompression");
- nativeLibraryLoaded = true;
- LOG.info("Loaded native gpl library");
- } catch (Throwable t) {
- LOG.error("Could not load native gpl library", t);
- nativeLibraryLoaded = false;
- }
- }
2)获取了gplcompression后需要初始化加载以便可以调用,如果加载不成功,如我刚才说的版本冲突等也会报一系列错误.
同时这里的加载和初始化分成两步,一步是压缩,对应Java的类是LzoCompressor.另一步解压缩,对应Java的类是LzoDecompressor.先看下LzoCompressor是如何加载初始化的,代码如下:
- static {
- if (GPLNativeCodeLoader.isNativeCodeLoaded()) {
- // Initialize the native library
- try {
- initIDs();
- nativeLzoLoaded = true;
- } catch (Throwable t) {
- // Ignore failure to load/initialize native-lzo
- LOG.warn(t.toString());
- nativeLzoLoaded = false;
- }
- LZO_LIBRARY_VERSION = (nativeLzoLoaded) ? 0xFFFF & getLzoLibraryVersion()
- : -1;
- } else {
- LOG.error("Cannot load " + LzoCompressor.class.getName() +
- " without native-hadoop library!");
- nativeLzoLoaded = false;
- LZO_LIBRARY_VERSION = -1;
- }
- }
如我这里所报的警告WARN lzo.LzoCompressor: java.lang.NoSuchFieldError: workingMemoryBuf
就是由这里的LOG.warn(t.toString());所抛出.同时这里也会先加载gplcompression,加载不成功同样会报without native-hadoop library!错误.
再看看解压缩LzoDecompressor,原理差不多,不再阐述,代码如下:
- static {
- if (GPLNativeCodeLoader.isNativeCodeLoaded()) {
- // Initialize the native library
- try {
- initIDs();
- nativeLzoLoaded = true;
- } catch (Throwable t) {
- // Ignore failure to load/initialize native-lzo
- LOG.warn(t.toString());
- nativeLzoLoaded = false;
- }
- LZO_LIBRARY_VERSION = (nativeLzoLoaded) ? 0xFFFF & getLzoLibraryVersion()
- : -1;
- } else {
- LOG.error("Cannot load " + LzoDecompressor.class.getName() +
- " without native-hadoop library!");
- nativeLzoLoaded = false;
- LZO_LIBRARY_VERSION = -1;
- }
- }
以上基本包含了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是便于调试,如是生产环境则无需拷贝.
知识点
相关教程
更多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实现方案