概述
9.1.1MR 支持的压缩编码
为了支持多种压缩/解压缩算法,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
开启 Map 输出阶段压缩(MR 引擎):
开启map输出阶段压缩会减少job中的 map和reduce 阶段之间的数据传输量
(1)开启 hive 中间传输数据压缩功能
hive (default)>set hive.exec.compress.intermediate=true;
(2)开启 mapreduce 中 map 输出压缩功能
hive (default)>set mapreduce.map.output.compress=true;
(3)设置 mapreduce 中 map 输出数据的压缩方式
hive (default)>set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
开启 Reduce 输出阶段压缩
(1)开启 hive 最终输出数据压缩功能
set hive.exec.compress.output=true;
(2)开启 mapreduce 最终输出数据压缩
set mapreduce.output.fileoutputformat.compress=true;
(3)设置 mapreduce 最终数据输出压缩方式
set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
(4)设置 mapreduce 最终数据输出压缩为块压缩
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
存储的结构
先来看一下行式存储和列式存储
行式存储:
当查询的数据为满足条件的一行数据或者多个字段时,因为行式存储字段数据都是相邻的,查询速度会比较快
列式存储:
当我们查询少数字段时,能够减少大量的读取量;
每一列的数据类型等格式都是相同的,利于压缩等算法的计算
注意 : 常用的4种存储格式
TEXTFILE 和 SEQUENCEFILE 的存储格式都是基于行存储的;
ORC 和PARQUET 是基于列式存储的。
TextFile 格式
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合 Gzip、Bzip2 使用, 但使用 Gzip 这种方式,hive 不会对数据进行切分,从而无法对数据进行并行操作。
Orc 格式
Orc (Optimized Row Columnar)是 Hive 0.11 版里引入的新的存储格式。
如下图所示可以看到每个 Orc 文件由 1 个或多个 stripe 组成,每个 stripe 一般为 HDFS的块大小,每一个 stripe 包含多条记录,这些记录按照列进行独立存储,对应到Parquet中的row group 的概念。每个 Stripe 里有三部分组成,分别是 Index Data,Row Data,Stripe Footer:
1)Index Data:一个轻量级的 index,默认是每隔 1W 行做一个索引。这里做的索引应 该只是记录某行的各字段在Row Data 中的 offset。
2)Row Data:存的是具体的数据,先取部分行,然后对这些行按列进行存储。对每个列进行了编码,分成多个Stream 来存储。
3)Stripe Footer:存的是各个 Stream 的类型,长度等信息。
每个文件有一个 File Footer,这里面存的是每个 Stripe 的行数,每个 Column 的数据类型信息等;每个文件的尾部是一个 PostScript,这里面记录了整个文件的压缩类型以及FileFooter 的长度信息等。在读取文件时,会 seek 到文件尾部读 PostScript,从里面解析到File Footer 长度,再读 FileFooter,从里面解析到各个 Stripe 信息,再读各个 Stripe,即从后往前读。
Parquet 格式
(1)行组(Row Group):每一个行组包含一定的行数,在一个 HDFS 文件中至少存储一个行组,类似于 orc 的 stripe 的概念。
(2)列块(Column Chunk):在一个行组中每一列保存在一个列块中,行组中的所有列 连续的存储在这个行组文件中。一个列块中的值都是相同类型的,不同的列块可能使用不同的算法进行压缩。
(3)页(Page):每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列 块的不同页可能使用不同的编码方式。
创建一个orc 压缩存储的方式 :修改参数:orc.compress
stored as orc tblproperties=(“orc.compress”=“NONE”) #不使用压缩的方式
stored as orc tblproperties=(“orc.compress”=“ZLIB”) #默认就是使用ZLIB压缩的方式
stored as orc tblproperties=(“orc.compress”=“SNAPPY”) #使用SNAPPY 压缩
parquet 压缩存储的创建 修改参数:parquet.compression
stored as parquet tblproperties(“parquet.compression”=“SNAPPY”); # 默认是不压缩的
最后
以上就是鳗鱼鱼为你收集整理的压缩与存储的全部内容,希望文章能够帮你解决压缩与存储所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复