6.5. 过载保护
6.5.1. 过载保护
对查询资源进行限制,如果超过设定的资源,则主动停止该SQL的运行。
6.5.2. 解决问题
- *查询导致系统崩溃退出
- shuffle 达到过载保护的阈值,则中断此SQL,保证系统服务正常
- 文件读写量的过载控制
- SQL任务执行时间的控制-超时则kill
6.5.3. 开启shuffle数据倾斜自动识别
- 在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部分的过载保护的阈值
- 在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 |