您确定您的 Hive 查询正在以最佳状态执行吗?你可能会感到惊讶。 Apache Hive 是当今许多大型企业环境中使用最普遍的查询引擎,但这并不意味着它可以自动优化工作。为了充分利用引擎并实现 Hive 查询优化,调整其性能非常重要。但在深入探讨之前,让我们介绍一下 Hive 性能调优的基础知识。
什么是 Hive 性能调优? Hive 性能调优是指旨在改进和加速 Hive 环境性能的集体流程和步骤。当查询未优化时,简单语句的执行时间会更长,从而导致性能滞后和停机。
如何优化 Hive 查询?性能调优是优化 Hive 查询的关键。首先,通过分区、分桶、压缩等调整数据。改进 Hive 查询的执行是另一种 Hive 查询优化技术。您可以通过使用 Tez、避免偏斜和增加并行执行来做到这一点。最后,抽样和单元测试可以帮助您首先查看(并解决)较小规模的问题,从而帮助优化查询。
虽然我们现在了解它的重要性,但调整 Hive 环境以获得最佳性能可能会很棘手。知道如何分析 Hive 查询性能是成功的必要条件。但是 Hive 性能调优最佳实践是什么?开发人员和运维团队可以做些什么来确保最佳的 Hive 查询性能?
如何提高我的 Hive 性能?大多数用户和开发人员都是从调整他们的数据开始的。使用分区、分桶、压缩、避免小文件等都是很棒的 Hive 查询优化技术。
1、分桶
Bucketing 类似于分区,是一种 Hive 查询调优策略,允许您以数据子集为目标。在这种情况下,专门通过扫描更少的数据来提高连接性能。由于需要输入、输出或存储在内存中的数据更少,因此这改进了跨时间和效率向量的查询。
Hive 中的分桶需要将表数据集分解为更小的部分。因此,数据更容易处理。使用分桶,您可以连接相似的数据类型并将它们写入单个文件。此处的此步骤大大提高了连接表或读取数据时的性能。这就是带分区的分桶在 Hive 用户中如此受欢迎的原因。
2、压缩
压缩被列为最好的 Hive 查询优化技术之一。大数据压缩减少了处理大型数据集所需的带宽和存储量。此外,压缩从您的系统中消除了冗余和不重要的部分。
查询操作的每一位数据都有与从磁盘获取数据、进入内存、内存不足以及返回磁盘或另一个最终目标相关的 I/O。压缩最大限度地减少了遍历每个步骤的数据量,并减少了在查询状态中移动所花费的时间。
3、避免小文件
从查询中消除小文件操作是一种有效的 Hive 性能调优策略。这样做可以促进健康的 Hive 生态系统。每个文件都由 Hive Metastore 跟踪并存储在 HDFS 中,每个文件都经过性能优化以处理较大的文件而不是许多较小的文件。查询性能受限于整个系统和平台的健康状况。
4、反规范化数据
如果您想消除在运行时从多个表连接数据的需要,Hive 专家建议将数据反规范化作为一种首选的 Hive 性能调整方法。通过向一个或多个表添加冗余数据来执行反规范化。这可以帮助我们避免在关系数据库中进行代价高昂的连接。
虽然规范化很有用,但除了从操作中完全消除不需要的数据之外,避免连接是您可以对给定查询做出的最有影响力的更改之一。
5、表设计
Hive 表不同于大多数数据专业人员所习惯的传统数据库表。它们本质上是子目录。增加分区数量以促进高效读取和并行性是针对这种情况的最有效的 Hive 优化技术之一。然而,这个解决方案并不过分。分区过多会降低 Metastore 和 Hive 服务器的性能。跟踪和基线性能是了解分区数量何时从有益变为有害的最佳方式。
6、简单连接通常更好
有很多策略旨在提高连接的效率。 SMB 连接、映射连接、流表——每一个都旨在消除连接的复杂性或阶段。嵌套连接的执行成本也很高。由于连接的成本很高,因此正在做很多工作来提高连接性能。
7、输入文件格式选择
输入格式选择在 Hive 查询调优中很重要。例如,在处理生成大量数据的大规模生产系统时,JSON 不是理想的格式选择。这是因为 JSON 和类似的格式类型实际上占用了大量空间以及一些解析开销。
Apache Hive 利用 RCFile 和 ORC 等列式输入格式来解决此类问题。列格式使您能够单独访问每一列,从而减少分析查询中的读取操作。
8、使用 Tez(或更好的东西)
Apache Tez 是一个构建在 Apache Hadoop 2.0 (Yarn) 之上的框架,旨在加速 Hive 的查询执行。 Tez 帮助用户启动和持有一个或多个容器,这些容器可以重复使用以执行多个查询。它还可以帮助用户避免多次磁盘 IO 并减少启动 JVM 的开销。
执行引擎显然是开发人员关注的焦点,因为我们看到 Tez、LLAP 和 Hive on Spark 等框架希望以无需低级调优即可提高性能的方式添加到核心 Hive。理解和利用手头任务的最佳执行引擎应该是 Hive 性能调整的强制性考虑因素。
9、避免倾斜
Hive 查询部署一组分布式任务。整体查询仅与最慢的任务一样快。确保在任务之间均匀分配工作是一种有效的 Hive 性能调整方法。这是因为在某些任务中,它通过处理比必要的更多数据来防止查询本身变慢。
10、增加并行执行
默认情况下,Hive 只会在给定时间执行一个阶段。然而,一个特定的工作可能包含多个阶段,这些阶段可能并不完全相互依赖。并行执行这些非相互依赖的阶段,而不是在一个实例中运行单个阶段,可以大大减少整个作业的运行时间。
并行执行是最好的 Hive 优化技术之一,但只有在不需要顺序操作时才应利用它。并行度的数量取决于资源的可用性和数据的结构。这是另一个领域,如果没有良好的性能解决方案,“正确”的数字可能很难得出。
11、抽样/单元测试是一个很大的帮助
抽样和单元测试就是在你去操作一百万行之前获取你的数据的一个子集并运行一千行。这种特定的 Hive 查询调优最佳实践可帮助您了解您的代码如何工作,以便在您将大数据集投入其中之前获得所需的结果。这并非万无一失,但在小范围内解决失败或奇怪的结果比在规模上这样做更快、更有效。
12、分区
分区是一种常见的 Hive 查询调优策略,它根据键将表数据放置在表位置的单独子目录中。分区键提供了一个机会来定位表数据的一个子集,而不是扫描您的操作不需要的数据。
无论存在多少数据,当你有分区时,Hive 只读取特定数量的数据来生成结果。这极大地提高了性能,即使您执行复杂的分析查询也是如此。这是因为 Hive 只需从子句中指定的几个分区读取数据。它已经在启动查询执行之前过滤掉所需的数据。