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