kyuubi是一种大数据任务执行网关,代理各种执行引擎,处理任务的提交。
kyuubi提供了各种扩展能力,其中鉴权就是其扩展能力之一,比如其提供的kyuubi-spark-authz插件,本身就是一种ranger plugin,用于spark的鉴权。
官方文档如下:https://kyuubi.readthedocs.io/en/master/security/authorization/spark/overview.html
1.authz的用法
用法上需要关注两点:
(1)在spark任务进程的classpath中添加kyuubi-spark-authz jar包。
(2)在启动spark任务时,添加spark.sql.extensions参数,配置为org.apache.kyuubi.plugin.spark.authz.ranger.RangerSparkExtension
2.插件启动原理
根据spakr-3.4.2、ranger-2.3.0和kyuubi-1.10.0版本的源码,启动过程如下:
# 第一步:SparkSession的初始化
SparkSession在初始化过程中会调用applyExtensions方法来创建对一个的Extension对象
new SparkSession
SparkSession.applyExtensions()
// extensions类由参数spark.sql.extensions决定
// 根据配置的类,通过反射依次生成SparkSessionExtension对象
# 第二步:RangerSparkExtension初始化
RangerSparkExtension初始化过程中会附带初始化org.apache.kyuubi.plugin.spark.authz.ranger.RuleAuthorization。并将RuleAuthorization注入到SparkSession中。
# 第三步:sparksql请求到来
当有sparksql请求到来时,会调用RuleAuthorization#checkPrivileges进行鉴权
RuleAuthorization#checkPrivileges(SparkSession, LogicalPlan)
auditHandler = new SparkRangerAuditHandler // SparkRangerAuditHandler是RangerAccessResultProcessor的子类
ugi = getAuthzUgi(spark.sparkContext)
SparkRangerAdminPlugin.verify(accessRequests, auditHandler) // SparkRangerAdminPlugin是RangerBasePlugin的子类
SparkRangerAdminPlugin.isAccessAllowed(accessRequests, auditHandler)
可以看到,所有的authz插件类的初试化都与SparkSession和SparkSQL相关。如果是通过SparkContext提交的Spark jar任务或者是scala任务,则不会启动对应的SparkSessionExtension,更不会有鉴权方法的调用。
SparkSession是比SparkContext更高级的API,SparkSession中引用了SparkContext对象。
3.审计日志输出
在第二节中,我们可以得到以下几点零零碎碎的信息:
(1)spark.sql.extensions配置只对spark sql有效。
(2)kyuubi-spark-authz插件只对SparkSession有效。
注意,以上只是充分条件,而非必要条件。
而审计日志是伴随着鉴权过程的,只有发生了鉴权,才有可能会发生审计日志的输出。也就是我们只能配置sparksql任务的审计日志输出,无论是spark-submit提交的sparksql任务,还是spark-sql命令提交的sparksql任务。
现在有一个场景,如果spark jar任务中有sparksession的初始化,并通过sparksession进行sparksql任务的执行,那会不会有审计日志的输出呢?答案是:会有的。