HADOOP-HIVE4

2021-01-06  本文已影响0人  大空翼123

Hive压缩


开启Map输出阶段压缩

开启map输出阶段压缩可以减少job中map和Reduce task间数据传输量。具体配置如下:

案例实操:

1.开启hive中间传输数据压缩功能

hive (default)>sethive.exec.compress.intermediate=true;

2.开启mapreduce中map输出压缩功能

hive (default)>setmapreduce.map.output.compress=true;

3.设置mapreduce中map输出数据的压缩方式

hive (default)>setmapreduce.map.output.compress.codec=

 org.apache.hadoop.io.compress.SnappyCodec;

4.执行查询语句

   hive (default)>select count(ename) name

from emp;

开启Reduce输出阶段压缩

输出内容同样可以进行压缩

1.开启hive最终输出数据压缩功能

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

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

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

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

hive (default)> setmapreduce.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/datas/distribute-result' select *from emp distribute by deptno sort by empno desc;

文件存储格式

Hive支持的存储数据的格式主要有:TEXTFILE(行) 、SEQUENCEFILE(行)、ORC(列,MR用)、PARQUET(列,spark用)。

列式存储和行式存储

1.行存储的特点

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

2.列存储的特点

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

TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的;

ORC和PARQUET是基于列式存储的。

EG: create table xxxxxxx  stored as orc ;

查看表中数据大小/user/hive/warehouse/log_orc/000000_0

存储文件的压缩比总结:

ORC>  Parquet >  textFile

查询速度相近。

查看hadoop支持的压缩方式 

hadoop checknative  
存储方式和压缩总结

在实际的项目开发当中,hive表的数据存储格式一般选择:orc或parquet。压缩方式一般选择snappy,lzo。

create table XXXXXX stored as orc tblproperties

("orc.compress"="SNAPPY");

HIVE优化

HIVE本地模式

MR计算不走YARN

Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。

缺点:本地模式没有并行计算,大文件无法处理

set hive.exec.mode.local.auto=true;  //开启本地mr

//设置localmr的最大输入数据量,当输入数据量小于这个值时采用local  mr的方式,默认为134217728,即128M

set hive.exec.mode.local.auto.inputbytes.max=50000000;

//设置localmr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4

set hive.exec.mode.local.auto.input.files.max=10;

Group By(数据量非常大才适合用)

并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。

.开启Map端聚合参数设置

       (1)是否在Map端进行聚合,默认为True

set hive.map.aggr = true

(2)在Map端进行聚合操作的条目数目

set hive.groupby.mapaggr.checkinterval= 100000

(3)有数据倾斜的时候进行负载均衡(默认是false)

set hive.groupby.skewindata =true

Count(Distinct)去重统计

数据量大 一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换:

select count(distinct id) from bigtable;

select count(id) from (select id from bigtable group by id) a;

上一篇 下一篇

猜你喜欢

热点阅读