最常用的HQL的参数优化问题

本文详细介绍了如何通过选择合适的文件格式、压缩方式、分区策略、JOIN优化、向量化查询、配置调整以及硬件和集群优化来提升HiveQL查询的性能和存储效率。还强调了监控和调试的重要性,以防乱用导致性能下降。
摘要由CSDN通过智能技术生成
  1. 优化HiveQL查询:

    • 使用合适的文件格式(如ORC、Parquet)可以显著减少存储空间需求,并提高查询效率。
    • 选择合适的压缩方式(如Snappy、GZIP),减少数据在磁盘和网络中的传输时间。
    • 利用分区和分桶来减少查询需要扫描的数据量。
    • 使用合适的JOIN类型和策略,尽量避免笛卡尔积。
    • 使用Vectorization(向量化查询)来提高查询性能。
    • 适当地使用物化视图来加速频繁的和复杂的查询。
  2. 优化数据存储:

    • 根据查询模式,合理设计表的分区和分桶策略。
    • 定期执行数据压缩和数据格式转换(如将文本文件转换为ORC或Parquet格式)。
    • 对于频繁查询的列,可以考虑列式存储。
  3. 优化Hive配置:

    • 调整Hive配置参数,如增加内存分配、调整执行引擎(使用Tez或Spark替代MapReduce)。
    • 根据集群资源,合理设置MapReduce作业的参数(如map和reduce任务的数量、内存使用限制等)。
  4. 利用缓存:

    • 利用Hive的LLAP(Live Long and Process)功能,对热数据进行内存缓存,加速查询响应。
  5. 监控和调试:

    • 使用EXPLAIN命令查看查询执行计划,找出性能瓶颈。
    • 监控Hive执行的MapReduce作业,分析任务执行的时间和资源消耗,进一步调优。
  6. 硬件和集群优化:

    • 根据需要扩展或优化硬件资源(如增加内存、使用更快的存储)。
    • 在集群管理工具(如Ambari或Cloudera Manager)中调整资源分配和任务调度策略。

--设置Hive的执行引擎。推荐使用tezspark来代替默认的mr(MapReduce),因为它们可以提供更好的性能。

   set hive.execution.engine: 推荐使用ORCParquet

--设置是否压缩Hive写入的数据。将此设置为true可以节省存储空间并减少写入时间。                              set hive.exec.compress.output:true;

--设置MapReduce作业的输出是否压缩。

   set mapreduce.output.fileoutputformat.compress=true;

--设置为true以启用查询的向量化执行,可以显著提高性能。

   set hive.vectorized.execution.enabledhive.vectorized.execution.reduce.enabled

--设置为true以启用表达式求值的缓存,可以减少重复计算。

   set hive.cache.expr.evaluationtrue=true;

--设置为true以启用查询执行的并行处理。

   set hive.exec.parallel=true;

--设置动态分区模式,nonstrict模式允许不指定所有的分区列值。        

   set hive.exec.dynamic.partition.mode=true;

--增加map个数

        set mapred.map.tasks=5;(最好还是调整split.size,更适配数据量)

        set mapred.min.split.size=300000000;(默认块大小128M)

-- 增大reduce个数

        set hive.exec.reducers.bytes.per.reducer=64000000;(设置好每个reducer处理数据量,自动适配reduce的个数)

-- 设置输出文件大小

        set hive.merge.size.per.task=64000000;

矢量化查询优化

set hive.vectorized.execution.enabled = false;

一些情况下使用矢量优化会拖慢性能,默认关闭,vectorized优化支持的函数连接符等如下

arithmetic: +, -, *, /, %
AND, OR, NOT
comparisons <, >, <=, >=, =, !=, BETWEEN, IN ( list-of-constants ) as filters
Boolean-valued expressions (non-filters) using AND, OR, NOT, <, >, <=, >=, =, !=
IS [NOT] NULL
all math functions (SIN, LOG, etc.)
string functions SUBSTR, CONCAT, TRIM, LTRIM, RTRIM, LOWER, UPPER, LENGTH
type casts
Hive user-defined functions, including standard and generic UDFs
date functions (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, UNIX_TIMESTAMP)
the IF conditional expression

官网:https://cwiki.apache.org/confluence/display/Hive/Vectorized+Query+Execution

这里解释也比较详尽:乱用Hive调优,你的任务越调优越慢 - 哔哩哔哩 (bilibili.com)

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HQL(Hibernate Query Language)是 Hibernate 框架中用于查询数据库的一种语言,它类似于 SQL,但更加面向对象。 HQL 语句的执行过程如下: 1. 创建 SessionFactory 首先,需要创建一个 SessionFactory 对象。SessionFactory 是 Hibernate 中的一个重要概念,它负责创建 Session 对象,代表着与数据库的一次会话。 2. 创建 Session 使用 SessionFactory 创建一个 Session 对象。Session 是 Hibernate 中的核心对象,用于执行数据库操作。 3. 开启事务 使用 Session 开启一个事务。Hibernate 中的每个数据库操作都应该在一个事务中执行,以保证数据的完整性和一致性。 4. 创建 Query 对象 使用 Session 创建一个 Query 对象,它表示一个 HQL 查询语句。 5. 设置查询参数 如果 HQL 查询语句包含参数,需要使用 Query 对象的 setParameter 方法来设置参数的值。 6. 执行查询 调用 Query 对象的 list 或 uniqueResult 方法执行查询。list 方法返回一个 List 对象,包含了查询结果的所有对象;uniqueResult 方法返回一个单一对象,如果查询结果为空或多于一个,则抛出异常。 7. 提交事务 如果查询操作不需要修改数据库中的数据,则直接提交事务。如果需要修改数据库中的数据,则需要在事务中执行相应的操作,然后再提交事务。 8. 关闭 Session 最后,关闭 Session 对象,释放资源。 需要注意的是,HQL 语句的执行过程会涉及到多个层面的性能优化,包括缓存、延迟加载、批量操作等。这些优化策略可以提高查询效率,减少数据库的访问次数,从而提升应用程序的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值