Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南

文章目录

  • 在Tez上优化Hive查询的指南
    • 调优指南
    • 理解Tez中的并行化
      • 理解mapper数量
      • 理解reducer数量
    • 并发
      • 案例1:未指定队列名称
      • 案例2:指定队列名称
      • 并发的指南/建议
    • 容器复用和预热容器
      • 容器复用
      • 预热容器
    • 一般Tez调优参数

在Tez上优化Hive查询的指南

在Tez上优化Hive查询无法采用一刀切的方法。查询性能取决于数据的大小、文件类型、查询设计和查询模式。在性能测试过程中,应评估和验证配置参数及任何SQL修改。建议在工作负载的性能测试过程中一次只进行一项更改,并最好在开发环境中评估调优更改的影响,然后再在生产环境中使用。

这里分享一些关于Tez上Hive查询的基本故障排除和调优指南。

调优指南

不同的hive版本,不同执行引擎之间的调优行为有所差异,所以同一条sql可能会有不一样的速度。

一般情况下,我们可以通过以下步骤有助于识别可能导致性能下降的地方。

  1. 验证和确认YARN容量调度器配置

队列配置错误可能会由于对用户可用资源的任意限制而影响查询性能。验证用户限制因子、最小用户限制百分比和最大容量。

  1. 检查Hive和HiveServer2配置中的任何安全阀(非默认值)是否相关

移除任何遗留的和过时的属性。

  1. 识别缓慢的区域,例如mapper任务、reducer任务和连接操作
  • 审查Tez引擎和平台的通用调优属性。
  • 审查mapper任务并根据需要增加/减少任务数。
  • 审查reducer任务并根据需要增加/减少任务数。
  • 审查任何并发相关的问题——并发问题分为两种,如下所述:
    • 队列内用户间的并发。这可以通过调整YARN队列的用户限制因子进行调优(详细信息参考容量调度器博客)。
    • Hive on Tez会话的预热容器之间的并发,详见下文。

理解Tez中的并行化

在更改任何配置之前,必须了解Tez内部的工作机制。例如,这包括了解Tez如何确定正确的mapper和reducer数量。审查Tez架构设计以及有关初始任务并行性和自动reducer并行性的详细信息将有助于优化查询性能。

理解mapper数量

Tez使用作业的初始输入数据确定mapper任务的数量。在Tez中,任务数量由分组拆分决定,这相当于MapReduce作业中输入拆分确定的mapper数量。

  • tez.grouping.min-sizetez.grouping.max-size 决定mapper的数量。min-size的默认值为16 MB,max-size为1 GB。
  • Tez确定任务数量,使每个任务的数据量符合最大/最小分组大小。
  • 减少 tez.grouping.max-size 会增加任务/mapper数量。
  • 增加 tez.grouping.max-size 会减少任务数量。

例如:

  • 输入数据(输入碎片/拆分) – 1000个文件(约1.5 MB大小)
  • 总数据量约为 – 1000*1.5 MB = ~1.5 GB
  • Tez可能尝试使用至少两个任务处理这些数据,因为每个任务的最大数据量可能为1 GB。最终,Tez可能强制将1000个文件(拆分)组合到两个任务中,导致执行时间变慢。
  • 如果将 tez.grouping.max-size 从1 GB减少到100 MB,mapper数量可能增加到15,从而提供更好的并行性。性能因此提高,因为改进的并行性将工作分散到15个并发任务中。

以上是一个示例场景,然而在生产环境中使用ORC或Parquet等二进制文件格式时,根据存储类型、拆分策略文件或HDFS块边界确定mapper数量可能会变得复杂。

注意:更高程度的并行性(如mapper/reducer数量多)并不总是意味着更好的性能,因为它可能导致每个任务的资源减少以及由于任务开销而导致的资源浪费。

理解reducer数量

Tez使用多种机制和设置确定完成查询所需的reducer数量。

  • Tez根据要处理的数据(字节数)自动确定reducer。
  • 如果 hive.tez.auto.reducer.parallelism 设置为true,Hive会估算数据大小并设置并行性估算值。Tez将在运行时采样源顶点的输出大小并根据需要调整估算值。
  • 默认情况下,最大reducer数量设置为1009(hive.exec.reducers.max)。
  • Hive/Tez使用以下公式估算reducer数量,然后调度Tez DAG:
Max(1, Min(hive.exec.reducers.max [1009], ReducerStage estimate/hive.exec.reducers.bytes.per.reducer)) x hive.tez.max.partition.factor [2]

以下三个参数可以调整以增加或减少mapper数量:

  • hive.exec.reducers.bytes.per.reducer:每个reducer的大小。更改为较小值以增加并行性,或更改为较大值以减少并行性。默认值为256 MB(即如果输入大小为1 GB,则使用4个reducer)。
  • tez.min.partition.factor:默认值为0.25。
  • tez.max.partition.factor:默认值为2.0。增加以增加reducer数量,减少以减少reducer数量。

用户可以使用 mapred.reduce.tasks 手动设置reducer数量。这不推荐使用,应避免使用。

建议:

  • 避免手动设置reducer数量。
  • 增加reducer数量并不总是能保证更好的性能。
  • 根据reducer阶段估算,如果要增加或减少reducer数量,可以调整 hive.exec.reducers.bytes.per.reducer 参数到较小或较大值。

并发

我们需要理解和调整Tez上的Hive并发会话,如运行多个Tez AM容器。以下属性有助于理解默认队列和会话数量行为。

  • hive.server2.tez.default.queues:与YARN队列对应的以逗号分隔的值列表,用于维护Tez会话池。
  • hive.server2.tez.sessions.per.default.queue:每个YARN队列中保持在池中的Tez会话(DAGAppMaster)数量。
  • hive.server2.tez.initialize.default.sessions:如果启用,HiveServer2(HS2)在启动时将启动所有必要的Tez会话以满足 sessions.per.default.queue 要求。

当定义以下属性时,HiveServer2将为每个默认队列创建一个Tez Application Master(AM),乘以HiveServer2服务启动时的会话数量。因此:

(Tez Sessions)total = HiveServer2instances x (default.queues) x (sessions.per.default.queue)

示例说明:

  • hive.server2.tez.default.queues= “queue1, queue2”
  • hive.server2.tez.sessions.per.default.queue=2
    =>HiveServer2将创建4个Tez AM(queue1两个,queue2两个)。

注意:池中的Tez会话总是运行,即使在空闲集群上。

如果HiveServer2连续使用,这些Tez AM将继续运行,但如果HS2空闲,这些Tez AM将根据 tez.session.am.dag.submit.timeout.secs 定义的超时被终止。

案例1:未指定队列名称

如果查询未指定队列名称(tez.queue.name),则只会使用池中的Tez AM(如上所述初始化)。在这种情况下,HiveServer2将选择一个空闲/可用的Tez AM(队列名称可能是随机选择的)。如果未指定队列名称,则查询将保持在HiveServer2中的挂起状态,直到池中有一个可用的默认Tez AM来处理查询。在JDBC/ODBC客户端或HiveServer2日志文件中不会有任何消息。由于没有消息生成,当查询挂起时,用户可能会认为JDBC/ODBC连接或HiveServer2已断开,但实际上它在等待一个Tez AM执行查询。

案例2:指定队列名称

如果查询指定了队列名称,无论有多少初始化的Tez AM正在使用或空闲,HiveServer2都会为此连接创建一个新的Tez AM,并且查询可以执行(如果队列有可用资源)。

并发的指南/建议

  • 对于不希望用户限制在同一个Tez AM池中的用例或查询,将 hive.server2.tez.initialize.default.sessions 设置为false。禁用此选项可以减少HiveServer2上的争用并提高查询性能。
  • 此外,增加 hive.server2.tez.sessions.per.default.queue 的会话数量。
  • 如果有需要为每组用户提供单独或专用Tez AM池的用例,需要为每组用户提供专用的HiveServer2服务,每个服务具有相应的默认队列名称和会话数量,并要求每组用户使用各自的HiveServer2。

容器复用和预热容器

容器复用

这是一个优化,可以减少容器的启动时间影响。通过设置 tez.am.container.reuse.enabled 为true来启用此功能。这节省了与YARN交互的时间。还可以保持容器组活跃,快速旋转容器,并跳过YARN队列。

预热容器

容器数量与将附加到每个Tez AM的YARN执行容器数量相关。即使Tez AM空闲(未执行查询),每个AM也会保留相同数量的容器。在某些情况下,这可能会导致太多容器空闲且未释放,因为这里定义的容器将被Tez AM保留,即使它是空闲的。这些空闲容器将继续占用YARN中的资源,其他应用程序可能会利用这些资源。

以下属性用于配置预热容器:

  • hive.prewarm.enabled
  • hive.prewarm.numcontainers

一般Tez调优参数

在处理Tez上Hive查询的性能下降时,审查以下属性作为一级检查。您可能需要根据查询和数据属性设置或调整其中一些属性。最好在开发和QA环境中评估配置属性,然后根据结果将其推送到生产环境。

  • hive.cbo.enable
    将此属性设置为true启用基于成本的优化(CBO)。CBO是Hive查询处理引擎的一部分,由Apache Calcite提供支持。CBO通过检查查询中指定的表和条件生成有效的查询计划,最终减少查询执行时间并提高资源利用率。

  • hive.auto.convert.join
    将此属性设置为true允许Hive根据输入文件大小启用将常见连接转换为mapjoin的优化。

  • hive.auto.convert.join.noconditionaltask.size
    您将希望在查询中尽可能多地执行mapjoin。此大小配置使用户可以控制表的大小以适应内存。该值表示可以转换为适合内存的哈希表的表的大小总和。建议将其设置为 hive.tez.container.size 的1/3。

  • tez.runtime.io.sort.mb
    输出排序时的排序缓冲区大小。建议将其设置为 hive.tez.container.size 的40%,最大值为2 GB。通常不需要超过此最大值。

  • tez.runtime.unordered.output.buffer.size-mb
    当输出不需要排序时的内存。这是缓冲区的大小,如果不直接写入磁盘。建议将其设置为 hive.tez.container.size 的10%。

  • hive.exec.parallel
    此属性启用Hive查询阶段的并行执行。默认情况下,此属性设置为false。将此属性设置为true有助于并行化独立的查询阶段,从而整体提高性能。

  • hive.vectorized.execution.enabled
    矢量化查询执行是Hive的一个功能,它大大减少了典型查询操作(如扫描、过滤、聚合和连接)的CPU使用量。默认情况下,此属性设置为false。将其设置为true。

  • hive.merge.tezfiles
    默认情况下,此属性设置为false。将此属性设置为true会合并Tez文件。使用此属性可能会根据数据大小或要合并的文件数量增加或减少查询的执行时间。在使用此属性之前,请在较低环境中评估查询性能。

  • hive.merge.size.per.task
    此属性描述作业结束时合并文件的大小。

  • hive.merge.smallfiles.avgsize
    当作业的平均输出文件大小小于此数字时,Hive将启动一个额外的map-reduce作业将输出文件合并为更大的文件。默认情况下,此属性设置为16 MB。

文章来源:Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang中的corn

引包 "github.com/robfig/cron/v3"使用 taskCron : cron.New(cron.WithSeconds()) _, err : taskCron.AddFunc("* * * * * *", func() {doing.work})每一个*的含义 秒(Seconds) 是 0–59 * / , - 分(Minutes&#xff…

HTML播放flv

页面效果&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

森林火灾扑救特类车辆有哪些_鼎跃安全

森林消防是在森林火灾发生时&#xff0c;为了保护森林资源&#xff0c;防止火势蔓延&#xff0c;采取了一系列的应用措施&#xff0c;针对自然环境中的火灾消防工作。森林灭火主要包括预警、预防措施、火情监测、火势控制和灭火等&#xff0c;森林火灾发生的地形往往复杂崎岖&a…

如何判断自己遇到的攻击是SQL注入攻击

要判断自己遇到的攻击是否是SQL注入攻击&#xff0c;可以从以下几个方面进行观察和分析&#xff1a; 攻击方式识别&#xff1a; 观察输入字段&#xff1a;如果攻击者在输入字段&#xff08;如用户名、密码框&#xff09;中输入了非正常的字符或语句&#xff0c;特别是与SQL语法…

【银河麒麟】高可用触发服务器异常重启,处理机制详解

1.服务器环境以及配置 【机型】物理机 处理器&#xff1a; Intel 内存&#xff1a; 126G 【内核版本】 4.19.90-25.16.v2101.ky10.x86_64 【银河麒麟操作系统镜像版本】 Kylin-Server-10-SP2-Release-Shenzhen-Metro-x86-Build01-20220619 Kylin-HA-10-SP2-Release-S…

NGINX_七 nginx 高级应用

七 nginx 高级应用 1 使用alias实现虚拟目录 location /test { # /var/www/qianfeng/index.htmlalias /var/www/qianfeng/;index index.html; }location /test { #/var/www/qianfeng/test/index.htmlroot /var/www/qianfeng/;index index.html; }2 通过 stub_status 模…

yolov10打包为exe

一、前言 本节实验将官方yolov10推理程序打包为exe运行 二、代码 首先下载官方代码至本机&#xff0c;并使用conda创建虚拟环境&#xff0c;并安装好yolov10所需库 conda create --prefix E:/pyenv/myYolo10 python3.8 pip install -r requirements.txt 下载官方模型权重 …

深入理解和实现Windows进程间通信(消息队列)

常见的进程间通信方法 常见的进程间通信方法有&#xff1a; 管道&#xff08;Pipe&#xff09;消息队列共享内存信号量套接字 下面&#xff0c;我们将详细介绍消息队列的原理以及具体实现。 什么是消息队列&#xff1f; Windows操作系统使用消息机制来促进应用程序与操作系…

Git 查看当前分支是基于哪个分支拉取(源头分支)

场景&#xff1a; 项目中使用 Git 管理代码仓库的时候&#xff0c;随着项目的持续迭代及项目的扩展&#xff0c;多版本并行开发是非常常见的事情&#xff0c;多版本并行开发就伴随着多分支&#xff0c;随着 Git 的分支越拉越多&#xff0c;这时候很容易造成分支的混乱&#xf…

AI学习指南机器学习篇-朴素贝叶斯分类器

AI学习指南机器学习篇-朴素贝叶斯分类器 1. 介绍 在机器学习中&#xff0c;朴素贝叶斯分类器是一种简单而有效的分类算法。它基于贝叶斯定理和特征条件独立性假设&#xff0c;可以被用来解决多种分类问题。本篇博客将深入探讨朴素贝叶斯分类器的基本原理&#xff0c;包括如何…

【TensorFlow深度学习】量化压缩技术在降低模型体积中的应用

量化压缩技术在降低模型体积中的应用 量化压缩技术在降低模型体积中的应用1. 引言2. 量化压缩基础3. 实战:使用TensorFlow Lite进行模型量化4. 评估量化效果5. 结果分析与优化建议6. 结语量化压缩技术在降低模型体积中的应用 在深度学习领域,模型的体积和推理速度成为了实际…

蓝牙模块在车载系统中的应用与集成:现状、挑战与未来展望

随着科技的快速发展&#xff0c;蓝牙技术已经深入到我们生活的方方面面&#xff0c;其中车载系统中的应用尤为显著。蓝牙模块作为一种无线通信技术&#xff0c;不仅为驾驶者提供了更加便捷的操作体验&#xff0c;同时也提升了驾驶的安全性。本文旨在分析蓝牙模块在车载系统中的…

selenium框架学习

概念 WEB自动化框架 三大组件: selenium IDE 浏览器插件,实现脚本录制WebDriver 实现对浏览器的各种操作(API包)Grid 实现同时对多个用例进行执行,用例在多个浏览器同步执行环境搭建 1、安装selenium: pip install selenium2、安装浏览器 3、安装浏览器驱动(对应的驱…

FFmpeg源码:ff_h2645_extract_rbsp函数分析

一、ff_h2645_extract_rbsp函数的声明 ff_h2645_extract_rbsp函数的声明放在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为5.0.3&#xff0c;该ffmpeg在CentOS 7.5上通过10.2.1版本的gcc编译&#xff09;的头文件libavcodec/h2645_parse.h中。 /*** Extract the raw (u…

东郊到家类型小程序APP软件基于SpringBoot开发的系统源码

项目背景 在快节奏的现代生活中&#xff0c;人们越来越追求高效、便捷的生活方式。上门服务作为一种新型的服务模式&#xff0c;正逐渐受到广大用户的青睐。而这一切的背后&#xff0c;离不开技术的强大支撑。今天&#xff0c;我们就来探讨一下上门服务类型软件的技术魅力&…

常用的基于WebGL的三维WebGIS框架

1. Three.js Three.js 是一款运行在浏览器中的3D引擎&#xff0c;官方地址为https://threejs.org/&#xff0c;你可以用它创建各种三维场景&#xff0c;包括摄影机、光影、材质等各种对象。 2. Babylon.js Babylon.js是一个JavaScript开源框架&#xff0c;基于WebGL和TypeSc…

React Native性能优化红宝书

一、React Native介绍 React Native 是Facebook在React.js Conf2015 推出的开源框架&#xff0c;使用React和应用平台的原生功能来构建 Android 和 iOS 应用。通过 React Native&#xff0c;可以使用 JavaScript 来访问移动平台的 API&#xff0c;使用 React 组件来描述 UI 的…

WebHttpServletRequestResponse(完整知识点汇总)

额外知识点 Web核心 Web 全球广域网&#xff0c;也成为万维网&#xff08;www&#xff09;&#xff0c;可通过浏览器访问的网站 JavaWeb 使用Java技术来解决相关Web互联网领域的技术栈 JavaWeb技术栈 B/S架构&#xff1a;Browser/Server&#xff0c;即浏览器/服务器 架构模式…

ROS2 概念以及通信方式

一、ros2的相关概念 ROS 2&#xff08;Robot Operating System 2&#xff09;是一个用于机器人开发的开源平台&#xff0c;它提供了一系列工具和库&#xff0c;用于构建机器人应用程序。相较于前身ROS&#xff08;ROS 1&#xff09;&#xff0c;ROS 2在设计上考虑了更多的实时…

IT入门知识第六部分《后端开发》(6/10)

目录 后端开发&#xff1a;构建强大的服务端逻辑 1.引言 2.后端技术概述 2.1 数据库 2.2 服务器 2.3 API 2.4 安全性 3.服务器和API 3.1 服务器的作用 3.2 API的作用 4.后端框架 4.1 Node.js 4.1.1 特点 4.1.2 用途 4.1.3 代码案例分析 4.2 Django 4.2.1 特点 …