配置Spark SQL防御规则
操作场景
用户可以在Manager界面配置Spark的SQL防御规则,根据业务调整对应SQL防御规则的参数。
前提条件
- 已安装包含Spark服务的集群客户端,安装目录如“/opt/hadoopclient”。
- Spark服务运行状态正常。
- 在租户资源中添加租户,例如创建租户sparkstatic1,具体请参见添加MRS租户章节。
- 对于开启了Kerberos认证的集群,需要创建一个业务用户,例如创建用户“sparkuser”,该用户属于hive、hadoop、supergroup组,主组为hive,角色绑定sparkstatic1。
使用约束
- 防御规则默认动态生效时间为6分钟。
- 仅支持SQL类型作业。
- 拦截和熔断规则会中断SQL查询,请根据实际业务配置合理的值。
- 静态规则static_0007,因Spark本身存在笛卡尔积限制(通过“spark.sql.crossJoin.enabled”控制,默认为true),若关闭此开关,会先于防御规则拦截。
- 动态规则不支持carbon表。
- 动态规则dynamic_0002,支持SELECT、ALTER TABLE ADD PARTITION、ALTER TABLE DROP PARTITION。若执行含判断条件的批量删除操作,如ALTER TABLE DROP PARTITION(pt < 10),由于该命令本身存在分区数限制(通过“spark.sql.dropPartitionsInBatch.limit”控制,默认1000),会先于防御规则拦截。
- 熔断规则存在统计误差,例如规则running_0004,扫描数据量阈值配置10GB,但是因为判断周期和任务并发影响,可能在15GB甚至更高才进行熔断。
- 熔断规则存在边界效应,例如某个Job直到最后几个task才超过阈值,在执行熔断前任务恰好完成,则无法真正取消Job。
- 熔断规则running_0004,SQL执行时长包括Driver侧执行时间和Job运行时间,当SQL运行阻塞在Driver侧,尽管超过了熔断阈值,但是也无法取消job。此现象在存算分离场景下,INSERT OVERWRITE操作大量分区中可能出现。
操作步骤
- 登录FusionInsight Manager,选择“集群 > SQL防御”,打开SQL防御页面。
- 参考添加MRS SQL防御规则添加针对Spark的SQL防御规则。
Spark SQL引擎支持的各类型SQL防御规则可参考MRS SQL防御规则。
例如添加一条规则ID为“static_0001”,SQL语句中count distinct出现次数超过2就进行“提示”的规则。
图1 添加Spark SQL防御规则 - 登录安装有Spark客户端的节点,执行以下命令,切换到客户端安装目录。
cd /opt/hadoopclient
执行以下命令,配置环境变量。
source bigdata_env
source Spark/component_env
- 安全模式(启用Kerberos认证)执行用户认证,普通模式(未启用Kerberos认证)无需执行。
kinit Spark组件操作用户
例如:
kinit sparkuser
根据提示输入用户密码,首次登录需重置密码。
- 执行如下命令进入spark-sql客户端:
cd opt/client/Spark/spark/bin
./spark-sql
- 在客戶端下执行以下SQL语句,检查当前SQL防御规则是否生效。
执行以下命令建表:
create table table1(id int, name string) stored as parquet
执行以下命令查询:
select count(distinct id),count(distinct id),count(distinct id),count(distinct id),count(distinct id),count(distinct id) from table1;
当前语句中count distinct出现次数超出2中配置规则的阈值,系统提示信息如下:
WARNING: static_0001 Occurrence num of 'COUNT(DISTINCT)'(6) reaches the hint threshold(2)
若SQL防御规则中设置的动作是“拦截”,系统回显信息如下:Error in query: static_0001 Occurrence num of 'COUNT(DISTINCT)'(6) reaches the intercept threshold(2)
spark beeline模式下,可通过日志来获取SQL防御详情:
- 登录FusionInsight Manager页面,选择“集群 > 服务 > Yarn”,在“概览”页面单击ResourceManager WebUI后的链接,进入到Yarn的WebUI界面。
- 在“All Applications”页面单击ID名称,进入应用详情页面。
- 单击应用的“Logs”,进入“Logs”页面,单击stdout全量日志,即可查看SQL防御详情,如下图所示:
- 更多Spark SQL防御规则可参考MRS SQL防御规则。
- Spark 客户端模式下,增加了query info能力,日志路径为“/opt/hadoopclient/Spark/spark/audit/query.log”,记录了每条SQL详细的运行信息以及对应的SQL防御信息,用户可以通过该日志来查看防御详情。