Map 阶段
案例实操:
(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;
表的创建以及导入数据
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;
开启 Reduce 输出阶段压缩
案例实操:
(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;
Hive 支持的存储数据的格式主要有:TEXTFILE 、SEQUENCEFILE 、ORC 、PARQUET。
TEXTFILE 和 SEQUENCEFILE 的存储格式都是基于行存储的;
ORC 和 PARQUET 是基于列式存储的。
TextFile 格式
默认格式, 数据不做压缩,磁盘开销大, 数据解析开销大。可结合Gzip 、Bzip2 使用, 但使用 Gzip 这种方式, hive 不会对数据进行切分,从而无法对数据进行并行操作。
Orc 格式
每个 Orc 文件由 1 个或多个 Stripe 组成, 每个 Stripe 一般为 HDFS 的块大小,每一个 Stripe 包含多条记录, 这些记录按照列进行独立存储。
每个 Orc 文件由 1 个或多个 Stripe 组成, 每个 stripe 一般为 HDFS 的块大小,每一个 Stripe 包含多条记录, 这些记录按照列进行独立存储。
Parquet 格式
Parquet 文件是以二进制方式存储的, 所以是不可以直接读取的,文件中包括该文件的 数据和元数据, 因此 Parquet格式文件是自解析的。
上图展示了一个 Parquet 文件的内容, 一个文件中可以存储多个行组,文件的首位都是该文件的 Magic Code,用于校验它是否是一个 Parquet 文件.。
Footer length 记录了文件元数据的大小,通过该值和文件长度可以计算出元数据的偏移量,文件的元数据中包括每一个行 组的元数据信息和该文件存储数据的 Schema 信息。
除了文件中每一个行组的元数据,每一 页的开始都会存储该页的元数据,在 Parquet 中,有三种类型的页: 数据页、字典页和索引 页。
数据页用于存储当前行组中该列的值,字典页存储该列值的编码字典, 每一个列块中最 多包含一个字典页, 索引页用来存储当前行组下该列的索引, 目前 Parquet 中还不支持索引页。
存储数据格式为 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;
存储数据格式为 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/ ;
存储数据格式为 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/ ;
存储文件的对比总结:
ORC > Parquet > textFile
查询速度三者相近
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/ ;
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/ ;
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