首页 > 其他分享 >Hive企业级调优[8]—— 其他优化

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

时间:2024-09-22 19:48:25浏览次数:10  
标签:set -- CBO hive 企业级 调优 Hive 优化

目录

 其他优化

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不会执行这种优化,如果表足够大,查询可能会变得不可控。

标签:set,--,CBO,hive,企业级,调优,Hive,优化
From: https://blog.csdn.net/qq_45115959/article/details/142442290

相关文章

  • 全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、
    目录一、性能测试的指标1、并发量2、响应时间3、错误率4、吞吐量5、资源使用率二、压测全流程三、其他注意点1、并发和吞吐量的关系2、并发和线程的关系四、调优及分布式集群压测(待仔细学习)1.线程数量超过单机承载能力时的解决方案2.如何搭建分布式集群3.实施......
  • Linux系统性能调优技巧
    Linux系统性能调优是一个复杂而细致的过程,它涉及到硬件、软件、内核参数以及进程管理等多个方面。通过合理的调优措施和持续的监控调整,可以显著提升Linux系统的运行效率和稳定性。本文将详细介绍Linux系统性能调优的技巧,涵盖硬件、软件、内核参数、进程管理等多个角度。一、硬......
  • 利用sqoop将某一数据库从MySQL导入hive
    首先,为防止报错,将两个驱动包装在sqoop中:commons-lang-2.6.jar和hive-common-3.1.2.jar一般hive中都会有这两个驱动包,因此可执行如下命令:cp/opt/installs/hive/lib/commons-lang-2.6.jar/opt/installs/sqoop/lib/cp/opt/installs/hive/lib/hive-common-3.1.2.jar/opt/ins......
  • HiveServer2 文件描述符泄漏
     现象用户反馈hs2打开的文件描述符的数量一直在涨,但是当前hs2的连接只有个位数。 排查过程首先找到hs2进程持有了哪些文件描述符,通过lsof命令lsof-p$pid,看到hs2进程确实在/data/emr/hive/tmp/operation_logs/目录下打开了大量描述符在jira中找到一......
  • GBase 8c NUMA绑核调优实操
    NUMA优化技术是针对数据库在NUMA架构CPU上运行时出现的资源消耗不均、并发场景下远端Node时延较高等问题进行优化的技术。GBase8c数据库通过设置执行线程与Node节点的亲和度,可以将线程绑定在指定的CPU核心运行,从而避免跨Node调度,降低远端访问时延,提升数据库对外处理性能。同时,线程......
  • Oracle执行计划及性能调优详解使用
    在Oracle数据库中,SQL性能分析是一项非常重要的任务。通过性能分析,我们可以了解SQL语句的执行情况,从而优化其性能。常用的方法包括使用EXPLAINPLAN、自动工作负载库(AWR)、SQLTrace等工具。EXPLAINPLAN是最常用的工具之一,它生成SQL语句的执行计划并提供重要的......
  • ⭐️Linux系统性能调优技巧
    Linux系统性能调优技巧Linux系统性能调优技巧引言1.监控系统性能1.1`top`命令1.2`htop`命令1.3`vmstat`命令1.4`iostat`命令1.5`sar`命令2.优化磁盘性能2.1磁盘分区2.2磁盘阵列2.3固态硬盘(SSD)2.4磁盘调度算法3.优化内存性能3.1内存管理3.2内存分配......
  • Hive sql 4:中位数
    先说下中位数的概念:中位数‌是统计学中的一个重要概念,它代表将一组数据按照大小排序后位于中间位置的数值。如果一组数据有奇数个数值,则中位数是中间那个数;如果数据中有偶数个数值,则中位数是中间两个数的平均值。中位数是一种位置平均数,它是按顺序排列的一组数据中居于中间位......
  • Hive sql 6:行转列及列转行
    1) 多行转单列user_idlogin_date10012024-09-0110012024-09-0210022024-09-0310032024-09-05比较常见的selectuser_id,concat_ws(',',collect_list(login_date))login_date_setfromtblgroupbyuser_id延伸下,集合中保证日期的有序启动多个mr,顺序会有问题1) 以前......
  • 怎么办?用DolphinScheduler调度执行复杂的HiveSQL时无法正确识别符号
    在使用ApacheDolphinScheduler调度执行复杂的HiveSQL时,HQL包含多种海豚无法正确识别的符号,怎么办?本文提供了可行的思路和方法,供用户参考。一、目的在Hive中完成复杂JSON,既有对象还有数组而且数组中包含数组的解析后,原本以为没啥问题了,结果在DolphinScheduler中调度又出现了大问......