Kyuubi 引擎的共享级别
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
SparkContext、SparkSession 以及 TTL 的机制与 USER 共享级别类似。
下面是一个配置 HadoopGroupProvider 以使用基于 LDAP 的组映射的示例。
- 将下例中所示的属性添加到
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>(&(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>按照相应的说明重启 HDFS NameNode 和 YARN ResourceManager。
运行
hdfs groups命令来验证 LDAP 组映射。该命令会为当前用户从 LDAP 中获取所属组。请注意,配置了 LDAP 组映射后,HDFS 权限可以利用 LDAP 中定义的组来进行访问控制。
关于 GROUP 共享级别下授权的提示:
会话用户和主组名(即 sparkUser/执行用户)在引擎端均可访问。
默认情况下,将使用 sparkUser 来检查 YARN/HDFS 的 ACL。
如果需要对会话用户进行细粒度的访问控制,则需要通过 SparkContext.getLocalProperty("kyuubi.session.user") 获取该用户,并将其发送给安全服务,例如 Apache Ranger。
SERVER_LOCAL
对于 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 作业和交互式即席查询。
评论
登录后参与评论
KnowForge