HIVE优化浅谈

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: HIVE是数据仓库和交互式查询的优秀框架,但随着数据的增多,join的复杂度和性能问题,需要花时间和精力解决性能优化的问题。除了基于HIVE本身优化,还可以接入计算性能更好的框架,SparkSQL relational cache对使用者透明,开发不需要关心底层优化逻辑,将更多精力放入业务设计开发。

作者:邓力,entobit技术总监,八年大数据从业经历,由一代HADOOP入坑,深耕云计算应用领域,由从事亚马逊EMR和阿里云EMR应用开发逐步转入大数据架构领域,对大数据生态及框架应用有深刻理解。


引言

随着商务/运营同学执行的HQL越来越多,整体HIVE执行效率变低,本文从HIVE切入,分析HQL面临的问题和待优化部分,结合其他大数据框架来解决实际问题。以下内容没有针对业务代码提供优化建议.


常见的HQL
select型
设置hive.fetch.task.conversion=none会以集群模式运行,无论是否有limit。在数据量小时建议使用hive.fetch.task.conversion=more,此时select配合limit以单机执行获取样本数据,执行更快

常见的select配合order by/group by等基本操作不在此赘述

注:
select查询可以通过split.maxsize和split.minsize控制并发MAPPER数量

insert型
分为两种

1.insert into
2.insert overwrite

配合分区可以达到重写分区或者在分区追加数据的目的。还可以配合动态分区模式插入对应分区

开启动态分区:

// 开启动态分区模式
set hive.exec.dynamic.partition=true;
// 开启动态分区非严格模式(多分区时首分区支持动态分区必要条件,首分区为静态分区可以不设置)
set hive.exec.dynamic.partition.mode=nonstrict;
// 单节点上限
set hive.exec.max.dynamic.partitions.pernode=100;
// 集群上限
set hive.exec.max.dynamic.partitions=1000;

开启之后可以利用SQL达到动态插入的目的:

// 根据分区day动态插入数据
insert into table default.test partition(day) select id,day from orginal

CTAS

全称CREATE TABLE AS SELECT语句,语法和MYSQL类似,可以指定存储/压缩包等

// 采用parquet存储已准备配合SparkSQL使用
create table default.parquet_test stored as parquet as select * from default.test


// 同时可以指定压缩格式
create table default.parquet_test stored as parquet
TBLPROPERTIES ( 'orc.compress'='SNAPPY')
as select * from default.test

// 指定OSS作为存储(推荐)
create table default.parquet_test stored as parquet location 'oss:xxx:yyy/parquet/test'

JOIN优化
上面提到了常见的不同HQL类型,实际在执行的HQL中更可能变慢的时JOIN部分,以下会根据不同的场景来分析

大表x小表
这里可以利用mapjoin,SparkSQL中也有mapjoin或者使用广播变量能达到同样效果,此处描述HQL

// 开启mapjoin并设定map表大小
set hive.auto.convert.join.noconditionaltask = true;
set hive.auto.convert.join.noconditionaltask.size = 10000000;
// 大表 join 小表
select * from big_table join small_table on big_table.id=small_table.id

原理:将小表加载进入节点容器内存中,大表可以直接读取节点容器内存中的数据进行匹配过滤

大表x大表
小表可以放进内存,大表则不行。尽量避免大表x大表的执行需求。如果确认有此需求,可以参考以下方法

1.尝试将大右表自我join成为一张宽表

// 利用右表的唯一属性自我join
select id, case when type='food' then 0 else 1 as type_tag,case when
sale_type='city' then sales else null as sale_amount from group by id

2.尝试先将大表按照主键分桶后join

create table new_left as select * from left_table cluster by id
create table new_right as select * from right_table cluster by id
select * from new_left join new_right on new_left.id=new_right.id

3.根据数据大小量级合理增加reduce数量,reduce不宜设置过大

// hadoop1代
set mapred.reduce.tasks= 200;
// hadoop2代
set mapreduce.job.reduces=200;

4.利用ORC bloomfilter, 大幅度提高join效率
注:parquet bloomfilter在开发中

// 建立orc表
create table default.right_orc stored as orcfile TBLPROPERTIES
('orc.compress'='SNAPPY',
'orc.create.index'='true',
'orc.bloom.filter.columns'='id')
as select * from right_table
// 使用新表join
select * from left_orc join right_orc on left_orc.id=righ_orc.id

5.调整内存限制
join时容易造成节点OOM,导致任务失败,可以尝试以下方法:

map阶段OOM,适当增加map阶段内存 set mapreduce.map.memory.mb=3096
reduce阶段OOM,适当增加reduce阶段内存 set mapreduce.reduce.memory.mb=4096

注: 默认执行引擎为mr,如果是TEZ,参考tez优化部分

6.善用explain/analyze
使用explain和analyze分析HQL语句和表,试图从中找出实际数据中可以优化的部分,这里和数据强关联,需要根据实际数据考量

7.数据预处理。将部分join放入离线计算任务,减少业务join的时间


更多思考
1.文件压缩后仍然很大:可以使用GZIP压缩代替SNAPPY,但是性能比SNAPPY差很多
2.HQL队列拥挤:可以参考队列抢占式资源调度策略,对小任务支持更好
3.HIVE作为数据仓库/交互式查询的优秀手段之一,是否有更好的计算框架可以替代:EMR SparkSQL可以替代大部分HIVE应用场景,并且3.22版本relational cache带来了极强的性能优化。推荐使用


总结
HIVE本身确实是数据仓库和交互式查询的优秀框架,但随着数据的增多,join的复杂度和性能问题,需要花时间和精力解决性能优化的问题。除了基于HIVE本身优化,还可以接入计算性能更好的框架,SparkSQL relational cache对使用者透明,开发不需要关心底层优化逻辑,可以将更多精力放入业务设计开发中。后续将针对SparkSQL部分提供个人经验供参考。

欢迎对EMR及相关技术感兴趣的同学进钉钉群一起讨论 :)
3.png

相关实践学习
基于EMR Serverless StarRocks一键玩转世界杯
基于StarRocks构建极速统一OLAP平台
快速掌握阿里云 E-MapReduce
E-MapReduce 是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,包括 Hadoop、Spark、HBase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。 本课程主要介绍阿里云 E-MapReduce 的使用方法。
相关文章
|
6月前
|
SQL 存储 分布式计算
Hive数据仓库设计与优化策略:面试经验与必备知识点解析
本文深入探讨了Hive数据仓库设计原则(分区、分桶、存储格式选择)与优化策略(SQL优化、内置优化器、统计信息、配置参数调整),并分享了面试经验及常见问题,如Hive与RDBMS的区别、实际项目应用和与其他组件的集成。通过代码样例,帮助读者掌握Hive核心技术,为面试做好充分准备。
562 0
|
SQL 分布式计算 监控
Hive性能优化之计算Job执行优化 2
Hive性能优化之计算Job执行优化
226 1
|
SQL 存储 分布式计算
Hive性能优化之表设计优化1
Hive性能优化之表设计优化1
78 1
|
6月前
|
SQL 分布式计算 资源调度
Hive 优化总结
Hive优化主要涉及HDFS和MapReduce的使用。问题包括数据倾斜、操作过多和不当使用。识别倾斜可通过检查分区文件大小或执行聚合抽样。解决方案包括整体优化模型设计,如星型、雪花模型,合理分区和分桶,以及压缩。内存管理需调整mapred和yarn参数。倾斜数据处理通过选择均衡连接键、使用map join和combiner。控制Mapper和Reducer数量以避免小文件和资源浪费。减少数据规模可调整存储格式和压缩,动态或静态分区管理,以及优化CBO和执行引擎设置。其他策略包括JVM重用、本地化运算和LLAP缓存。
138 4
Hive 优化总结
|
5月前
|
SQL 资源调度 数据库连接
Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南
在Tez上优化Hive查询,包括配置参数调整、理解并行化机制以及容器管理。关键步骤包括YARN调度器配置、安全阀设置、识别性能瓶颈(如mapper/reducer任务和连接操作),理解Tez如何动态调整mapper和reducer数量。例如,`tez.grouping.max-size` 影响mapper数量,`hive.exec.reducers.bytes.per.reducer` 控制reducer数量。调整并发和容器复用参数如`hive.server2.tez.sessions.per.default.queue` 和 `tez.am.container.reuse.enabled`
398 0
|
6月前
|
SQL 存储 大数据
Hive的查询、数据加载和交换、聚合、排序、优化
Hive的查询、数据加载和交换、聚合、排序、优化
131 2
|
6月前
|
SQL 存储 分布式计算
【Hive】Hive优化有哪些?
【4月更文挑战第16天】【Hive】Hive优化有哪些?
|
6月前
|
SQL 分布式计算 资源调度
一文看懂 Hive 优化大全(参数配置、语法优化)
以下是对提供的内容的摘要,总长度为240个字符: 在Hadoop集群中,服务器环境包括3台机器,分别运行不同的服务,如NodeManager、DataNode、NameNode等。集群组件版本包括jdk 1.8、mysql 5.7、hadoop 3.1.3和hive 3.1.2。文章讨论了YARN的配置优化,如`yarn.nodemanager.resource.memory-mb`、`yarn.nodemanager.vmem-check-enabled`和`hive.map.aggr`等参数,以及Map-Side聚合优化、Map Join和Bucket Map Join。
332 0
|
6月前
|
SQL 分布式计算 Hadoop
Hive SQL 优化
Hive SQL 优化
98 1
|
6月前
|
SQL 存储 关系型数据库
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
726 0