hive企业级调优策略之CBO,谓词下推等优化

本文介绍了Hive的CBO优化、谓词下推、矢量化查询、Fetch抓取、本地模式、并行执行和严格模式,展示了如何通过调整参数改善join顺序、减少计算成本和提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试所用到的数据参考:

原文链接:https://blog.youkuaiyun.com/m0_52606060/article/details/135080511
本教程的计算环境为Hive on MR。计算资源的调整主要包括Yarn和MR。

CBO优化

优化说明

CBO是指Cost based Optimizer,即基于计算成本的优化。
在Hive中,计算成本模型考虑到了:数据的行数、CPU、本地IO、HDFS IO、网络IO等方面。Hive会计算同一SQL语句的不同执行计划的计算成本,并选出成本最低的执行计划。目前CBO在hive的MR引擎下主要用于join的优化,例如多表join的join顺序。
相关参数为:
–是否启用cbo优化

set hive.cbo.enable=true;

优化案例

(1)示例SQL语句

select
    *
from order_detail od
join product_info product on od.product_id=product.id
join province_info province on od.province_id=province.id;

(2)关闭CBO优化
–关闭cbo优化

set hive.cbo.enable=false;

–为了测试效果更加直观,关闭map join自动转换

set hive.auto.convert.join=false;

–增加reduce端容器内存

set mapreduce.reduce.memory.mb=2304;

根据执行计划,可以看出,三张表的join顺序如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(3)开启CBO优化
–开启cbo优化

set hive.cbo.enable=true;

–为了测试效果更加直观,关闭map join自动转换

set hive.auto.convert.join=false;

根据执行计划,可以看出,三张表的join顺序如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(4)总结
根据上述案例可以看出,CBO优化对于执行计划中join顺序是有影响的,其之所以会将province_info的join顺序提前,是因为province info的数据量较小,将其提前,会有更大的概率使得中间结果的数据量变小,从而使整个计算任务的数据量减小,也就是使计算成本变小。

谓词下推

优化说明

谓词下推(predicate pushdown)是指,尽量将过滤操作前移,以减少后续计算步骤的数据量。
相关参数为:
–是否启动谓词下推(predicate pushdown)优化

set hive.optimize.ppd = true;

需要注意的是:
CBO优化也会完成一部分的谓词下推优化工作,因为在执行计划中,谓词越靠前,整个计划的计算成本就会越低。

优化案例

(1)示例SQL语句

select
    *
from order_detail
join province_info
where order_detail.province_id='2';

(2)关闭谓词下推优化
–是否启动谓词下推(predicate pushdown)优化

set hive.optimize.ppd = false;

–为了测试效果更加直观,关闭cbo优化

set hive.cbo.enable=false;

通过执行计划可以看到,过滤操作位于执行计划中的join操作之后。
在这里插入图片描述
在这里插入图片描述

(3)开启谓词下推优化
–是否启动谓词下推(predicate pushdown)优化

set hive.optimize.ppd = true;

–为了测试效果更加直观,关闭cbo优化

set hive.cbo.enable=false;

通过执行计划可以看出,过滤操作位于执行计划中的join操作之前。
在这里插入图片描述
在这里插入图片描述

矢量化查询

Hive的矢量化查询优化,依赖于CPU的矢量化计算,CPU的矢量化计算的基本原理如下图:
在这里插入图片描述

Hive的矢量化查询,可以极大的提高一些典型查询场景(例如scans, filters, aggregates, and joins)下的CPU使用效率。
相关参数如下:

set hive.vectorized.execution.enabled=true;

若执行计划中,出现“Execution mode: vectorized”字样,即表明使用了矢量化计算。
官网参考连接:
https://cwiki.apache.org/confluence/display/Hive/Vectorized+Query+Execution#VectorizedQueryExecution-Limitations

优化案例

(1)示例SQL语句

select province_id,sum(product_num) from order_detail group by province_id;

(2) 关闭矢量化查询

set hive.vectorized.execution.enabled=false;

在这里插入图片描述
在这里插入图片描述

(2) 打开矢量化查询
在这里插入图片描述
在这里插入图片描述

Fetch抓取

Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:select * from emp;在这种情况下,Hive可以简单地读取emp对应的存储目录下的文件,然后输出查询结果到控制台。
相关参数如下:
–是否在特定场景转换为fetch 任务
–设置为none表示不转换

set hive.fetch.task.conversion=none;

–设置为minimal表示支持select *,分区字段过滤,Limit等

set hive.fetch.task.conversion=minimal;

–设置为more表示支持select 任意字段,过滤,和limit等

set hive.fetch.task.conversion=more;

优化案例

(1)示例SQL语句

select * from order_detail;

(2) --设置为none表示不转换

set hive.fetch.task.conversion=none;

在这里插入图片描述
在这里插入图片描述

(3)–设置为more表示支持select 任意字段,包括函数,过滤,和limit等

set hive.fetch.task.conversion=more;

在这里插入图片描述

本地模式

优化说明

大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
相关参数如下:
–开启自动转换为本地模式

set hive.exec.mode.local.auto=true;  

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

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

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

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

优化案例

(1)示例SQL语句

select
    count(*)
from product_info
group by category_id;

(2)关闭本地模式

set hive.exec.mode.local.auto=false;

在这里插入图片描述

在这里插入图片描述

(3)开启本地模式

set hive.exec.mode.local.auto=true;

在这里插入图片描述
开启本地模式后如果执行SQL报错,可参考文章:http://t.csdnimg.cn/ZTnZO

并行执行

Hive会将一个SQL语句转化成一个或者多个Stage,每个Stage对应一个MR Job。默认情况下,Hive同时只会执行一个Stage。但是某SQL语句可能会包含多个Stage,但这多个Stage可能并非完全互相依赖,也就是说有些Stage是可以并行执行的。此处提到的并行执行就是指这些Stage的并行执行。相关参数如下:
–启用并行执行优化

set hive.exec.parallel=true;   

–同一个sql允许最大并行度,默认为8

set hive.exec.parallel.thread.number=8; 

优化案例

(1)示例SQL语句

select
    count(*)
from product_info
group by category_id;

(2)关闭并行执行优化

set hive.exec.parallel=false;

在这里插入图片描述

在这里插入图片描述

(3)启用并行执行优化

set hive.exec.parallel=true;

在这里插入图片描述
在这里插入图片描述

严格模式

Hive可以通过设置某些参数防止危险操作:
(1)分区表不使用分区过滤
将hive.strict.checks.no.partition.filter设置为true时,对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。换句话说,就是用户不允许扫描所有分区。进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速。没有进行分区限制的查询可能会消耗令人不可接受的巨大资源来处理这个表。

hive.strict.checks.no.partition.filter=true

在这里插入图片描述
报错翻译:
在这里插入图片描述

(2)使用order by没有limit过滤
将hive.strict.checks.orderby.no.limit设置为true时,对于使用了order by语句的查询,要求必须使用limit语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个Reduce中进行处理,强制要求用户增加这个limit语句可以防止Reduce额外执行很长一段时间(开启了limit可以在数据进入到Reduce之前就减少一部分数据)。

hive.strict.checks.orderby.no.limit=true

在这里插入图片描述
报错翻译:
在这里插入图片描述

(3)笛卡尔积
将hive.strict.checks.cartesian.product设置为true时,会限制笛卡尔积的查询。对关系型数据库非常了解的用户可能期望在执行JOIN查询的时候不使用ON语句而是使用where语句,这样关系数据库的执行优化器就可以高效地将WHERE语句转化成那个ON语句。不幸的是,Hive并不会执行这种优化,因此,如果表足够大,那么这个查询就会出现不可控的情况。

hive.strict.checks.cartesian.product=true

在这里插入图片描述
报错翻译:
在这里插入图片描述

<think>好的,我现在要处理用户关于华为大数据技术面试的问题。用户希望了解常见的面试问题及解决方案,并且系统提示需要结合之前的引用内容。首先,我需要回忆用户提供的三个引用,看看哪些可以关联上。 引用1提到数据治理的挑战,比如文化阻力、资源分配、数据孤岛等。这可能和大数据平台设计、数据治理相关的问题有关。华为可能会问如何处理数据孤岛或如何实施数据治理,这时候可以引用这些点。 引用2讲的是数据倾斜的定义,常见于处理大数据时的性能问题。数据倾斜是面试中的经典问题,需要解决方案,比如整分区键或使用Combiner。这里需要结合Hadoop或Spark的数据处理机制。 引用3关于Hive的查询处理流程,涉及查询编译、优化器和物理执行计划。华为可能问Hive优化策略,可以提到谓词下推、MapReduce任务拆分等。 接下来,我需要整理华为大数据面试的常见技术点。通常包括Hadoop生态组件(HDFS、MapReduce、YARN)、Spark、Hive优化、数据倾斜处理、数据治理、实时计算(如Flink)、分布式系统原理等。 然后,结合用户提供的引用,将相关知识点对应起来。例如,数据治理的挑战可以对应到数据治理策略的问题;数据倾斜对应到处理大数据性能优化的方法;Hive的查询流程对应到Hive优化问题。 接下来需要组织回答结构,按照常见问题分类,每个问题给出解决方案,并适当引用提供的资料。比如: 1. 数据倾斜问题:解释现象,引用[2]中的定义,然后给出解决方法如增加随机前缀、使用Combiner等。 2. Hive优化:引用[3]中的优化步骤,如谓词下推、分区剪裁等。 3. 数据治理挑战:引用[1]中的问题,如数据孤岛,技术选型,然后给出解决方案,比如元数据管理、数据标准化。 另外,华为可能关注实际项目经验,需要结合理论解决方案和实际应用案例,比如在项目中如何解决数据倾斜,如何优化Hive查询速度。 需要注意使用中文,数学公式用$...$,独立公式用$$...$$,但用户的问题可能不涉及太多数学,所以可能用不上。不过如果有涉及算法复杂度的话可能需要,比如解释排序算法的时间复杂度。 最后,生成相关问题,比如如何处理数据倾斜,Hive优化方法,数据治理的挑战等,确保问题与回答内容相关,并参考之前的引用。 检查是否符合系统级指令,确保格式正确,没有使用markdown,引用标识正确,比如[^1]、[^2]等。</think>### 华为大数据技术面试常见问题与解决方案 #### 一、数据治理与平台设计 1. **数据孤岛问题** **问题**:如何整合分散在不同系统中的数据? **解决方案**: - 建立统一元数据管理系统,通过数据湖(如Hudi、Iceberg)实现多源数据统一存储[^1] - 使用ETL工具(如DataX)进行数据清洗和标准化 - 示例:华为FusionInsight平台通过元数据联邦查询整合Hive、HBase等异构数据源 2. **数据治理初期挑战** **问题**:如何说服团队接受数据治理规范? **解决方案**: - 结合华为内部流程,制定与企业目标对齐的治理指标(如数据质量达标率) - 通过小范围试点展示治理效果(如减少30%重复数据处理时间)[^1] --- #### 二、大数据处理核心问题 1. **数据倾斜(Data Skew)** **问题**:Reduce阶段某些节点负载过高导致任务延迟[^2] **解决方案**: - **预处理**:对Key添加随机前缀(如`salting`),分散数据分布 ```sql -- Hive示例:将key扩展为随机数+原值 SELECT CONCAT(CAST(RAND()*10 AS INT), '_', key) AS new_key, value FROM table; ``` - **运行时优化**:启用Spark的`Combine`预聚合或Flink的`LocalKeyBy`机制 2. **Hive查询优化** **问题**:如何提升HiveQL执行效率? **解决方案**: - **逻辑优化**:利用谓词下推(Predicate Pushdown)提前过滤数据[^3] - **物理优化**:对JOIN操作使用MapJoin(小表广播),避免Reduce阶段Shuffle - **华为实践**:在FusionInsight中启用CBO(Cost-Based Optimizer)自动选择最执行计划 --- #### 三、分布式系统原理 1. **CAP理论应用** **问题**:设计分布式存储系统时如何权衡一致性、可用性、分区容忍性? **解决方案**: - **华为HDFS实践**:强一致性(CP)+ 副本机制(默认3副本)保障可靠性 - **流处理场景**:采用Flink的Exactly-Once语义(CP)与Kafka高吞吐(AP)结合 2. **故障恢复机制** **问题**:如何实现Spark任务容错? **解决方案**: - **RDD血缘(Lineage)**:通过DAG重新计算丢失分区 - **Checkpointing**:定期将状态持久化到HDFS --- #### 四、实时计算技术 1. **Flink窗口机制** **问题**:如何处理乱序事件流? **解决方案**: - 使用`Watermark`机制定义事件时间容忍延迟 - 华为增强方案:动态整Watermark阈值(如网络抖动场景) $$ Watermark(T) = max\_event\_time - delay\_threshold $$ 2. **状态管理** **问题**:如何避免Flink状态爆炸? **解决方案**: - 设置TTL(Time-To-Live)自动清理过期状态 - 使用RocksDB状态后端实现磁盘溢出(Spill to Disk) --- #### 五、项目经验类问题 **典型问题**:请举例说明你解决过的最复杂的大数据问题 **回答框架**: 1. **背景**:描述数据规模(如"10TB日志数据/天")和业务目标(如"实时风控") 2. **挑战**:明确技术难点(如"95分位延迟超过SLA") 3. **方案**:结合前述技术点(如"Flink反压优化+Kafka分区重平衡") 4. **结果**:量化指标(如"端到端延迟降低60%") ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值