
# 配置HetuEngine SQL防御规则
用户可以在Manager界面配置HetuEngine的SQL防御规则，根据业务调整对应SQL防御规则的参数。
#### 前提条件
- 已安装包含HetuEngine服务的集群客户端，安装目录如"/opt/hadoopclient"。
- HetuEngine服务及计算实例运行状态正常。
- 如集群已启用Kerberos认证，需提前创建HetuEngine的用户并授予相关权限，且需要通过Ranger为该用户配置操作数据源的数据库、表、列的管理权限。
 
#### 约束限制
- 防御规则默认动态生效时间为5分钟。
- 拦截和熔断规则会中断SQL查询，请根据实际业务配置合理的值。
- 熔断规则由系统Session级别参数控制，配置熔断规则需要业务用户具有set session的权限。
- 静态规则static_0003中查询总的Join个数不包含Semi Join和Anti Join。
- 动态规则dynamic_0001和dynamic_0002配置提示规则时，只在日志记录提示信息，不在客户端显示。
- 熔断规则Running_0001中，因客户端和服务端是异步请求，当服务端已经阻断请求后客户端可能显示Query is gone，此时可通过查看日志确认请求已被阻断。
 
#### 配置HetuEngine 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)添加针对HetuEngine的SQL防御规则。
   
   HetuEngine 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添加HetuEngine SQL防御规则   
   ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000002511490967.png "点击放大")
   
   
4. 登录安装有HetuEngine客户端的节点，执行以下命令，切换到客户端安装目录。 
   **cd /opt/hadoopclient**
   执行以下命令，配置环境变量。
   **source bigdata_env**
   
   
5. 根据集群认证模式，完成HetuEngine客户端登录。 
   - 安全模式：执行以下命令，完成用户认证并登录HetuEngine客户端。 **kinit hetu_test**
     **hetu-cli --catalog hive --tenant default --schema default**
     
   
   - 普通模式：执行以下命令，登录HetuEngine客户端。 **hetu-cli --catalog hive --tenant default --schema default --user hetu_test**
     **hetu_test**是一个至少具备"--tenant"指定租户角色的业务用户，且不能是操作系统用户。
     
   
   
   
   
6. 执行以下SQL语句，检查当前SQL防御规则是否生效。 
   执行以下命令建表：
   **CREATE TABLE table1(id int, name varchar,rank int);**
   **INSERT INTO table1 VALUES(10,'sachin',1),(45,'rohit',2),(46,'rohit',3),(18,'virat',4),(25,'dhawan',5);**
   执行以下命令查询：
   **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: Occurrence number of 'COUNT(DISTINCT XX)' (6) reaches the hint limitation (2)
   ```
   - 若SQL防御规则中设置的动作是"拦截"或"熔断"，系统回显信息可能如下：
     ```
     Intercepted. Reason: Occurrence number of 'COUNT(DISTINCT XX)' (6) reaches the interception limitation (2)
     ```
     
   
   - 用户也可通过日志查询SQL防御详情，HetuEngine SQL防御日志路径地址为"hdfs://hacluster/hetuserverhistory/*租户* /coordinator/*application_ID* /*container_ID/* *yyyyMMdd*/server.log"。
   
   - 如果使用JDBC二次开发需要获取Warning信息，则需要在JDBC应用程序处适配：
     ```
     statement = connection.prepareStatement(sql.trim());
     resultSet = statement.executeQuery();
     SQLWarning sqlWarning = statement.getWarnings();
     ```
     
   
   
   
   
 
