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

配置Spark SQL防御

操作场景

用户可以在Manager界面配置Spark的SQL防御规则,根据业务调整对应SQL防御规则的参数。

前提条件

  • 已安装包含Spark服务的集群客户端,安装目录如“/opt/hadoopclient”。
  • Spark服务运行状态正常。
  • 在租户资源中添加租户,例如创建租户sparkstatic1。
  • 对于开启了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操作大量分区中可能出现。

操作步骤

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

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

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

    图1 添加Spark SQL防御规则

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

    cd /opt/hadoopclient

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

    source bigdata_env

    source Spark/component_env

  4. 安全模式(启用Kerberos认证)执行用户认证,普通模式(未启用Kerberos认证)无需执行。

    kinit Spark组件操作用户

    例如:

    kinit sparkuser

    根据提示输入用户密码,首次登录需重置密码。

  5. 执行如下命令进入spark-sql客户端:

    cd opt/client/Spark/spark/bin

    ./spark-sql

  6. 在客戶端下执行以下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防御详情:

    1. 登录FusionInsight Manager页面,选择“集群 > 服务 > Yarn”,在“概览”页面单击ResourceManager WebUI后的链接,进入到Yarn的WebUI界面。
    2. 在“All Applications”页面单击ID名称,进入应用详情页面.

    3. 单击应用的“Logs”,进入“Logs”页面,单击stdout全量日志,即可查看SQL防御详情,如下图所示:

    1. 更多Spark SQL防御规则可参考MRS SQL防御规则
    2. Spark 客户端模式下,增加了query info能力,日志路径为“/opt/hadoopclient/Spark/spark/audit/query.log”,记录了每条SQL详细的运行信息以及对应的SQL防御信息,用户可以通过该日志来查看防御详情。