当前位置: 首页 > news >正文

Hive之任务优化

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.mrgr.cn/news/33883.html

相关文章:

  • #Swift Automatic Initializer Inheritance
  • 使用 PyTorch 实现 AlexNet 进行 MNIST 图像分类
  • 关于 3D Engine Design for Virtual Globes(三维数字地球引擎设计)
  • 【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看
  • C#实现在windows上实现指定句柄窗口的指定窗口坐标点击鼠标左键和右键的详细情况
  • 低代码、配置式web组态软件
  • 【Android】 IconFont的使用
  • 【ShuQiHere】 掌握卡诺图 (Karnaugh Map)——简化布尔表达式的利器
  • 01_两数之和
  • 情指行一体化平台建设方案和必要性-———未来之窗行业应用跨平台架构
  • 数字范围按位与
  • Hadoop入门两道面试题
  • AI教你学Python 第17天 :小项目联系人管理系统
  • 【漏洞复现】用友 NC-Cloud queryStaffByName Sql注入漏洞
  • 计算机毕业设计PySpark+Scrapy农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop
  • 【MySQL】获取最近7天和最近14天的订单数量,使用MySQL详细写出,使用不同的方法
  • 伊丽莎白·赫莉为杂志拍摄一组素颜写真,庆祝自己荣膺全球最性感女人第一名
  • 原子结构与电荷
  • 【Linux 21】线程安全
  • 【最快最简单的排序 —— 桶排序算法】
  • wgan 生成器 光是用噪声生成数据 还是噪声加输入数据
  • 自己开发了一个电脑上滚动背单词的软件
  • 用友ncc 如何解决 组件参照无显示问题
  • 速盾:高防cdn防御的时候会封ip吗?
  • Java 基本数据类型
  • 开启争对目标检测的100类数据集-信息收集