更新时间:2024-11-29 GMT+08:00

配置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,此时可通过查看日志确认请求已被阻断。

操作步骤

  1. 登录FusionInsight Manager,选择“集群 > SQL防御”,打开SQL防御页面。
  2. 参考添加SQL防御规则添加针对HetuEngine的SQL防御规则。

    HetuEngine SQL引擎支持的各类型SQL防御规则可参考MRS SQL防御规则

    例如添加一条规则ID为“static_0001”,SQL语句中count distinct出现次数超过2就进行“提示”的规则。

    图1 添加HetuEngine SQL防御规则

  3. 登录安装有HetuEngine客户端的节点,执行以下命令,切换到客户端安装目录。

    cd /opt/hadoopclient

    执行以下命令,配置环境变量。

    source bigdata_env

  4. 根据集群认证模式,完成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”指定租户角色的业务用户,且不能是操作系统用户。

  5. 执行以下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出现次数超出2中配置规则的阈值,系统提示信息如下:

    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();