Hive企业级调优[8]—— 其他优化

server/2024/9/23 5:32:58/

目录

 其他优化

CBO优化

 优化说明

 优化案例

 谓词下推

 优化说明

 优化案例

 矢量化查询

Fetch抓取

 本地模式

优化说明

 优化案例

并行执行

 严格模式


 其他优化

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语句

hive (default)> 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;

3)开启CBO优化

-- 开启CBO优化
set hive.cbo.enable=true;-- 为了测试效果更加直观,关闭Map Join自动转换
set hive.auto.convert.join=false;

4)总结

根据上述案例可以看出,CBO优化对于执行计划中join顺序有显著影响。它将province_info的join顺序提前,因为province_info的数据量较小,这样做可以使中间结果的数据量减小,从而降低整体计算任务的数据量,即减小计算成本。

 谓词下推

 优化说明

谓词下推(Predicate Pushdown)是指尽量将过滤操作前移,以减少后续计算步骤的数据量。

相关参数:

-- 是否启动谓词下推优化
set hive.optimize.ppd = true;

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

 优化案例

1)示例SQL语句

hive (default)> select>     *> from order_detail> join province_info> where order_detail.province_id='2';

2)关闭谓词下推优化

-- 是否启动谓词下推优化
set hive.optimize.ppd = false;-- 为了测试效果更加直观,关闭CBO优化
set hive.cbo.enable=false;

3)开启谓词下推优化

-- 是否启动谓词下推优化
set hive.optimize.ppd = true;-- 为了测试效果更加直观,关闭CBO优化
set hive.cbo.enable=false;
 矢量化查询

Hive的矢量化查询优化依赖于CPU的矢量化计算能力,可以极大地提高某些典型查询场景(如scans, filters, aggregates, and joins)下的CPU使用效率。

相关参数:

set hive.vectorized.execution.enabled=true;

若执行计划中出现“Execution mode: vectorized”字样,则表明使用了矢量化计算。

官网参考链接: Vectorized Query Execution - Apache Hive - Apache Software Foundation

Fetch抓取

Fetch抓取是指,在某些情况下,Hive可以不必使用MapReduce计算。例如:select * from emp; 在这种情况下,Hive可以简单地读取emp对应的存储目录下的文件,然后输出查询结果到控制台。

相关参数:

-- 是否在特定场景转换为Fetch任务
-- 设置为none表示不转换
-- 设置为minimal表示支持select *,分区字段过滤,Limit等
-- 设置为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(即128MB)
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语句

hive (default)> 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;
并行执行

Hive会将一个SQL语句转化为一个或多个Stage,每个Stage对应一个MR Job。默认情况下,Hive同时只会执行一个Stage。但是,某些SQL语句可能包含多个Stage,而这些Stage之间并非完全依赖,因此可以并行执行。

相关参数:

-- 启用并行执行优化
set hive.exec.parallel=true;-- 同一个SQL允许的最大并行度,默认为8
set hive.exec.parallel.thread.number=8;
 严格模式

Hive可以通过设置某些参数来防止危险的操作:

  1. 分区表不使用分区过滤

     

    hive.strict.checks.no.partition.filter设置为true时,对于分区表,除非WHERE语句中含有分区字段过滤条件来限制范围,否则不允许执行。这样可以防止扫描所有分区,因为分区表通常数据量很大且增长迅速。

  2. 使用ORDER BY没有LIMIT过滤

     

    hive.strict.checks.orderby.no.limit设置为true时,对于使用了ORDER BY语句的查询,要求必须使用LIMIT语句。这是因为ORDER BY为了执行排序过程会将所有结果数据发送到同一个Reduce中处理,使用LIMIT可以在数据进入Reduce之前减少部分数据。

  3. 笛卡尔积

     

    hive.strict.checks.cartesian.product设置为true时,会限制笛卡尔积的查询。对于关系型数据库熟悉的用户可能期望在执行JOIN查询时不使用ON语句而是使用WHERE语句,这样关系数据库的执行优化器可以高效地将WHERE语句转化为ON语句。然而,Hive不会执行这种优化,如果表足够大,查询可能会变得不可控。


http://www.ppmy.cn/server/120652.html

相关文章

C++迭代器 iterator详解

目录 什么是迭代器 迭代器的类型 迭代器的用法 三种迭代器 范围for 什么是迭代器 它提供了一种访问容器(如列表、集合等)中元素的方法,而无需暴露容器的内部表示。迭代器使得程序员能够以统一的方式遍历不同的数据结构,而无需…

数据结构与算法——Java实现 10.习题——删除有序链表重复节点

所有无能为力的事情,我都在慢慢接受 —— 24.9.22 83. 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出…

SOCKS5、HTTP 代理IP协议有何区别?

在网络通信领域,代理服务器的选择对于数据安全和传输效率至关重要。SOCKS5代理和HTTP代理作为两种常用的代理类型,各自具有独特的特点和适用场景。本文将深入探讨SOCKS5代理与HTTP代理的区别、特性及应用场景,为用户提供选择指南。 一、SOCK…

矩阵分析第二章内积空间手稿笔记

概念 CS定理 内积长度 向量正交 正交基 构造正交基 内积的坐标表示 正交矩阵 两组正交基的过渡矩阵是正交的 特征值的模为1 正交子空间 正交补 内积空间的同构 正交变换内积不变 证明 点到点的距离 点到子空间的距离 最小二乘法 复内积空间 复内积空间cs定理和证明 三角不等式 …

增强现实系列—Map-Relative Pose Regression for Visual Re-Localization

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

MyBatis 源码解析:TypeHandler 设计与自定义实现

引言 在 MyBatis 中,TypeHandler 是一个非常重要的接口,它的作用是将 Java 类型和数据库类型进行互相转换。当我们执行 SQL 查询或插入操作时,TypeHandler 决定了如何将 Java 对象转换为数据库字段类型,或将数据库字段转换为 Jav…

【C/C++】initializer_list

initializer_list 1 构造函数场景 class P { public:P(int a, int b) {std::cout << "int, int" << std::endl;}P(std::initializer_list<int> initList) {std::cout << "initializer_list" << std::endl;} };调用&#x…

上位机图像处理和嵌入式模块部署(linux小系统开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和若干年前相比较&#xff0c;现在嵌入式linux开发要简单得多。稍微贵一点的有树莓派&#xff0c;国产的有各种水果派&#xff0c;基本上都可以按照…