Hive之任务优化

embedded/2024/9/23 7:36:36/

Hive 是一个基于 Hadoop 的数据仓库工具,提供了 SQL-like 的查询语言来分析存储在 HDFS(Hadoop Distributed File System)上的大规模数据集。为了提高查询性能,Hive 提供了多种优化方法,涵盖不同层次的改进,从 SQL 查询层到执行层。

Hive介绍请参考 数据仓库之Hive-CSDN博客

1. 分区优化

Hive 表可以按列进行分区,使得数据根据分区列存储。查询时,可以通过分区列直接读取特定分区数据,避免扫描整个表,提高查询效率。

  • 静态分区:在表创建时,预定义固定的分区列。
  • 动态分区:根据查询中的列动态生成分区,在数据导入或插入时进行分区操作。
优化建议:
  • 减少分区数量:分区太多会导致小文件过多,影响性能。可以通过合并分区来减少这种情况。
  • 避免在分区列上进行复杂计算:查询时应尽量直接使用分区列条件,而不要在分区列上进行复杂计算,如函数或表达式计算。

2. Bucketing(分桶)

Bucketing 是将表的数据进一步划分为多个桶(bucket)。每个桶内的数据按照某个哈希函数分布,从而在 Join 和 Group By 操作时可以减少数据扫描和排序的开销。

  • 适用于 Join 优化:分桶表上的 Join 操作可以将数据划分为更小的子集进行操作,提高 Join 的性能。
  • 适用于 Group By 优化:桶内数据在写入时已经部分排序,因此在进行 Group By 时可以减少排序和数据重分配的开销。
优化建议:
  • 使用分桶的前提是数据规模较大,且 Join 或 Group By 操作较频繁。
  • 确保 set hive.enforce.bucketing=true 在查询时生效,启用 Hive 的分桶强制执行。

3. 文件格式优化

Hive 支持多种存储文件格式,不同的文件格式对性能有不同的影响。

  • ORC(Optimized Row Columnar):高效的列式存储格式,支持压缩、跳过无关数据等功能,适合读操作多的场景。
  • Parquet:也是一种列式存储格式,类似 ORC,适用于大规模数据分析和查询场景。
  • Avro:适合存储和序列化具有动态架构的数据,但在性能方面不如 ORC 和 Parquet。
优化建议:
  • 对于读操作较多的场景,推荐使用 ORC 或 Parquet 格式。
  • 通过 set hive.exec.compress.output=trueset hive.exec.orc.default.compress=SNAPPY 来启用 ORC 文件的压缩。

4. MapReduce 任务优化

Hive 默认依赖 MapReduce 来执行查询任务。通过优化 MapReduce 任务的数量和数据处理逻辑,可以显著提高查询性能。

  • MapJoin 优化:在 Join 操作时,如果某个表较小,可以将其加载到内存中进行 MapJoin,而不再通过 Shuffle 操作进行 Join。MapJoin 可以大幅减少 Shuffle 阶段的数据量和 I/O 开销。

    启用 MapJoin 优化的参数:

    set hive.auto.convert.join=true;
    set hive.mapjoin.smalltable.filesize=25000000;
    
  • 本地模式执行:对于较小的数据集,可以通过本地模式来执行 MapReduce,避免资源调度的开销。

    启用本地模式的参数:

    set hive.exec.mode.local.auto=true;
    set hive.exec.mode.local.auto.inputbytes.max=50000000;
    set hive.exec.mode.local.auto.tasks.max=4;
    

5. CBO(成本优化器,Cost-Based Optimizer)

CBO 是 Hive 的一种基于成本的查询优化器,它会根据查询的实际执行代价选择最优的执行计划。

  • CBO 依赖统计信息来评估表大小、列值分布等,因此需要提前收集表的统计信息。
  • CBO 可以优化 Join 操作顺序、选择适当的 Join 算法(如 Broadcast Join、Sort-Merge Join 等)。
优化建议:
  • 启用 CBO 优化的参数:

    set hive.cbo.enable=true;
    set hive.compute.query.using.stats=true;
    set hive.stats.fetch.column.stats=true;
    set hive.stats.fetch.partition.stats=true;
    
  • 使用 ANALYZE TABLE 命令收集表和分区的统计信息:

    ANALYZE TABLE table_name COMPUTE STATISTICS;
    ANALYZE TABLE table_name PARTITION (partition_name) COMPUTE STATISTICS;
    

6. 并行执行(Parallel Execution)

Hive 支持并行执行多个 MapReduce 任务,可以利用集群的多核资源提高查询执行速度。

  • 并行执行可以并发启动多个不同的 Stage,避免串行执行带来的等待时间。
优化建议:
  • 启用并行执行的参数:
    set hive.exec.parallel=true;
    set hive.exec.parallel.thread.number=16;
    

7. 内存管理和堆大小

Hive 任务的执行受限于内存的使用情况,尤其是在数据 Shuffle 和 Join 阶段。

  • 设置合适的堆大小:确保 MapReduce 任务有足够的内存来执行复杂查询,可以通过设置 JVM 堆大小参数来调优。
优化建议:
  • 使用合适的内存参数设置:
    set mapreduce.map.memory.mb=4096;
    set mapreduce.reduce.memory.mb=8192;
    set mapreduce.map.java.opts=-Xmx3072m;
    set mapreduce.reduce.java.opts=-Xmx6144m;
    

8. 数据倾斜(Data Skew)处理

在 Join 或 Group By 操作时,某些键的值可能会占据较大的数据比例,导致某些任务的负载远高于其他任务,产生数据倾斜问题。

  • Skew Join 优化:对于数据倾斜的 Join 操作,Hive 提供了 Skew Join 优化,能够将数据倾斜的键单独处理,避免任务过载。
优化建议:
  • 启用 Skew Join 的参数:
    set hive.optimize.skewjoin=true;
    

9. SQL Query 优化

编写高效的 SQL 查询可以显著提高 Hive 查询性能。

  • *避免使用 SELECT 查询时尽量只选择需要的列,减少不必要的数据传输。
  • 合理使用索引:在适当的列上创建索引可以加速查询。
  • 避免笛卡尔积:确保 Join 操作有合适的连接条件,避免产生笛卡尔积。

10. 其他优化技术

  • Tez 引擎:Tez 是 MapReduce 的增强替代方案,可以通过 DAG(有向无环图)来减少 I/O 操作,提高查询性能。
  • LLAP(Long-Lived Process):LLAP 是一种查询加速机制,可以减少查询的延迟并提高并发性,适用于频繁查询的场景。

通过应用上述优化方法,Hive 查询的执行性能可以得到显著提升。


http://www.ppmy.cn/embedded/115478.html

相关文章

软件测试技术之 GPU 单元测试是什么!

1 背景 测试是开发的一个非常重要的方面,可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题,但较差的测试往往总是导致故障和停机。 单元测试用于测试各个代码组件,并确保代码按照预期的方式工作。单…

证书学习(五)Java实现RSA、SM2证书颁发

目录 一、知识回顾1.1 X.509 证书1.2 X509Certificate 类二、代码实现2.1 Maven 依赖2.2 RSA 证书颁发1)PfxGenerateUtil 证书文件生成工具类2)CertDTO 证书中间类3)RSACertGenerateTest RSA证书生成测试类4)执行结果2.3 SM2 证书颁发1)SM2Utils 国密SM2算法工具类2)SM2C…

k8s的一些命令

kubectl get nodes :查看节点的状态 查看Pod的状态: kubectl get pod --all -namespacesPending,ContainerCreating,ImagePullBackOff都表明Pod没有就绪,Running才是就绪状态 查看Pod的具体情况: kubectl describe pod podnamek…

PDF转图片的思路思考

记录时间:2022年9月1日 PDF转图片库的使用和扩展 python有几个开源的免费的处理Pdf的库,甚至有的已经有很完善的功能了。我发挥一下自己的所学,看看能不能把它变为可用的一程序。 首先是了解PDF处理库PyMupdf,这个库得到路径之后普就可以对…

Vulkan 学习(8)---- vkImageView 创建

目录 OverView创建方法关键结构参考代码 OverView Vulkan 的图像视图(VkImageView) 用于描述如何访问 VkImage 对象以及访问图像的哪一部分, 图像视图定义了图像格式和访问方式,允许渲染管线和图像进行交互,无论是作为纹理,颜色附件或者深度…

Elastic 的 OpenTelemetry PHP 发行版简介

作者:Pawel Filipczak 宣布 OpenTelemetry PHP 的 Elastic 发行版的第一个 alpha 版本。在本篇博文中了解使用 OpenTelemetry 来检测 PHP 应用程序是多么简单。 我们很高兴推出 OpenTelemetry PHP 的 Elastic Distribution 的第一个 alpha 版本。在这篇文章中&…

洪涝洪水滑坡灾害数据集 灾害 2300张 带标注 voc yolo

洪涝洪水滑坡灾害数据集 灾害 2300张 带标注 voc yolo 洪涝洪水滑坡灾害数据集 数据集描述 该数据集是一个专门用于检测和识别洪涝、洪水和滑坡等自然灾害的数据集,旨在帮助研究人员和开发者训练和评估基于深度学习的目标检测模型。数据集涵盖了两种常见的自然灾害…

【AI创作组】Matlab绘图基础之plot函数

1. plot函数语法 1.1 基本语法 Matlab中的plot函数是最常用的绘图函数之一,其基本语法如下: plot(X,Y)X和Y可以是向量或矩阵,也可以是两个向量的元素个数相同的数组。当X和Y都是向量时,plot函数将在当前坐标轴上绘制Y对X的图。1.2 线型、颜色和标记 plot函数还允许用户…