文章目录
- 1. 压缩
- 1.1 Hodoop压缩
- 1.2 Map输出阶段压缩
- 1.3 Reduce输出阶段压缩
- 2. 存储
- 2.1 文件存储格式
- 2.2 主流文件存储格式对比
- 3. 压缩和存储结合
1. 压缩
1.1 Hodoop压缩
详见 Hadoop(十二)—— Hadoop压缩
1.2 Map输出阶段压缩
开启map输出阶段压缩,可以减少job中map和Reduce task间数据传输量。具体配置如下:
- 开启hive中间传输数据压缩功能,默认为false
hive (default)>set hive.exec.compress.intermediate=true; - 开启MapReduce中map输出压缩功能,默认为false
hive (default)>set mapreduce.map.output.compress=true; - 设置MapReduce中map输出数据的压缩方式
hive (default)>set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec; - 执行查询语句
hive (default)> select count(ename) name from emp;
1.3 Reduce输出阶段压缩
当Hive将输出写入到表中时,输出内容同样可以进行压缩。
- hive (default)> set mapreduce.job.reduces=3;
- 开启hive最终输出数据压缩功能,默认为false
hive (default)>set hive.exec.compress.output=true; - 开启mapreduce最终输出数据压缩,默认为false(输出是非压缩的纯文本文件了)
hive (default)>set mapreduce.output.fileoutputformat.compress=true; - 设置mapreduce最终数据输出压缩方式
hive (default)> set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec; - 设置mapreduce最终数据输出压缩为块压缩
hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK; - 测试一下输出结果是否是压缩文件
hive (default)> insert overwrite local directory ‘/opt/module/datas/distribute-result’ select * from emp distribute by deptno sort by empno desc; - 测试:不设置reduce,结果是否是压缩格式
hive (default)> set mapreduce.job.reduces=-1;
hive (default)> insert overwrite local directory ‘/opt/module/datas/distribute-result’ select * from test;
2. 存储
2.1 文件存储格式
Hive支持的存储数的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET。
行储存:textFile 、 sequencefile 、
列储存:orc 、parquet
行存储的特点: 查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。
列存储的特点: 因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。
textfile:默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用,但使用Gzip这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。
2.2 主流文件存储格式对比
- 压缩比对比
-- 创建表
hive(default)> create table log_text (
id BIGINT,
track_time string,
session_id string,
key_word string,
Number_of_visits int,
Amount_of_Downloads int,
url string
)
row format delimited fields terminated by '\t'
stored as textfile[orc | parquet] ;
-- 加载数据
hive(default)> load data local inpath '/opt/module/datas/log.data' into table log_text ;
-- 查看大小
hive(default)> dfs -du -h /user/hive/warehouse/log_text;
- 存储文件的压缩比总结:
测试数据18.1M
ORC(2.8 M) > Parquet(13.1 M) > textFile(18.1 M) - 查询速度对比
hive(default)> select count(*) from log_text;
3. 压缩和存储结合
-- 创建一个非压缩的、ORC存储方式的表
hive(default)> create table log_orc_none(
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");
-- 创建一个SNAPPY压缩的、ORC存储方式的表
stored as orc tblproperties ("orc.compress"="SNAPPY");
-- 加载数据
insert into table log_orc_none select * from log_text ;
-- 查看大小
dfs -du -h /user/hive/warehouse/log_orc_none/ ;
orc(默认压缩:ZLIB压缩)2.8M > orc(snappy压缩)3.8M > orc(不压缩)7.7M
存储方式和压缩总结:
- 在实际的项目开发当中,hive表的数据存储格式一般选择:orc或parquet。
- 在实际的项目开发当中,压缩方式一般选择:snappy,lzo。