压缩与存储

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:
w

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”); # 默认是不压缩的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值