6.5. 过载保护

6.5.1. 过载保护

对查询资源进行限制,如果超过设定的资源,则主动停止该SQL的运行。

6.5.2. 解决问题

  • *查询导致系统崩溃退出
  • shuffle 达到过载保护的阈值,则中断此SQL,保证系统服务正常
  • 文件读写量的过载控制
  • SQL任务执行时间的控制-超时则kill

6.5.3. 开启shuffle数据倾斜自动识别

  1. 在config/spark/spark-defaults.conf里添加如下配置项(单位为byte):
spark.shuffle.io.limitSize=true   #是否启用过载保护
spark.shuffle.io.maxrwSize=5120000000     #原先默认过载保护的阈值
spark.shuffle.io.agg.records=10240000  #新发现的聚集部分的过载保护,限制条数,此处shuffle的io 并不大,故只能采用条数进行判断。
spark.shuffle.io.sort.maxrwSize=5120000000     #sort部分的过载保护的阈值
spark.shuffle.io.collection.maxrwSize=5120000000     #collection部分的过载保护的阈值
  1. 在config/spark/spark-defaults.conf里修改如下配置项:
spark.sql.shuffle.partitions=256    #该参数代表了shuffle read task的并行度,该值默认是32,当机器数量增加至100台时需将该值调整为256。增加shuffle read task的数量,可以让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据,通过提高shuffle操作的并行度来有效缓解和减轻数据倾斜的影响。

6.5.4. 关闭过载保护

在config/spark/spark-defaults.conf里修改为如下配置项:

spark.shuffle.io.limitSize=false   #不启用过载保护

6.5.5. 过载保护其他配置项

1. 过载保护1

配置项 运行时动态设置 默认值 说明
cl.query.multi.termquery.throw.error 不可以 true 超过term允许你遍历的个数,是抛错还是直接返回数据,当用户进行*或者范围检索时,如果扫描的范围太大,影响了性能,有系统查挂的风险时,系统会进行过载保护,进行过载保护的方式false:直接返回数据而不抛错,true则中断当前查询抛错给用户
cl.query.multi.termquery.size 可以 10240 当用户进行*或者范围检索时,扫描的term数量超过多少会触发系统过载保护行为,默认term允许你遍历的个数
cl.search.max.collect.return.break.size 可以 无限制 where检索的时候,检索命中多少条数后直接 break返回
cl.sql.execute.timeout.secs 可以 600 运行时,一条SQL期望在多少秒内执行完毕,如果没有执行完毕,则会自动kill这条SQL的执行
cl.sql.execute.max.mb 可以 102400 运行时,一条SQL期望的IO读取限制,默认限制每个进程1024mb

2. 过载保护2

配置项 运行时 动态设置 默认值 说明
cl.sql.parser.auto.add.limit 不可以 true 如果SQL没写limit自动是否自动补limit
cl.sql.parser.auto.add.limit.default.rows 不可以 1024 自动补的limit的大小,用户SQL不写limit,默认限制的返回条数
syskv='sys.forbid.sql.auto.limit:true' 可以 在sql中动态添加该参数,可以显示禁用自动添加limit,注意这里设置false无效
cl.mdrill.max.forbid.limit.rows 不可以 10000000 在sql中能够使用的最大limit的大小,超过改值会被禁用,并报错
cl.mdrill.max.allow.limit.rows 不可以 30000 mdrill模式最多允许的limit大小,offset+rows的和,超过了,就不能翻页,只能走spark了
cl.groupby.combine.max.hashmap.size 可以 5000 mdrill方式能够进行的最大分组数,如果超过此值,则会通过spark进行分组
cl.highpriority.partition 可以 null 在mdrill模式的检索里,按照日期分区分批次返回
配置如何分区返回 ,以及配置 cl.highpriority.facet.count 控制 数量达到多少即可停止不在继续请求
在facet逻辑里也可以 通常与cl.facet.group.max.count 组合使用,来绝对每个分组统计值 达到多少后就不在继续统计,从而节省计算资源
select s1 from common_example001
where partition like '%' and s1 like '3*'
and syskv='cl.facet.fl:s1' and syskv='cl.highpriority.partition:day_1@day_4@day_16@day_64'
and syskv='cl.highpriority.facet.count:30000'
and syskv='cl.facet.group.max.count:5000' limit 5
Copyright © lucene.xin 2020 all right reserved修改时间: 2021-07-02 11:42:23

results matching ""

    No results matching ""