大数据之数据的压缩与存储

本文介绍了大数据场景下,Hive的压缩方式如Deflate、Snappy等的优缺点及在ODS、DW、DA层的选择。同时探讨了Hive的数据存储格式,包括行存储与列存储的特点,强调列式存储在分析场景下的优势,如降低IO开销和提高压缩比。
摘要由CSDN通过智能技术生成


前言

由于大数据需要存储的数据较多,如果直接存储原始数据,将会占用较多的硬盘空间,于是就诞生了存储方式和压缩方式,以一定的算法降低数据占用的空间,并且保证数据不丢失,从而提高空间的利用率。

一、Hive的压缩方式

(一) 概念

(1)Hive底层为MapReduce,所以Hive的压缩实际就是MapReduce的压缩
(2)MapRedece的压缩分为Map端结果文件压缩和Reduce端结果文件压缩

(二) 简介

压缩方式常用的有Deflate,Snappy,ZLib,Gzip和Bzip2,不同的压缩方式效率不同;
(1) 从压缩比来说,Bzip2 > ZLib > Gzip > deflate > Snappy,除了Snappy之外的压缩方式可以保证最小的压缩,但是在运算过程中时间消耗较大;
(2)从压缩性能上来说, Snappy > Deflate > Gzip > Bzip2,其中,Snappy压缩和解压缩速度快,压缩比低。
所以一般在生产环境中,经常会采用snappy压缩,以保证运算效率
在这里插入图片描述

(三) 数据分层的压缩方式选择

根据每个数据分层的作用,选择不同的压缩方式,从而提高执行的效率;
(1)ODS层适合Zlib,Gz和Bzip2的压缩方式,该层需要存储较多的数据,所以选择压缩比较高的压缩方式,可以节省空间,从而存储更多的数据
(2)DW层和DA层适合Snappy压缩方式,这两层数据的查询较为频繁,数据存储量不大,所以适合压缩和解压缩效率较高的Snappy压缩方式
在这里插入图片描述

(四)开启Map输出阶段压缩

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

实操:

1)开启hive中间传输数据压缩功能
set hive.exec.compress.intermediate=true;

2)开启mapreduce中map输出压缩功能
set mapreduce.map.output.compress=true;

3)设置mapreduce中map输出数据的压缩方式
set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;

4)执行查询语句
select count(1) from score;

(五)开启Reduce输出阶段压缩

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

实操:

-- 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;
-- 5)测试一下输出结果是否是压缩文件
insert overwrite local directory '/export/data/compress' 
          select * from score distribute by sid sort by sscore desc;

二、 Hive的数据存储格式

Hive支持的存储方式主要有列式存储和行式存储,其中行式存储有TEXTFILE和SEQUENCEFILE,列式存储有ORC和PARQUET,不同需求下使用不同的存储方式可以提高数据查询效率。

(一)行存储的特点

查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。

(二)列存储的特点

因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法
在这里插入图片描述

(三)列式存储的特性

相比于行式存储,列式存储在分析场景下有着许多优良的特性:
1)分析场景中往往需要读大量行但是少数几个列。在行存模式下,数据按行连续存储,所有列的数据都存储在一个block中,不参与计算的列在IO时也要全部读出,读取操作被严重放大。而列存模式下,只需要读取参与计算的列即可,极大的减低了IO开销,加速了查询。
2)同一列中的数据属于同一类型,压缩效果显著。列存储往往有着高达十倍甚至更高的压缩比,节省了大量的存储空间,降低了存储成本。
3)更高的压缩比意味着更小的数据空间,从磁盘中读取相应数据耗时更短。
4)自由的压缩算法选择。不同列的数据具有不同的数据类型,适用的压缩算法也就不尽相同。可以针对不同列类型,选择最合适的压缩算法。


总结

压缩方式结合数据存储格式可以更好的提高数据查询效率,以及降低数据的空间占用率,相同的磁盘空间存储更多的数据,从而提高磁盘空间的利用率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲键盘的杰克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值