Hive优化的核心思想:
减少数据量(例如分区等操作)
避免数据倾斜(例如加参数,打散key值等的操作)
避免全表扫描(where过滤,特定分区等的操作,和减少数据量目标一致)
减少job数(相同的on条件放在一起作为一个任务)
下面就日常工作总结出的一些基础优化点,从以下几方面分开阐述
代码层面:
- 考虑使用中间表进行存储,避免子查询太复杂且数据量太大。
- 大小表的join 不过现在hive内部进行了优化,自动视小表为驱动表
- 分区/分桶表的优化,避免全表扫描,提升查询效率
- 选择合适的存储格式/压缩格式
- 尽量避免 select*
- 合理使用 union 减少 job数量
- 利用多表相同的join条件,不管什么关联,不管几个表join的key一样,会合并为一个mr任务
- 合理选择数据类型
- 子查询尽量用关联代替
- 插入数据量大,多批insert into 插入
数据倾斜问题:
- 调参优化,开启负载均衡。(但是无法从根本上解决数据倾斜,处理过程相对黑盒)
- 正常操作时将集中的key按照一定规则添加随机数。
- 大量null值的过滤
Job任务调参:
- map端的join
- 小文件合并
- Mapper/reducer的个数调整
- 合适的存储格式
- 本地模式(不是所有的sql语句都需要集群运行)
- Jvm重用机制:默认情况下一个map/reduce task 就会启动一个jvm进程,一个task执行完毕之后,jvm进程就会退出。如果任务花费时间很短,多次启动的话jvm消耗会很大,开启重用机制,一直占用使用的task卡槽,以便随时再次使用,如果某个不平衡的job中数据倾斜,部分reducetask时间很久,那么保留的卡槽的会一直占用才会释放。一般建议 jvm可以是 cpucore的 2~3倍
- 任务的并行执行,一个hivesql 可能会转为多个mr,每一个job就是一个stage。Job执行顺序可以再日志看到,但是如果job之间没有依赖关系 可以并行执行。但是并行执行量力而行,集群资源小,反而会使job抢占资源导致性能下降。
本文概述了Hive优化的关键方法,包括减少数据量、避免数据倾斜、防止全表扫描、合并Job任务以及在代码层面的改进,如使用中间表、合理选择存储格式和JVM重用。同时讨论了数据倾斜问题的调参和Job任务的并行执行策略。
1810

被折叠的 条评论
为什么被折叠?



