HiveSql调优系列之Hive严格模式,如何合理使用Hive严格模式「建议收藏」

HiveSql调优系列之Hive严格模式,如何合理使用Hive严格模式「建议收藏」所谓Hive的严格模式,就是为了避免用户提交一些恶意SQL,消耗大量资源进而使得运行环境崩溃做出的一些安全性的限制。

HiveSql调优系列之Hive严格模式,如何合理使用Hive严格模式

目录
  • 综述
  • 1.严格模式
    • 1.1 参数设置
    • 1.2 查看参数
    • 1.3 严格模式限制内容及对应参数设置
  • 2.实际操作
    • 2.1 分区表查询时必须指定分区
    • 2.2 order by必须指定limit
    • 2.3 限制笛卡尔积
  • 3.搭配使用
    • 3.1 参数
    • 3.2 搭配使用案例

综述

在同样的集群运行环境中,hive调优有两种方式,即参数调优和sql调优

本篇讲涉及到的Hive严格模式。

前两天在优化一个前人遗留下的sql,发现关于严格模式参数是这样使用的,严重错误。

set hive.strict.checks.cartesian.product=flase;
set hive.mapred.mode=nonstrict;

而且我发现在使用参数上,无论sql大小直接贴一堆参数,类似这样。

set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=16;
set hive.merge.mapfiles = true; 
set hive.merge.mapredfiles = true; 
set hive.merge.size.per.task=256000000;
set hive.merge.smallfiles.avgsize = 256000000;
set mapred.max.split.size=1024000000;
set mapred.min.split.size.per.node=1024000000;
set mapred.min.split.size.per.rack=1024000000; 
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.join.emit.interval = 2000;
set hive.mapjoin.size.key = 20000;
set hive.mapjoin.cache.numrows = 20000;
set hive.exec.reducers.bytes.per.reducer=2000000000;
set hive.exec.reducers.max=999;
set hive.map.aggr=true;
set hive.groupby.mapaggr.checkinterval=100000;
set hive.auto.convert.join = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.exec.dynamic.partition = true;
set hive.cli.print.header=true;
set hive.resultset.use.unique.column.names=false;
set mapreduce.reduce.memory.mb=4096;
set mapreduce.reduce.java.opts=-Xmx4096m;
set mapred.max.split.size=1024000000;
set mapred.min.split.size.per.node=1024000000;
set mapred.min.split.size.per.rack=1024000000; 

优化是优化了,但是我看到了优化的无目标性,反而在一定程度上多消耗了计算资源。

于是打算开一个系列文章,Hive SQL调优系列,如何合理的使用参数进行SQL优化,针对什么情况使用哪些参数优化。

本篇先说说严格模式相关参数怎么使用。

正文如下。

1.严格模式

所谓Hive的严格模式,就是为了避免用户提交一些恶意SQL,消耗大量资源进而使得运行环境崩溃做出的一些安全性的限制。

或多或少我们都提交过一些执行很久,集群资源不足的SQL。应该能理解。

前文Hive动态分区详解中有提到过

1.1 参数设置

-- strict 为开启严格模式  nostrict 关闭严格模式
set hive.mapred.mode=strict

1.2 查看参数

通过hive的set 查看指定参数

-- 黑窗口查看Hive模式,以下结果为未开启严格模式
hive> set hive.mapred.mode;
hive.mapred.mode is undefined

1.3 严格模式限制内容及对应参数设置

如果Hive开启严格模式,将会阻止一下三种查询:

a.对分区表查询,where条件中过滤字段没有分区字段;

b.对order by查询,order by的查询不带limit语句。

c.笛卡尔积join查询,join查询语句中不带on条件或者where条件;

以上三种查询情况也有自己单独的参数可以进行控制。

  • 分区表查询必须指定分区
-- 开启限制(默认为 false)
set hive.strict.checks.no.partition.filter=true;
  • orderby排序必须指定limit
-- 开启限制(默认为false)
set hive.strict.checks.orderby.no.limit=true;
  • 限制笛卡尔积运算
-- 开启限制(默认为false)
set hive.strict.checks.cartesian.product=true;

2.实际操作

2.1 分区表查询时必须指定分区

分区表查询必须指定分区的原因:如果该表有大量分区,如果不加限制,在读取时会读取到超出预估的数据量。

-- 测试
create table `lubian` (
`id` string comment "id",
`name` string comment "姓名"
)
comment "lubian" 
PARTITIONED BY (ymd string)
row format delimited fields terminated by "	" lines terminated by "
" 
stored as orc;

set hive.strict.checks.no.partition.filter=true;
select * from lubian limit 111;

执行结果

FAILED: SemanticException [Error 10056]:
    Queries against partitioned tables without a partition filter are disabled for safety reasons.
    If you know what you are doing, please set hive.strict.checks.no.partition.
    filter to false and make sure that hive.mapred.mode is not set to "strict" to proceed.
    Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features.
    No partition predicate for Alias "lubian" Table "lubian"

select * from partab where dt="11" limit 111;
Time taken: 0.77 seconds

2.2 order by必须指定limit

order by必须指定limit的主要原因: order by 为全局排序,所有数据只有一个reduceTask来处理,防止单个reduce运行时间过长,而导致任务阻塞

-- 测试
set hive.strict.checks.orderby.no.limit=true;
select * from lubian order by name;

执行结果

FAILED: SemanticException 1:36
    Order by-s without limit are disabled for safety reasons.
    If you know what you are doing, please set hive.strict.checks.orderby.no.limit to false
    and make sure that hive.mapred.mode is not set to "strict" to proceed.
    Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features..
    Error encountered near token "name"

2.3 限制笛卡尔积

限制笛卡尔积运算原因:笛卡尔积可能会造成数据急速膨胀,例如两个1000条数据表关联,会产生100W条数据。n的平方增长。触发笛卡尔积时,join操作会在一个reduceTask中执行

-- 测试
set hive.strict.checks.cartesian.product=true;
select t1.*,t2.* from lubian as t1
inner join lubian as t2;

执行结果

FAILED: SemanticException Cartesian products are disabled for safety reasons.
    If you know what you are doing, please set hive.strict.checks.cartesian.product to false
    and make sure that hive.mapred.mode is not set to "strict" to proceed.
    Note that you may get errors or incorrect results
    if you make a mistake while using some of the unsafe features.

3.搭配使用

3.1 参数

设置hive严格模式参数如下

set hive.mapred.mode=strict;
set hive.strict.checks.no.partition.filter=true;
set hive.strict.checks.orderby.no.limit=true;
set hive.strict.checks.cartesian.product=true;

以上参数可以使用 set hive.mapred.mode=strict; 默认开启三种情况的严格模式。也可以使用每个限制内容参数开启指定严格校验。

3.2 搭配使用案例

也可以搭配使用,但是使用以下方式就有些问题了:

-- 关闭笛卡尔积运算校验
set hive.strict.checks.cartesian.product=flase;
-- 关闭严格模式
set hive.mapred.mode=nonstrict;

应该是严格模式默认关闭,但仍想对其中一种情况做校验。如下

set hive.mapred.mode=nonstrict;
set hive.strict.checks.cartesian.product=true;

或者严格模式默认开启,但对其中一种不想做校验:

set hive.mapred.mode=strict;
set hive.strict.checks.cartesian.product=false;

以上内容。

按例,欢迎点击此处关注我的个人公众号,交流更多知识。

后台回复关键字 hive,随机赠送一本鲁边备注版珍藏大数据书籍。

原文地址:https://www.cnblogs.com/lubians/archive/2022/09/02/16650960.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/4824.html

(0)
上一篇 2023-06-03 14:30
下一篇 2023-06-03

相关推荐

  • Python编程:轻松学习打造高效程序

    Python编程:轻松学习打造高效程序Python是一种高级编程语言,因其简单易学、高效、灵活而受到开发者广泛的欢迎。本文将从多个方面,详细阐述Python编程的优点、用法和实战案例,帮助初学者更好地掌握Python编程技术。

    2023-12-20
    113
  • 使用apt-get安装vim

    使用apt-get安装vim在Linux环境下,我们经常需要使用命令行界面进行操作。而vim是一款非常经典的命令行文本编辑器,在Linux系统上得到广泛使用。在本篇文章中,我们将会介绍如何使用apt-get命令来安装vim。

    2024-07-26
    41
  • Python强制类型转换

    Python强制类型转换Python是一种先进且广泛使用的编程语言,它有强制类型转换的概念,可以将一个数据类型转换为另一个数据类型。

    2024-09-18
    20
  • Python字节数组

    Python字节数组随着时代的转变,数据处理和存储技术也在不断更新换代,而字节数组作为Python库中的一个重要组成部分,也在相应地得到了广泛应用。字节数组可以用于表示二进制数据,是Python处理二进制数据的核心工具之一,同时也是许多Python库中通信和数据存储的基础。因此,本文将从多个方面阐述Python字节数组的相关知识,为读者提供更全面的了解和应用指导。

    2024-06-23
    43
  • Redis 知识总结[通俗易懂]

    Redis 知识总结[通俗易懂]Redis 和 memcache 的区别,Redis 支持的数据类型应用场景
    redis 支持的数据结构更丰富(string,hash,list,set,zset)。memcache 只支持 key-

    2023-06-11
    122
  • 用Python调用函数

    用Python调用函数在Python中,函数是一组代码段,用于执行特定的任务。函数可以接受参数并返回值。在Python程序中,如果有一个函数可以完成我们需要的任务,我们可以在程序中调用它。调用函数的语法如下:

    2024-06-28
    53
  • redis深入学习

    redis深入学习Redis持久化 官方文档: https://redis.io/topics/persistence Redis用户认证 redis默认开启了保护模式,只允许本地回环地址登录并访问数据库 禁止prot

    2022-12-29
    146
  • Elastic search集群新增节点(同一集群,同一 物理机)[通俗易懂]

    Elastic search集群新增节点(同一集群,同一 物理机)[通俗易懂]elastic search 集群新增node 同一台物理机

    2022-12-16
    165

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注