Serverless Spark 访问 Kerberos 集群是指在无服务器 Spark 环境中安全访问受 Kerberos 认证保护的集群,解决了无服务器场景下访问安全集群的需求,适用于处理 Kerberos 认证的 HDFS 或 Hive 数据等场景。本文将引导完成配置与使用步骤。
参数名称 | 描述 |
|---|---|
元数据 | 选择外部 HMS |
VPC | 本参数需与 EMR on ECS 集群网络配置保持一致 |
可用区 C 子网 | 本参数需与 EMR on ECS 集群网络配置保持一致 |
安全组 | 本参数需与 EMR on ECS 集群网络配置保持一致 |
HMS 连接 | 填写运行 HMS(Hive Metastore,Hive 元数据服务)的节点域名及端口,格式:thrift://<HMS 所在节点 DNS>:9083。
说明 当前 HMS 连接仅支持域名方式,不支持直接填写 IP 方式。 |
说明
参数配置须与 EMR on ECS 集群中 Kerberos 中 krb5.conf文件配置保持一致。
登录集群,通过vim /etc/krb5.conf 命令查看krb5.conf文件,将文件内容复制到 在队列详情 > Kerberos 认证配置页面的配置框中。
示例
[libdefaults] default_realm = xxxxxxxxxxxxxxxxxx.EMR.COM udp_preference_limit = 4096 ticket_lifetime = 24h renew_lifetime = 7d forwardable = true rdns = false dns_lookup_realm = false dns_lookup_kdc = false kdc_timeout = 3s max_retries = 2 [realms] xxxxxxxxxxxxxxxxxx.EMR.COM = { kdc = 192.168.1.36:88 kdc = 192.168.1.36:88 admin_server = master-1-1.***** } [domain_realm] .xxxxxxxxxxxxxxxxxx.EMR.COM = xxxxxxxxxxxxxxxxxx.EMR.COM xxxxxxxxxxxxxxxxxx.EMR.COM = xxxxxxxxxxxxxxxxxx.EMR.COM
说明
当任务执行过程中无需访问外部 HMS 时,需添加如下配置,关闭 HMS 访问。
-- 关闭外部元数据访问和跨vpc访问 set emr.serverless.external.catalog=false; set las.cross.vpc.access.enabled=false;
访问 Kerberos 需指定如下参数:
-- 指定访问kerberos使用的principal,格式必须为 <username>@<REALM> set spark.kerberos.principal=username@A873A71EE5D115874738.EMR.COM; -- 对应用户的keytab文件的tos路径,需要提前上传到账号的tos下 set serverless.spark.kerberos.keytab.path=tos://nyc-fns/xxxxx.keytab; -- sparksql添加,sparkjar不需要 set tqs.query.engine.type = sparkcli; -- 开启hms的kerberos认证 set spark.hive.metastore.sasl.enabled=true; -- 格式为 hive/_HOST@<REALM>,前面部分无需修改,替换自身 kerberos 集群的<REALM>即可 set spark.hive.metastore.kerberos.principal=hive/_HOST@A873A71EE5D115874738.EMR.COM; -- 只打开 spark driver 的跨vpc访问,避免大任务消耗大量的子网ip set serverless.cross.vpc.driver.only.enabled = true; set serverless.cross.vpc.dns.resolve.enabled = true;
示例
set spark.kerberos.principal=<user>@<REALM>;-- 指定访问kerberos使用的principal,格式必须为 <username>@<REALM> set serverless.spark.kerberos.keytab.path=tos://bucketname/<user>.keytab;-- 对应用户的keytab文件的TOS路径,需提前生成keytab文件并上传到账号的TOS下 -- 只打开 spark driver 的跨vpc访问,避免大任务消耗大量的子网ip set serverless.cross.vpc.driver.only.enabled = true; set serverless.cross.vpc.dns.resolve.enabled = true; set tqs.query.engine.type = sparkcli;-- sparksql添加,sparkjar不需要 set spark.hive.metastore.sasl.enabled=true; set spark.hive.metastore.kerberos.principal=hive/_HOST@<REALM>;-- 格式为 hive/_HOST@<REALM>,前面部分无需修改,替换自身 kerberos 集群的<REALM>即可 show tables; --查看当前数据库下的所有表 show create table xxx;--查看指定表 select * from xxx limit 10;--查询指定表的前10条数据
示例
-- 定义 Spark SQL 的默认数据仓库目录TOS路径,用于存储托管表(Managed Tables)的数据文件 set spark.sql.warehouse.dir=tos://bucketname/managed; -- 上述必须添加的参数 set spark.kerberos.principal=<user>@<REALM>;-- 指定访问kerberos使用的principal,格式必须为 <username>@<REALM> set serverless.spark.kerberos.keytab.path=tos://bucketname/<user>.keytab;-- 对应用户的keytab文件的TOS路径,需要提前上传到账号的TOS下 -- 只打开 spark driver 的跨vpc访问,避免大任务消耗大量的子网ip set serverless.cross.vpc.driver.only.enabled = true; set serverless.cross.vpc.dns.resolve.enabled = true; set tqs.query.engine.type = sparkcli;-- sparksql添加,sparkjar不需要 set spark.hive.metastore.sasl.enabled=true; set spark.hive.metastore.kerberos.principal=hive/_HOST@<REALM>;-- 格式为 hive/_HOST@<REALM>,前面部分无需修改,替换自身 kerberos 集群的<REALM>即可 create table if not exists serverless.employees_serverless as select * from employees;--创建托管表(若不存在),并从源表(employees)插入数据
-- 定义 Spark SQL 的默认数据仓库目录TOS路径,用于存储托管表(Managed Tables)的数据文件 set spark.sql.warehouse.dir=tos://bucketname/managed; -- 上述必须添加的参数 set spark.kerberos.principal=<user>@<REALM>; set serverless.spark.kerberos.keytab.path=tos://bucketname/<user>.keytab; set serverless.cross.vpc.driver.only.enabled = true; set serverless.cross.vpc.dns.resolve.enabled = true; set tqs.query.engine.type = sparkcli; set spark.hive.metastore.sasl.enabled=true; set spark.hive.metastore.kerberos.principal=hive/_HOST@<REALM>; -- paimon catalog set spark.sql.catalog.paimon_catalog=org.apache.paimon.spark.SparkCatalog; set spark.sql.catalog.paimon_catalog.warehouse=tos://paimon-emr-test/user/paimon/warehouse/; set spark.sql.storeAssignmentPolicy=ansi; create table serverless.test as select * from paimon_catalog.paimon_db.veh_2k where dt = '20251117';
参照 SparkJar 作业,将 Kerberos 相关配置填写到 Spark 参数(Spark Conf)中即可正常访问。
进入 kerberos 所在集群的机器执行以下命令,进入 Kerberos 的 admin.local 工具。
kadmin.local
创建 principal,principal的格式为kyuubi/<fqdn>@<REALM>。其中 <fqdn> 域名可自定义。
addprinc -randkey kyuubi/serverless-spark-jdbc.emr.cn-beijing.volces.com@E159E9BE5E120****.EMR.COM
导出 keytab 文件。
xst -k /etc/krb5/keytab/serv/kyuubi.keytab kyuubi/serverless-spark-jdbc.emr.cn-beijing.volces.com@E159E9BE5E120****.EMR.COM
将导出的 keytab 文件上传到 TOS。
hdfs dfs -put /etc/krb5/keytab/serv/kyuubi.keytab tos://emr-autotest/azmn/kyuubi/
创建并连接 Gateway 的通用操作指导请参见 创建与管理 Kyuubi Gateway,以下为您介绍开启 Kerberos 场景下的核心配置参数要点。
元数据选择外部 HMS。
将 Kerberos 相关参数配置到 Gateway 的引擎配置中。
配置示例如下。
kyuubi.authentication=KERBEROS,custom kyuubi.kinit.principal=kyuubi/serverless-spark-jdbc.emr.cn-beijing.volces.com@E159E9BE5E120CAC4ECA.EMR.COM kyuubi.kinit.keytab=tos://emr-autotest/azmn/kyuubi/kyuubi.keytab hadoop.security.authentication=kerberos hive.metastore.sasl.enabled=true hive.metastore.kerberos.principal=hive/_HOST@E159E9BE5E120CAC4ECA.EMR.COM
您需根据您的情况修改以下参数,其他参数保持与示例值一致即可。
参数 | 配置说明 |
|---|---|
| 指定 Kyuubi Gateway 用于 Kerberos 认证的主体(Principal),格式为 |
| keytab 文件上传的 TOS 路径。 |
| Kerberos 环境下 HMS 对应的 principal。 |
以下以使用 Beeline 连接 Kyuubi 为例。
执行 kinit 命令进行初始化。
连接 Kyuubi 并提交作业。
beeline -u "jdbc:hive2://192.168.**.1**:10009/;principal=kyuubi/serverless-spark-jdbc.emr.cn-beijing.volces.com@E159E9BE5E120CAC4ECA.EMR.COM?kyuubi.session.iam.credential.ak=AKLTNGExZjEyMWVlMGQ2NDllOGI2ZDE4M2Y5****;kyuubi.session.iam.credential.sk=TVRWaE5UUXlZVFZoWVdZNU5ESm1NV0U1TURZME9EUTFOalk1Tl****;queue_name=doctest;kyuubi.engine.share.level=connection"
其中:
参数 | 配置说明 |
|---|---|
| 需配置为 Kyuubi Gateway 服务的 Endpoint(含端口号),您可在对应 Gateway 的详情页面获取 Endpoint 信息。 |
| 指定 Kyuubi Gateway 用于 Kerberos 认证的主体(Principal),格式为 |
| 用于认证的火山引擎 IAM 账号 AK、SK信息。 |
| 作业运行的队列/计算组资源名称。 |
连接 Kyuubi 后,即可提交作业。