Hadoop下的存储格式LZO


Hadoop下的数据存储格式LZO

0x1 为什么要使用压缩技术?

压缩技术能够有效减少底层存储系统(HDFS)读写字节数. 压缩提高了网络带宽和磁盘空间的效率

MR中的场景 (I/O,网络数据传输,Shuffle,Merge)

用CPU换I/O

0x2 流行压缩技术1-Snappy

高速压缩速度,合理的压缩率

性能最高,但是不支持切片(split)

0x3 流行压缩技术2-Lzo[在这里重点说明]

3.1 概要

Hadoop体系下支持Lzo,需要安装

特点: 压缩/解压速度比较快,支持split

3.2 详解

优点:压缩/解压缩速度也比较快,合理的压缩率,支持split,是Hadoop中比较流行的压缩格式,可以再Linux中安装lzop命令,使用方便

缺点:压缩率比Gzip要低一些,Hadoop本身不支持,需要安装;在应用中对Lzo格式的文件需要做一些特殊处理(为了支持Split需要建立索引,还需要指定InputFormat为Lzo格式.

应用场景:一个很大的文本文件,压缩之后还大于200M以上的可以考虑,而且单个文件越大,lzo优点越明显.

看到这里肯定冒出几个问题

3.2.1 LZO的压缩速度快,快多少呢,如何跟其他的压缩格式相比?

直接上数据

压缩格式 算法 文件扩展名 是否可切分
DEFLATE DEFLATE .deflate
Gzip DEFLATE .gz
bzip2 bzip2 .bz2
==LZO== LZO .lzo
Snappy Snappy .snappy

为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器,如下表所示:

压缩格式 对应的编码/解码器
DEFLATE org.apache.hadoop.io.compress.DefaultCodec
gzip org.apache.hadoop.io.compress.GzipCodec
bzip2 org.apache.hadoop.io.compress.BZip2Codec
LZO com.hadoop.compression.lzo.LzopCodec
Snappy org.apache.hadoop.io.compress.SnappyCodec

压缩性能的比较:

压缩算法 原始文件大小 压缩文件大小 压缩速度 解压速度
gzip 8.3GB 1.8GB 17.5MB/s 58MB/s
bzip2 8.3GB 1.1GB 2.4MB/s 9.5MB/s
LZO 8.3GB 2.9GB 49.3MB/s 74.6MB/s

3.2.2 LZO的比较好用,在大数据体系中哪些地方可以使用,如何使用?

1.Hive建表中可以直接导入HDFS中lzo格式的数据(要想走计算引擎需要增加索引)

2.Flume采集可以直接转换采集格式放入HDFS(hdfs sink)

参数在这里不多赘余,上链接

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LZO#space-menu-link-content

3.2.3 LZO为什么靠什么进行切片,为什么切片后能够被Driver进行Split[精]

0x4 文件存储格式(列存储的两种)

(TEXTFILE 、SEQUENCEFILE、ORC、PARQUET)

行存储跟列存储 Row layout/Column layout

4.1 ORC

Orc (Optimized Row Columnar)是Hive 0.11版里引入的新的存储格式。如下图所示可以看到每个Orc文件由1个或多个stripe组成,每个stripe一般为HDFS的块大小,每一个stripe包含多条记录,这些记录按照列进行独立存储,对应到Parquet中的row group的概念。每个Stripe里有三部分组成,分别是Index Data,Row Data,Stripe Footer

4.2 Parquent

Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。

(1)行组(Row Group):每一个行组包含一定的行数,在一个HDFS文件中至少存储一个行组,类似于orc的stripe的概念。

(2)列块(Column Chunk):在一个行组中每一列保存在一个列块中,行组中的所有列连续的存储在这个行组文件中。一个列块中的值都是相同类型的,不同的列块可能使用不同的算法进行压缩。

(3)页(Page):每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。

通常情况下,在存储Parquet数据的时候会按照Block大小设置行组的大小,由于一般情况下每一个Mapper任务处理数据的最小单位是一个Block,这样可以把每一个行组由一个Mapper任务处理,增大任务执行并行度。Parquet文件的格式。


文章作者: Jinxin Li
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jinxin Li !
  目录