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;
网友评论