当前位置: 首页>后端>正文

Hive(八)—— 压缩和存储


文章目录

  • 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间数据传输量。具体配置如下:

  1. 开启hive中间传输数据压缩功能,默认为false
    hive (default)>set hive.exec.compress.intermediate=true;
  2. 开启MapReduce中map输出压缩功能,默认为false
    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;
  4. 执行查询语句
    hive (default)> select count(ename) name from emp;

1.3 Reduce输出阶段压缩

当Hive将输出写入到表中时,输出内容同样可以进行压缩。

  1. hive (default)> set mapreduce.job.reduces=3;
  2. 开启hive最终输出数据压缩功能,默认为false
    hive (default)>set hive.exec.compress.output=true;
  3. 开启mapreduce最终输出数据压缩,默认为false(输出是非压缩的纯文本文件了)
    hive (default)>set mapreduce.output.fileoutputformat.compress=true;
  4. 设置mapreduce最终数据输出压缩方式
    hive (default)> set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
  5. 设置mapreduce最终数据输出压缩为块压缩
    hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;
  6. 测试一下输出结果是否是压缩文件
    hive (default)> insert overwrite local directory ‘/opt/module/datas/distribute-result’ select * from emp distribute by deptno sort by empno desc;
  7. 测试:不设置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



https://www.xamrdz.com/backend/3hg1926519.html

相关文章: