文章目录

  • 1. 压缩配置
  • 1.1 Hadoop的压缩编码方式
  • 1.2 Map阶段压缩配置
  • 1.3 Reduce 阶段压缩配置
  • 2 文件存储
  • 2.1 行式存储和列式存储
  • 2.2 存储格式说明
  • 2.3 存储+压缩测试
  • 2.3.1 存储测试
  • 2.3.2 存储+压缩的测试方式


1. 压缩配置

1.1 Hadoop的压缩编码方式

压缩格式:

hive设置orc zlib压缩 hive建表指定压缩格式_hive


压缩性能的比较:

hive设置orc zlib压缩 hive建表指定压缩格式_hadoop_02

1.2 Map阶段压缩配置

Map 阶段

  • 开启 map 输出阶段压缩可以减少 job 中 map 和 Reduce task 间数据传输量。

案例实操:
(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;

数据准备:

hive设置orc zlib压缩 hive建表指定压缩格式_大数据_03

表的创建以及导入数据

create table if not exists emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
        
load data local inpath '/opt/module/datas/emp.txt'
into table emp;

(4) 执行查询语句

hive (default)> select count(ename) name from emp;

1.3 Reduce 阶段压缩配置

开启 Reduce 输出阶段压缩

  • Reducer输出阶段压缩
  • 当 Hive 将输出写入表中时,输出内容同样可以进行压缩。属性hive.exec.compress.output 控制着这个功能。
  • 用户可能需要保持默认设置文件中的默认值false, 这样默认的输出就是非压缩的纯文本文件
  • 用户可以通过在查询语句或执行脚本中设置这 个值为 true ,来开启输出结果压缩功能。

案例实操
(1) 开启 hive 最终输出数据压缩功能

hive (default)>set hive.exec.compress.output=true;

(2) 开启 mapreduce 最终输出数据压缩

hive (default)>set mapreduce.output.fileoutputformat.compress=true;

(3) 设置 mapreduce 最终数据输出压缩方式

hive (default)> set mapreduce.output.fileoutputformat.compress.codec =    
org.apache.hadoop.io.compress.SnappyCodec;

(4) 设置 mapreduce 最终数据输出压缩为块压缩

hive (default)> set                                                       
mapreduce.output.fileoutputformat.compress.type=BLOCK;

(5) 测试一下输出结果是否是压缩文件

hive (default)> insert overwrite local directory                          	
'/opt/module/data/distribute-result' 
select * 
from emp 
distribute by deptno 
sort by empno desc;

2 文件存储

Hive 支持的存储数据的格式主要有:TEXTFILE 、SEQUENCEFILE 、ORC 、PARQUET。

2.1 行式存储和列式存储

  • 行式存储
  • 将一行所有数据存储完之后,再存下一行
  • 特点:查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列 的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度 更快。
  • 列式存储
  • 将一个字段所有值全部存完之后,往下存储下一个字段的值
  • 特点:因为每个字段的数据聚集存储, 在查询只需要少数几个字段的时候,能大大减少读取的 数据量;
  • 每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算 法。

hive设置orc zlib压缩 hive建表指定压缩格式_hive设置orc zlib压缩_04

TEXTFILE 和 SEQUENCEFILE 的存储格式都是基于行存储的;
ORC 和 PARQUET 是基于列式存储的。

2.2 存储格式说明

TextFile 格式

    默认格式, 数据不做压缩,磁盘开销大, 数据解析开销大。可结合Gzip 、Bzip2 使用, 但使用 Gzip 这种方式, hive 不会对数据进行切分,从而无法对数据进行并行操作。


Orc 格式

    每个 Orc 文件由 1 个或多个 Stripe 组成, 每个 Stripe 一般为 HDFS 的块大小,每一个 Stripe 包含多条记录, 这些记录按照列进行独立存储。
    每个 Orc 文件由 1 个或多个 Stripe 组成, 每个 stripe 一般为 HDFS 的块大小,每一个 Stripe 包含多条记录, 这些记录按照列进行独立存储。

hive设置orc zlib压缩 hive建表指定压缩格式_hive_05

hive设置orc zlib压缩 hive建表指定压缩格式_hive_06

  • 每个文件有一个 File Footer,这里面存的是每个 Stripe 的行数,每个 Column 的数据类型信息等;
  • 每个文件的尾部是一个 Post Script,这里面记录了整个文件的压缩类型以及 File Footer 的长度信息等。
  • 在读取文件时,会 seek 到文件尾部读 Post Script,从里面解析到 File Footer 长度, 再读 File Footer,从里面解析到各个 Stripe 信息,再读各个 Stripe,即从后 往前读。

Parquet 格式

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

hive设置orc zlib压缩 hive建表指定压缩格式_hive_07

hive设置orc zlib压缩 hive建表指定压缩格式_大数据_08

    上图展示了一个 Parquet 文件的内容, 一个文件中可以存储多个行组,文件的首位都是该文件的 Magic Code,用于校验它是否是一个 Parquet 文件.。

    Footer length 记录了文件元数据的大小,通过该值和文件长度可以计算出元数据的偏移量,文件的元数据中包括每一个行 组的元数据信息和该文件存储数据的 Schema 信息。

    除了文件中每一个行组的元数据,每一 页的开始都会存储该页的元数据,在 Parquet 中,有三种类型的页: 数据页、字典页和索引 页。

    数据页用于存储当前行组中该列的值,字典页存储该列值的编码字典, 每一个列块中最 多包含一个字典页, 索引页用来存储当前行组下该列的索引, 目前 Parquet 中还不支持索引页。

2.3 存储+压缩测试

2.3.1 存储测试


存储数据格式为 TEXTFILE

create table log_text (                                                  
track_time string,                                                       
url string,                                                               
session_id string,                                                       
referer string,                                                           
ip string,                                                                
end_user_id string,                                                       
city_id string                                                            	
)                                                                         
row format delimited fields terminated by '\t'                           
stored as textfile;  

load data local inpath '/opt/module/hive/datas/log.data'  
into table log_text ;

查看文件大小

dfs -du -h /user/hive/warehouse/log_text;

hive设置orc zlib压缩 hive建表指定压缩格式_mapreduce_09


存储数据格式为 ORC

create table log_orc (                                                  
track_time string,                                                       
url string,                                                               
session_id string,                                                       
referer string,                                                           
ip string,                                                                
end_user_id string,                                                       
city_id string                                                            	
)                                                                         
row format delimited fields terminated by '\t'                           
stored as orc
tblproperties("orc.compress"="NONE"); -- 设置 orc 存储不使用压缩

load data local inpath '/opt/module/hive/datas/log.data'  
into table log_orc;

查看文件大小

dfs -du -h /user/hive/warehouse/log_orc/ ;

hive设置orc zlib压缩 hive建表指定压缩格式_hive_10


存储数据格式为 Parquet

create table log_parquet (                                                  
track_time string,                                                       
url string,                                                               
session_id string,                                                       
referer string,                                                           
ip string,                                                                
end_user_id string,                                                       
city_id string                                                            	
)                                                                         
row format delimited fields terminated by '\t'                           
stored as parquet;

load data local inpath '/opt/module/hive/datas/log.data'  
into table log_parquet;

查看文件大小

dfs -du -h /user/hive/warehouse/log_parquet/ ;

hive设置orc zlib压缩 hive建表指定压缩格式_大数据_11

存储文件的对比总结:
ORC > Parquet > textFile

查询速度三者相近


2.3.2 存储+压缩的测试方式

ORC存储加ZLIB压缩

--创建表
create table log_orc_zlib(
track_time string, 
url string,
session_id string,
referer string,
 ip string,
end_user_id string,
city_id string)
row format delimited fields terminated by '\t' 
stored as orc
tblproperties("orc.compress"="ZLIB");

--加载从log_text获取的数据
insert into log_orc_zlib select * from log_text;
--查询文件大小
dfs -du -h /user/hive/warehouse/log_orc_zlib/ ;

hive设置orc zlib压缩 hive建表指定压缩格式_hive设置orc zlib压缩_12

ORC存储+snappy压缩方式

create table log_orc_snappy(
track_time string, 
url string,
session_id string,
referer string,
 ip string,
end_user_id string,
city_id string)
row format delimited fields terminated by '\t' 
stored as orc
tblproperties("orc.compress"="SNAPPY");

insert into log_orc_snappy select * from log_text;

dfs -du -h /user/hive/warehouse/log_orc_snappy/ ;

hive设置orc zlib压缩 hive建表指定压缩格式_hive设置orc zlib压缩_13


parquet存储+snappy压缩存储

create table log_parquet_snappy(
track_time string, 
url string,
session_id string,
referer string,
 ip string,
end_user_id string,
city_id string)
row format delimited fields terminated by '\t' 
stored as parquet
tblproperties("orc.compress"="SNAPPY");

insert into log_parquet_snappy select * from log_text;

dfs -du -h /user/hive/warehouse/log_parquet_snappy/ ;

查询结果:

6.39 MB    /user/hive/warehouse/ log_parquet_snappy /000000_0