Spark Delegation Token Provider


发布于 2024-06-10 / 53 阅读 / 0 评论 /
本文基于Spark3.4.1

1.spark支持的provider类型

spark当前支持以下四种delegation token provider。

HadoopDelegationTokenProvider
    HBaseDelegationTokenProvider // 对应serviceName为hbase
    HadoopFSDelegationTokenProvider // 对应serviceName为hadoopfs
    HiveDelegationTokenProvider // 对应serviceName为hive
    KafkaDelegationTokenProvider // 对应serviceName为kafka

所有的provider都需要继承org.apache.spark.security.HadoopDelegationTokenProvider。

HadoopDelegationTokenProvider中定义了三个方法:

// 获取provider的服务名称,名称必须唯一,spark内部使用这个名称来区分不同的provider
def serviceName: String

// 判断该服务是否需要token,默认情况下,返回值基于hadoop安全是否开启
def delegationTokensRequired(sparkConf: SparkConf, hadoopConf: Configuration): Boolean

// 获取这个服务的delegation token,并获得下一次需要更新token的时间
def obtainDelegationTokens(hadoopConf: Configuration, sparkConf: SparkConf, creds: Credentials): Option[Long]

所有的provider都需要实现这三个方法,也可以实现自定义的Provider。

2.HadoopDelegationTokenProvider初始化过程

HadoopDelegationTokenProvider的初始化是在org.apache.spark.deploy.security.HadoopDelegationTokenManager中完成的,过程如下

new SparkContext()
    taskScheduler = SparkContext.createTaskScheduler
    taskScheduler.start
        CoarseGrainedSchedulerBackend.start
            仅在安全模式下才进行以下操作
            delegationTokenManager = createTokenManager()
                new HadoopDelegationTokenManager()
                    delegationTokenProviders = loadProviders()
                        加载时,根据spark.security.credentials.{serviceName}.enabled配置来确定具体是哪个HadoopDelegationTokenProvider
            判断是否需要更新token
            如果需要更新token,则调用delegationTokenManager.start方法
                在start方法中,会启动定时器,定时调用ugi.checkTGTAndReloginFromKeytab()方法,以更新token
            如果不需要更新token,则调用delegationTokenManager.obtainDelegationTokens方法

这里需要注意的是,当前使用spark.security.credentials.%s.enabled参数,其中“%s”表示HadoopDelegationTokenProvider的serviceName。

不能通过spark.yarn.security.tokens.%s.enabled和spark.yarn.security.credentials.%s.enabled两个参数进行provider的设置,这两个参数已经处于deprecated状态。

附spark security相关参数官方文档:https://spark.apache.org/docs/latest/security.html