是否可以将spark作业提交到yarn集群并选择,无论是使用命令行还是在jar中,哪个用户将"拥有"该作业?
spark-submit将从包含用户的脚本启动。
PS:如果集群有kerberos配置(并且脚本是keytab),它仍然可能吗?
对于不支持kerberos的集群:在提交Spark作业之前执行export HADOOP_USER_NAME=zorro
。
如果您希望在shell脚本的其余部分(或在交互式shell会话中)恢复到默认凭据,请确保随后启用unset HADOOP_USER_NAME
。
对于支持 kerberos的集群,模拟另一个帐户而不破坏其他作业/会话(这可能取决于您的默认票证)的干净方法将是这一行中的内容…
export KRB5CCNAME=FILE:/tmp/krb5cc_$(id -u)_temp_$$
kinit -kt ~/.protectedDir/zorro.keytab zorro@MY.REALM
spark-submit ...........
kdestroy
对于不支持kerberos的集群,可以添加如下配置:
--conf spark.yarn.appMasterEnv.HADOOP_USER_NAME=<user_name>
另一种(更安全的)方法是使用proxy authentication
-基本上你创建一个服务帐户,然后允许它冒充其他用户。
$ spark-submit --help 2>&1 | grep proxy
--proxy-user NAME User to impersonate when submitting the application.
假设使用kerberos/安全集群。
我提到它更安全,因为您不需要存储(和管理)您必须模拟的所有用户的密钥选项卡。
要启用模拟,您需要在Hadoop端启用几个设置,以告诉哪个帐户可以模拟哪些用户或组以及在哪些服务器上。假设您已经创建了svc_spark_prd
服务帐户/用户。
hadoop.proxyuser.svc_spark_prd.hosts
-允许提交模拟Spark应用程序的服务器的完全合格域名列表。*
是允许的,但不推荐用于任何主机。
还指定hadoop.proxyuser.svc_spark_prd.users
或hadoop.proxyuser.svc_spark_prd.groups
以列出允许svc_spark_prd
模拟的用户或组。*
是允许的,但不推荐使用。
另外,请查看有关代理身份验证的文档。
例如,Apache Livy使用这种方法代表其他最终用户提交Spark作业。如果你的用户存在,你仍然可以启动你的spark提交Su $my_user -c spark submit[…]
我不确定kerberos keytab,但是如果您使用这个用户创建一个kinit,应该没问题。
如果你不想要密码而不能使用su,我邀请你看看这个stackoverflow的答案:如何作为另一个用户运行脚本而不需要密码