在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查询的指南

Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南的更多相关文章

  1. Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

    HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...

  2. 【大数据面试】【框架】Hive:架构、计算引擎、比较、内外部表、by、函数、优化、数据倾斜、动静态分区

    一.组成 1.架构 源数据原本是存在dubby数据库,存在MySQL可以支持多个客户端 客户端.数据存储(HDFS).MR计算引擎 2.计算引擎的选择 MR引擎:基于磁盘,计算时间长,但一定能算出结果 ...

  3. hive的查询注意事项以及优化总结 .

    Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具.使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别, 所以需要去掉原有关系型数 ...

  4. hive引擎的选择:tez和spark

    背景 mr引擎在hive 2中将被弃用.官方推荐使用tez或spark等引擎. 选择 tez 使用有向无环图.内存式计算. spark 可以同时作为批式和流式的处理引擎,减少学习成本. 问题& ...

  5. Hive 利用 on tez 引擎 合并小文件

    Hive 利用 on tez 引擎 合并小文件 标签(空格分隔): Hive \[f(N) + \sum_{i=2}^N f(N-i+1)*X_i\] SET hive.exec.dynamic.pa ...

  6. 【Hive】概念、安装、数据类型、DDL、DML操作、查询操作、函数、压缩存储、分区分桶、实战Top-N、调优(fetch抓取)、执行计划

    一.概念 1.介绍 基于Hadoop的数据仓库工具,将结构化数据映射为一张表,可以通过类SQL方式查询 本质:将HQL转换成MapReduce程序 Hive中具有HQL对应的MapReduce模板 存 ...

  7. 数据库系列:MySQL慢查询分析和性能优化

    1 背景 我们的业务服务随着功能规模扩大,用户量扩增,流量的不断的增长,经常会遇到一个问题,就是数据存储服务响应变慢. 导致数据库服务变慢的诱因很多,而RD最重要的工作之一就是找到问题并解决问题. 下 ...

  8. Galera集群server.cnf参数调整--Innodb存储引擎内存相关参数(一)

    在innodb引擎中,内存的组成主要有三部分:缓冲池(buffer pool),重做日志缓存(redo log buffer),额外的内存池(additional memory pool).

  9. (转) mysql数据库引擎:MyISAM和InnoDB(性能优化)

    转自 http://yuwensan126.iteye.com/blog/1138022 Mysql 数据库中,最常用的两种引擎是innordb和myisam.Innordb的功能要比myiasm强大 ...

  10. mysql优化 | 存储引擎,建表,索引,sql的优化建议

    个人对于选择存储引擎,建表,建索引,sql优化的一些总结,给读者提供一些参考意见 推荐访问我的个人网站,排版更好看: https://chenmingyu.top/mysql-optimize/ 存储 ...

随机推荐

  1. WPF 从零自己实现从 RealTimeStylus 获取触摸信息

    本文将告诉大家什么是 RealTimeStylus 以及如何从零开始不使用 WPF 框架提供的功能从 RealTimeStylus 获取到触摸信息 开始之前先复习一下 Windows 的触摸演进.在上 ...

  2. WPF 修复 ContextMenu 在开启 PerMonitorV2 后所用 DPI 错误

    本文告诉大家如何修复 WPF 的 ContextMenu 在开启 PerMonitorV2 之后,在双屏不同的 DPI 的设备上,在副屏弹出的 ContextMenu 使用了主屏的 DPI 导致缩放错 ...

  3. 通过 KoP 将 Kafka 应用迁移到 Pulsar

    通过 KoP 将 Kafka 应用迁移到 Pulsar 版权声明:原文出自 https://github.com/streamnative/kop ,由 Redisant 进行整理和翻译 目录 通过 ...

  4. 5.k8s Service四层负载:服务端口暴露

    题目一:暴露服务service 设置配置环境: [candidate@node-1] $ kubectl config use-context k8s Task 请重新配置现有的 deployment ...

  5. GitLab 升级迁移待办清单

    GitLab 大版本升级测试用例 项目 从模板项目 URL 导入,来创建新的项目 议题 通过 Quick Actions.关联新建.直接新建 模板 关联项 标签 工时 评论 看板 里程碑 分支 通过 ...

  6. vue-苟曰的老板不发工资230行原创js代码写个扫雷小游戏

    上gif: 1.开局提示动画 2.游戏中状态提示 3.开挂模式提示 4.计时器 5.游戏模式扫雷成功,蓝色进度条表示当次扫雷的完成度 6.若当次时间小于最佳记录,则更新最佳记录,如果最佳记录小于设置的 ...

  7. Linux 环境下安装redis

    目录 方法一 编辑安装 1.官网找到下载地址: 2.到目录下载redis安装包 3.下载后解压 4.安装工具 tcl (可以跳过) 5.编译安装 6.修改配置文件 7. 客户端连接 8.配置环境变量 ...

  8. MySQL优化方向

    MySQL优化手段 数据库设计层面 范式设计 减少数据冗余 提高数据一致性 索引策略 选择合适的索引类型 (BTREE, HASH) 覆盖索引 索引选择性 表结构优化 使用合适的数据类型 避免使用NU ...

  9. C语言:将txt文件的单词导入链表&&删除链表重复单词

    文章目录 前言 主要分为两个实现部分,按个人需求浏览 首先明确几个任务 先过一遍如何操作的流程. ①全局变量和结构体代码部分 ②实现:将文件单词导入链表 a: 寻找txt文件中最长单词的函数 b: 导 ...

  10. 用pageOffice控件实现 office 文档在线编辑Word插入另外word文档的功能

    OA办公中,业务需要编辑word文档,需要插入另外word文档的功能. 怎么实现编辑word文档插入另外word文档呢? 2 实现方法 通过pageOffice实现简单的在线打开编辑word时, 通过 ...