hive 工作总结1

hive 优化

数据倾斜、数据冗余、job的IO以及不同底层引擎配置情况和Hive本身参数和HiveSQL的执行

1  hive本身参数的配置优化:

        1 针对小文件过多的配置:

                输入、输出端合并

                输入:更改hive的输入文件格式,参数名称是 hive.input.format

                          默认值是org.apache.hadoop.hive.ql.io.HiveInputFormat

                          我们改成org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

                输出:

                        hive.merge.mapfiles 和 hive.merge.mapredfiles都设为true即可

        2 表的存储格式

                设置表的默认文件格式:

                                set hive.default.fileformat=<file_format>      -- orc

                这是表的默认类型:

                                set hive.default.fileformat.managed = <file_format>     --  external

        

        3 表的压缩格式

                采用 orc + 默认的压缩zlib

       4 分区分桶

                对于一张大表设置成分区表,避免数据的全表扫描。同时注意避免多级分区,一般二级分区足够使用。一般使用日期字段、地里位置字段设置分区字段。

                对于一张大表,通过分桶操作,对数据进行更细粒度的划分成多个数据文件,可以提升join性能(join字段是分桶字段);也可以提升过滤操作的效率(过滤字段是分桶字段)

这分桶表

       5 配置jvm重用

                参数mapred.job.reuse.jvm.num.tasks来设置。JVM重用可以使得JVM示例在同一个job中时候使用N此。

        6 推测执行

                        通过mapred-site.xml中配置

                                mapred.map.tasks.speculative.execution=true

                                mapred.reduce.tasks.speculative.execution=true

2 数据倾斜

        1 什么是数据倾斜

                由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点

        2 数据倾斜的现象

                在执行任务时,任务进度长时间维持在99%

        3 数据倾斜的情况

                1 join操作

                2 group by

                3 count(distinct)

        4 数据倾斜解决方案

                1 map端聚合

     设置  

--Map 端部分聚合,相当于Combiner
hive.map.aggr = true;
--有数据倾斜的时候进行负载均衡
hive.groupby.skewindata=true;

-- 有数据倾斜时进行负载均衡,生成的查询计划会有两个mr job 。

第一个mr job中, map的输出结果集合会随机分布到reduce中,每个reduce做部分聚合操作,并输出结果。这样处理使得相同的key有可能被分发到不同的reduce中,从而达到负载均衡的目的。 

第二个mr job ,走常规的mr流程,完成最终的聚合操作。

                 2 如何选取关联驱动表join

                                选取key值相对数据量小 并且 分布均匀的表作为 驱动表,以达到两表在join时,数据量相对变小

                 3 大小表join -- map join

                                使用map join让小维度(千条记录)先进内存。在map端完成reduce

                 4  空值产生的数据倾斜

                                把空值的key使用case when 变成 concat(字符串,round()),把倾斜的数据分散到不同的reduce中,由于空值关联不上,处理后不影响最终结果。

                 5  count(distinct)

                                 采用 sum() group by 替代 count(distinct)

                6   特殊情况特殊处理

                                 将特殊的数据拿出来,最后再union回去

                7  关联字段为不同数据类型

                                将字段类型使用cast转换一致,on a.usr_id = cast(b.user_id as string);

       

3 架构层面

               1 选择更合适更快的引擎,比如 tez,mr , spark           

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值