
# 配置Spark SQL防御规则
用户可以在Manager界面配置Spark的SQL防御规则，根据业务调整对应SQL防御规则的参数。
#### 前提条件
- 已安装包含Spark服务的集群客户端，安装目录如"/opt/hadoopclient"。
- Spark服务运行状态正常。
- 在租户资源中添加租户，例如创建租户sparkstatic1，具体请参见[添加MRS租户](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0305.html)章节。
- 对于开启了Kerberos认证的集群，需要创建一个业务用户，例如创建用户"sparkuser"，该用户属于hive、hadoop、supergroup组，主组为hive，角色绑定sparkstatic1。
 
#### 约束与限制
- 防御规则默认动态生效时间为6分钟。
- 仅支持SQL类型作业。
- Spark-SQL local模式下不支持SQL防御。
- 使用spark-submit形式提交的自定义作业不支持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操作大量分区中可能出现。
 
#### 配置Spark SQL防御规则
1. 登录MRS集群Manager界面。 
   登录集群Manager界面请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
2. 选择"集群 \> SQL防御"，打开SQL防御页面。
3. 参考[添加MRS SQL防御规则](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300125.html)添加针对Spark的SQL防御规则。
   
   Spark SQL引擎支持的各类型SQL防御规则可参考[MRS SQL防御规则](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300125.html#mrs_01_300125__zh-cn_topic_0000001683411170_zh-cn_topic_0000001662442869_section19510043143814)。
   例如添加一条规则ID为"static_0001"，SQL语句中count distinct出现次数超过2就进行"提示"的规则。
   图1添加Spark SQL防御规则   
   ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000002479451400.png "点击放大")
   
   
4. 登录安装有Spark客户端的节点，执行以下命令，切换到客户端安装目录。 
   **cd /opt/hadoopclient**
   执行以下命令，配置环境变量。
   **source bigdata_env**
   **source Spark/component_env**
   
   
5. 安全模式（启用Kerberos认证）执行用户认证，普通模式（未启用Kerberos认证）无需执行。 
   **kinit** *Spark组件操作用户*
   例如：
   **kinit** **sparkuser**
   根据提示输入用户密码，首次登录需重置密码。
   
   
6. 执行如下命令进入spark-sql客户端： 
   **cd opt/client/Spark/spark/bin**
   **./spark-sql**
   
   
7. 在客户端下执行以下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出现次数超出[步骤 3]中配置规则的阈值，系统提示信息如下：
   ```
   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防御详情：
   1. 登录FusionInsight Manager页面，选择"集群 \> 服务 \> Yarn"，在"概览"页面单击ResourceManager WebUI后的链接，进入到Yarn的WebUI界面。
   
   2. 在"All Applications"页面单击ID名称，进入应用详情页面。 ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000002479291424.png "点击放大")
      
   
   3. 单击应用的"Logs"，进入"Logs"页面，单击stdout全量日志，即可查看SQL防御详情，如下图所示： ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000002511411341.png "点击放大")
      ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000002511491303.png "点击放大")
      ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000002479451402.png "点击放大")
      
   
   
   ![](https://support.huaweicloud.com/usermanual-mrs/public_sys-resources/note_3.0-zh-cn.png)
   1. 更多Spark SQL防御规则可参考[MRS SQL防御规则](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300125.html#mrs_01_300125__zh-cn_topic_0000001683411170_zh-cn_topic_0000001662442869_section19510043143814)。
   
   2. Spark 客户端模式下，增加了query info能力，日志路径为"/opt/hadoopclient/Spark/spark/audit/query.log"，记录了每条SQL详细的运行信息以及对应的SQL防御信息，用户可以通过该日志来查看防御详情。
    
   
   
 
