部署 Kyuubi

Kyuubi 引擎的共享级别

师成师成· 更新于 2026-09-29· 阅读 46 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Kyuubi 引擎的共享级别描述了会话与引擎之间的关系,决定了新会话是否可以与其他会话共享已有的后端引擎。会话也称为客户端创建的 JDBC/ODBC/Thrift 连接,由最终用户发起;引擎则是具有完整 Spark SQL、Flink SQL(开发中)能力的独立应用程序,运行在单机或集群上。

无论在高可用模式还是单节点模式下,Kyuubi 引擎的共享级别工作方式相同。换句话说,如果条件允许,一个引擎可以在整个集群范围内被所有 Kyuubi 服务端对等节点共享。

为什么需要这个特性?

Apache Spark 是一个统一的大规模数据分析引擎。使用 Spark 处理数据就像驾驶一辆大马力的全时四驱超跑。然而,

  • 汽车的 0-60 英里加速时间是有限的。同样地,所有 Spark 应用在全速运行之前也需要预热。
  • 汽车的座位数是固定的,不允许超载。由于 Spark 的主从架构和预先配置的资源,单个应用的整体负载是可预测的。
  • 汽车有各种不同的外形以满足我们的需求。

有了这个特性,Kyuubi 为你提供了一种更灵活的方式来处理不同的大数据工作负载。

当前支持的共享级别

当前支持的共享级别如下:

共享级别语法场景隔离程度共享程度
CONNECTION每个会话一个引擎大规模 ETL
即席查询
高低
USER每个用户一个引擎即席查询
小规模 ETL
中中
GROUP每个主用户组一个引擎即席查询
小规模 ETL
低高
SERVER_LOCAL每个 Kyuubi 服务端一个引擎资源负载均衡极低极高
SERVER每个集群一个引擎管理员安全模式下最高
非安全模式下最低
安全模式下仅限管理员
  • 引擎隔离程度越高,引擎及其上运行的查询执行就越稳定。
  • 引擎共享程度越高,我们就越有可能复用一个已经在全速运行的引擎。

CONNECTION

USER(默认)
GROUP
Hadoop GroupsMapping 将用户映射到主组。如果未找到主组,则回退到 USER 级别。

SparkContext、SparkSession 以及 TTL 的机制与 USER 共享级别类似。

下面是一个配置 HadoopGroupProvider 以使用基于 LDAP 的组映射的示例。

  1. 将下例中所示的属性添加到 core-site.xml 文件中。你需要提供绑定用户(bind user)、绑定密码(bind password)以及针对你的 LDAP 实例的其他属性的值,并确保对象类(object class)、用户和组过滤器与你的 LDAP 实例中指定的值相匹配。
<property>
  <name>hadoop.security.group.mapping</name>
  <value>org.apache.hadoop.security.LdapGroupsMapping</value>
</property>

<property>
  <name>hadoop.security.group.mapping.ldap.url</name>
  <value>ldap://localhost:389</value>
</property>

<property>
  <name>hadoop.security.group.mapping.ldap.base</name>
  <value>dc=example,dc=com</value>
</property>

<property>
  <name>hadoop.security.group.mapping.ldap.bind.user</name>
  <value>cn=Manager,dc=example,dc=com</value>
</property>

<property>
  <name>hadoop.security.group.mapping.ldap.bind.password</name>
  <value>example</value>
</property>

<property>
  <name>hadoop.security.group.mapping.ldap.search.filter.user</name>
  <value>(&amp;(objectClass=posixAccount)(cn={0}))</value>
</property>

<property>
  <name>hadoop.security.group.mapping.ldap.search.filter.group</name>
  <value>(objectClass=posixGroup)</value>
</property>

<property>
  <name>hadoop.security.group.mapping.ldap.search.attr.member</name>
  <value>memberuid</value>
</property>

<property>
  <name>hadoop.security.group.mapping.ldap.search.attr.group.name</name>
  <value>cn</value>
</property>
  1. 按照相应的说明重启 HDFS NameNode 和 YARN ResourceManager。

  2. 运行 hdfs groups 命令来验证 LDAP 组映射。该命令会为当前用户从 LDAP 中获取所属组。请注意,配置了 LDAP 组映射后,HDFS 权限可以利用 LDAP 中定义的组来进行访问控制。

关于 GROUP 共享级别下授权的提示:

会话用户和主组名(即 sparkUser/执行用户)在引擎端均可访问。
默认情况下,将使用 sparkUser 来检查 YARN/HDFS 的 ACL。
如果需要对会话用户进行细粒度的访问控制,则需要通过 SparkContext.getLocalProperty("kyuubi.session.user") 获取该用户,并将其发送给安全服务,例如 Apache Ranger。

SERVER_LOCAL

SERVER
子域(Subdomain)

对于 USER、GROUP 或 SERVER 共享级别,你可以进一步使用 kyuubi.engine.share.level.subdomain 来隔离引擎。
也就是说,你同样可以为单个用户、组或服务端(集群)创建多个引擎。
例如,在 USER 共享级别下,你可以使用 kyuubi.engine.share.level.subdomain=sd1 和 kyuubi.engine.share.level.subdomain=sd2 为用户 Tom 创建两个独立的引擎。

kyuubi.engine.share.level.subdomain 需要在 JDBC 连接 URL 中进行配置,以告知 Kyuubi 服务端你希望使用哪个引擎。

引擎池(Engine Pool)

引擎池的工作原理是创建多个引擎子域(例如 engine-pool-0、engine-pool-1),并将会话分配到这些子域中。

当设置了 kyuubi.engine.share.level.subdomain,或者 kyuubi.engine.share.level 被设置为 CONNECTION 时,引擎池的配置将不会生效。

混合(Hybrid)

所有受支持的共享级别可以在同一个 Kyuubi 服务端或集群中组合使用。

相关配置

  • kyuubi.engine.share.level(kyuubi.session.engine.share.level)
    • 默认值:USER
    • 可选值:USER、CONNECTION、GROUP、SERVER_LOCAL、SERVER
    • 含义:引擎创建、缓存以及向会话共享的基础级别。
    • 用法:既可在服务端配置文件中设置,也可在连接 URL 中设置,后者优先级更高。
  • kyuubi.session.engine.idle.timeout
    • 默认值:PT30M(30 分钟)
    • 可选值:一个合适的超时时间
    • 含义:引擎变为空闲后的存活时间
    • 用法:既可在服务端配置文件中设置,也可在连接 URL 中设置,后者优先级更高。
  • kyuubi.engine.share.level.subdomain(kyuubi.engine.share.level.sub.domain)
    • 默认值:<无>
    • 可选值:一个有效的 zookeeper 子节点
    • 含义:在基础级别下增加一个子域,以便对引擎做进一步隔离
    • 用法:既可在服务端配置文件中设置,也可在连接 URL 中设置,后者优先级更高。
  • kyuubi.engine.pool.size
    • 默认值:-1
    • 可选值:正整数
    • 含义:引擎池的数量
    • 用法:既可在服务端配置文件中设置,也可在连接 URL 中设置,后者优先级更高。
  • kyuubi.engine.pool.name
    • 默认值:engine-pool
    • 可选值:一个有效的名称
    • 含义:引擎池的名称
    • 用法:既可在服务端配置文件中设置,也可在连接 URL 中设置,后者优先级更高。
  • kyuubi.engine.pool.selectPolicy
    • 默认值:RANDOM
    • 可选值:RANDOM、POLLING
    • 含义:引擎池的选择策略
    • 用法:既可在服务端配置文件中设置,也可在连接 URL 中设置,后者优先级更高。
  • kyuubi.engine.pool.size.threshold
    • 默认值:9
    • 可选值:正整数
    • 含义:引擎池大小的阈值
    • 用法:只能在服务端配置文件中设置。

结语

借助此特性,终端用户可以以不同的方式利用引擎来处理各自不同的工作负载,例如大规模 ETL 作业和交互式即席查询。

评论

登录后参与评论

正在加载评论…