hadoop中使用lzo的压缩

  在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理。这样的特点,就可以让lzo在hadoop上成为一种非常好用的压缩格式。

  lzo本身不是splitable的,所以当数据为text格式时,用lzo压缩出来的数据当做job的输入是一个文件作为一个map。但是 sequencefile本身是分块的,所以sequencefile格式的文件,再配上lzo的压缩格式,就可实现lzo文件方式的 splitable。

  由于压缩的数据通常只有原始数据的1/4,在HDFS中存储压缩数据,可以使集群能保存更多的数据,延长集群的使用寿命。不仅如此,由于 mapreduce作业通常瓶颈都在IO上,存储压缩数据就意味这更少的IO操作,job运行更加的高效。但是,在hadoop上使用压缩也有两个比较麻烦的地方:第一,有些压缩格式不能被分块,并行的处理,比如gzip。第二,另外的一些压缩格式虽然支持分块处理,但是解压的过程非常的缓慢,使job的瓶颈转移到了cpu上,例如bzip2。比如我们有一个1.1GB的gzip文件,该文件 被分成128MB/chunk存储在hdfs上,那么它就会被分成9块。为了能够在mapreduce中并行的处理各个chunk,那么各个mapper之间就有了依赖。而第二个mapper就会在文件的某个随机的byte出进行处理。那么gzip解压时要用到的上下文字典就会为空,这就意味这gzip的压缩文件无法在hadoop上进行正确的并行处理。也就因此在hadoop上大的gzip压缩文件只能被一个mapper来单个的处理,这样就很不高效,跟不用mapreduce没有什么区别了。而另一种bzip2压缩格式,虽然bzip2的压缩非常的快,并且甚至可以被分块,但是其解压过程非常非常的缓慢,并且不能被用streaming来读取,这样也无法在hadoop中高效的使用这种压缩。即使使用,由于其解压的低效,也会使得job的瓶颈转移到 cpu上去。

  如果能够拥有一种压缩算法,即能够被分块,并行的处理,速度也非常的快,那就非常的理想。这种方式就是lzo。lzo的压缩文件是由许多的小的 blocks组成(约256K),使的hadoop的job可以根据block的划分来splitjob。不仅如此,lzo在设计时就考虑到了效率问题,它的解压速度是gzip的两倍,这就让它能够节省很多的磁盘读写,它的压缩比的不如gzip,大约压缩出来的文件比gzip压缩的大一半,但是这样仍然比没有经过压缩的文件要节省20%-50%的">存储空间,这样就可以在效率上大大的提高job执行的速度。以下是一组压缩对比数据,使用一个8.0GB的未经过压缩的数据来进行对比:

  可以看出,lzo压缩文件会比gzip压缩文件稍微大一些,但是仍然比原始文件要小很多倍,并且lzo文件压缩的速度几乎相当于gzip的5倍,而解压的速度相当于gzip的两倍。lzo文件可以根据blockboundaries来进行分块,比如一个1.1G的lzo压缩文件,那么处理第二个 128MBblock的mapper就必须能够确认下一个block的boundary,以便进行解压操作。lzo并没有写什么数据头来做到这一点,而是实现了一个lzoindex文件,将这个文件(foo.lzo.index)写在每个foo.lzo文件中。这个index文件只是简单的包含了每个 block在数据中的offset,这样由于offset已知的缘故,对数据的读写就变得非常的快。通常能达到90-100MB/秒,也就是10-12秒就能读完一个GB的文件。一旦该index文件被创建,任何基于lzo的压缩文件就能通过load该index文件而进行相应的分块,并且一个block 接一个block的被读取。也因此,各个mapper都能够得到正确的block,这就是说,可以只需要进行一个LzopInputStream的封装,就可以在hadoop的mapreduce中并行高效的使用lzo。如果现在有一个job的InputFormat是TextInputFormat,那么就可以用lzop来压缩文件,确保它正确的创建了index,将TextInputFormat换成LzoTextInputFormat,然后job 就能像以前一样正确的运行,并且更加的快。有时候,一个大的文件被lzo压缩过之后,甚至都不用分块就能被单个mapper高效的处理了。

  在hadoop集群中安装lzo

  要在hadoop中搭建lzo使用环境非常简单:

  安装lzop native libraries

  例如:sudo yum install lzop lzo2

  从如下地址下载 hadooplzo支持到源代码:http://github.com/kevinweil/hadoop-lzo

  编译从以上链接checkout下来到代码,通常为:ant compile-native tar

  将编译出来到hadoop-lzo-*.jar部署到hadoop集群到各个slave到某个有效目录下,如$HADOOOP_HOME/lib

  将以上编译所得到hadoop-lzo native libbinary部署到集群到某个有效目录下,如$HADOOP_HOME/lib/native/Linux-amd64-64。

  将如下配置到 core-site.xml 中:

io.compression.codecsorg.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec

  io.compression.codec.lzo.class

  com.hadoop.compression.lzo.LzoCodec

  将如下配置到mapred-site.xml中:

  mapred.child.env

  JAVA_LIBRARY_PATH=/path/to/your/native/hadoop-lzo/libs

  如果想要mapreduce再写中间结果时也使用压缩,可以将如下配置也写入到mapred-site.xml中。

  mapred.map.output.compression.codec

  com.hadoop.compression.lzo.LzoCodec

  如果以上所有操作都成功,那么现在就可以尝试使用lzo了。比如打包一个lzo都压缩文件,如lzo_log文件,上传到hdfs中,然后用以下命令进行测试:

  hadoop jar /path/to/hadoop-lzo.jarcom.hadoop.compression.lzo.LzoIndexerhdfs://namenode:9000/lzo_logs

  如果要写一个job来使用lzo,可以找一个job,例如wordcount,将当中到TextInputFormat修改为LzoTextInputForma,其他都不用修改,job就能从hdfs上读入lzo压缩文件,进行分布式都分块并行处理。

  实例:

  1.建立flow表:

  use gj;

  create table top_flow

  (

  src_address string,

  dst_address string,

  src_port int,

  dst_port int,

  trans_protocol int,

  packets bigint,

  bytes bigint,

  flags string,

  start_time timestamp,

  duration double,

  end_time timestamp,

  sensor string

  )

  partitioned by (dd int,hh int,protocol int)

  ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';

  --location 'hdfs://Hadoop:8020/user/hive/warehouse/gj.db/top_flow/'

  生成top_flow的分区建立语句:

  hdfs://Hadoop:8020/user/hive/warehouse/gj.d 777

  hdfs://Hadoop:8020/user/hive/warehouse/gj.db/top_flow/dd=20140707/hh=1/protocol=6/ip=192.168.1.1/

  [Hadoop:21000] > desc formatted top_flow;

  hdfs://Hadoop:8020/user/hive/warehouse/gj.db/sim_event/dd=20140707/hh=1/devtype=TopIdp/ip=192.168.1.1/logtype=IPSAV/

  create table sim_event

  (

  EVENT_ID

  )

  ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

  添分区:

  alter table top_flow add partition(dd=20140707,hh=01,protocol=6);

  hdfs dfs -chmod -R a+w hdfs://hadoop:8020/user/hive/warehouse/gj.db/top_flow/dd=20140707/hh=1/protocol=6

  新建结构一样的表:

  create table top_flow1 like top_flow;

  添加分区:

  alter table top_flow1 add partition(dd=20140707,hh=01,protocol=6);

  alter table top_flow1 partition (dd=20140707,hh=1,protocol=6) set fileformat parquet;

  插入数据

  insert into table top_flow1 partition (dd=20140707,hh=1,protocol=6) select src_address,dst_address,src_port,dst_port,trans_protocol,packets,bytes,flags,start_time,duration,end_time,sensor from top_flow where dd=20140707 and hh=01 and protocol=17;

  删除源表的数据

  alter table top_flow drop partition (dd=20140707,hh=1,protocol=6)

  或者传输文件:

  ----重要内容压缩表:

  1.首先在本地(光盘)安装lzo包,然后安装

  yum install hadoop-lzo-cdh4

  --文件需要拷贝到多个系统的native目录下

  yum install impala-lzo

  2.编辑core-site.xml(注意传输文件到指定目录)

  添加:

  io.compression.codecs

  org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,

  org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DeflateCodec,

  org.apache.hadoop.io.compress.SnappyCodec,com.hadoop.compression.lzo.LzopCodec

  拷贝native文件!!!

  cp /usr/lib/hadoop/lib/native ${Hadop_Home}/lib/

  重启mapreduce和impala服务

  CREATE TABLE top_flow1 (

  src_address string,

  dst_address string,

  src_port int,

  dst_port int,

  trans_protocol int,

  packets bigint,

  bytes bigint,

  flags string,

  start_time timestamp,

  duration double,

  end_time timestamp,

  sensor string)

  partitioned by (dd int,hh int,protocol int)

  STORED AS

  INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'

  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';

  insert into table top_flow1 partition (dd=20140707,hh=1,protocol=6) select src_address,dst_address,src_port,dst_port,trans_protocol,packets,bytes,flags,start_time,duration,end_time,sensor from top_flow where dd=20140707 and hh=1 and protocol=6;

  建立索引,文件分块

  hadoop jar /usr/lib/hadoop/lib/hadoop-lzo-cdh4-0.4.15-gplextras.jar com.hadoop.compression.lzo.DistributedLzoIndexer hdfs://hdfs:8020/user/hive/warehouse/gj.db/top_flow1/dd=20140707/hh=1/protocol=6/000000_0.lzo

  [localhost:21000] > invalidate metadata;

  0

时间: 2024-09-17 04:49:48

hadoop中使用lzo的压缩的相关文章

4种常用压缩格式在Hadoop中的应用

目前在Hadoop中用得比较多的有lzo,gzip,snappy,bzip2这4种压缩格式,笔者根据实践经验介绍一下这4种压缩格式的优缺点和应用场景,以便大家在实践中根据实际情况选择不同的压缩格式. 1 gzip压缩 优点:压缩率比较高,而且压缩/解压速度也比较快;hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;有hadoop native库;大部分linux系统都自带gzip命令,使用方便. 缺点:不支持split. 应用场景:当每个文件压缩之后在130M以内的(1个

Hadoop中的压缩(1) 概述与实例

1 概述 文件压缩主要有两个好处,一是减少了存储文件所占空间,另一个就是为数据传输提速.在hadoop大数据的背景下这两点尤为重要.hadoop里支持很多种压缩格式: DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法,源代码可以在zlib库中找到.gzip是以DEFLATE算法为基础扩展出来的一种算法. 压缩算法 原始文件大小 压缩后的文件大小 压缩速度 解压缩速度 gzip 8.3GB 1.8GB 17.5MB/s 58MB/s bzip

hadoop中的序列化与Writable接口

简介 序列化和反序列化就是结构化对象和字节流之间的转换,主要用在内部进程的通讯和持久化存储方面. 通讯格式需求 hadoop在节点间的内部通讯使用的是RPC,RPC协议把消息翻译成二进制字节流发送到远程节点,远程节点再通过反序列化把二进制流转成原始的信息.RPC的序列化需要实现以下几点: 1.压缩,可以起到压缩的效果,占用的宽带资源要小. 2.快速,内部进程为分布式系统构建了高速链路,因此在序列化和反序列化间必须是快速的,不能让传输速度成为瓶颈. 3.可扩展的,新的服务端为新的客户端增加了一个参

Hadoop中使用FileStatus类来查看HDFS中文件或目录的元信息

Hadoop中的FileStatus类可以用来查看HDFS中文件或者目录的元信息,任意的文件或者目录都可以拿到对应的FileStatus, 我们这里简单的演示下这个类的相关API: /* */ package com.charles.hadoop.fs; import java.net.URI; import java.sql.Timestamp; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.F

Oracle中如何预估表压缩的效果

在使用压缩之前,我们可以估算一下使用压缩能够拥有多大的效果. 11gr2以前可以使用dbms_comp_advisor,具体代码已经在附件中给出.只需要执行两个文件dbmscomp.sql和prvtcomp.plb,然后使用DBMS_COMP_ADVISOR.getratio存储过程即可.不再详细描述. SQL> set serveroutput on SQL> execdbms_comp_advisor.getratio('SH','SALES',10) Sampling table: SH

Android中3种图片压缩处理方法

  这篇文章主要介绍了Android中3种图片压缩处理方法,本文讲解了质量压缩方法.获得缩略图.图片缩放三种方法并分别给出示例代码,需要的朋友可以参考下 Android中图片的存在形式: 1:文件形式:二进制形式存在与硬盘中. 2:流的形式:二进制形式存在与内存中. 3:Bitmap的形式 三种形式的区别: 文件形式和流的形式:对图片体积大小并没有影响.也就是说,如果你手机SD卡上的图片通过流的形式读到内存中,在内存中的大小也是原图的大小. 注意:不是Bitmap的形式. Bitmap的形式:图

hadoop中的pi值计算

  注意在hadoop中,操作一定要规范.不规范的操作引起exception满天飞······· 其实hadoop中的pi值运算还是挺简单的.在这里主要讲一下这个例子中要注意的地方: [hadoop@master hadoop-1.0.3]$ hadoop jar hadoop-examples-1.0.3.jar pi 10 100 确保是在hadoop-1.0.3目录下,因为hadoop-examples-1.0.3.jar是在这个目录下的.如果在其他目录下运行,会出错,最后导致datano

在Linux系统中使用tar命令压缩和解压文件的教程

  linux中的tar命令 tar(磁带归档)命令是linux系统中被经常用来将文件存入到一个归档文件中的命令. 其常见的文件扩展包括:.tar.gz 和 .tar.bz2, 分别表示通过了gzip或bzip算法进一步进行了压缩. 在本教程中我们会管中窥豹一下在linux桌面或服务器版本中使用tar命令来处理一些创建和解压归档文件的日常工作的例子. 使用tar命令 tar命令在大部分linux系统默认情况下都是可用的,所以你不用单独安装该软件. tar命令具有两个压缩格式,gzip和bzip,

hadoop中实现定制Writable类

Hadoop中有一套Writable实现可以满足大部分需求,但是在有些情况下,我们需要根据自己的需要构造一个新的实现,有了定制的Writable,我们就可以完全控制二进制表示和排序顺序. 为了演示如何新建一个定制的writable类型,我们需要写一个表示一对字符串的实现: blic class TextPair implements WritableComparable<TextPair> { private Text first; private Text second; public Te