Spark RDD.pipe以特定用户身份运行bash脚本

时间:2018-09-25 22:32:44

标签: apache-spark yarn rdd

我注意到RDD.pipe(Seq(“ / tmp / test.sh”))使用用户yarn运行shell脚本。这是有问题的,因为它允许火花用户访问仅应由纱线用户访问的文件。

解决此问题的最佳方法是什么?
调用sudo -u sparkuser不是一个干净的解决方案。我什至不愿意考虑这一点。

1 个答案:

答案 0 :(得分:1)

我不确定这是否是Spark区别对待Pipe()的错误,但是我在JIRA上打开了一个类似的问题:https://issues.apache.org/jira/projects/SPARK/issues/SPARK-26101

现在解决问题。显然,在YARN群集中,Spark Pipe()请求一个容器,是您的Hadoop是不安全的还是由Kerberos保护的,所以容器是由用户yarn/nobody运行还是启动容器your actual user的用户运行之间的区别。

使用Kerberos保护Hadoop,或者如果不想保护Hadoop,可以在YARN中设置两个配置,这些配置使用Linux用户/组启动容器。 注意,您必须在群集中的所有节点上共享相同的用户/组。否则,这将无法工作。 (也许使用LDAP / AD来同步您的用户/组)

设置这些:

yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users = false

yarn.nodemanager.container-executor.class = org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor

来源:https://hadoop.apache.org/docs/r2.7.4/hadoop-yarn/hadoop-yarn-site/NodeManagerCgroups.html (即使在Hadoop 3.0中也是如此)

此修复程序可用于Cloudera最新的CDH 5.15.1(yarn-site.xml): http://community.cloudera.com/t5/Batch-Processing-and-Workflow/YARN-force-nobody-user-on-all-jobs-and-so-they-fail/m-p/82572/highlight/true#M3882

示例:

val test = sc.parallelize(Seq("test user")).repartition(1)

val piped = test.pipe(Seq("whoami"))

val c = piped.collect()

est: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[4] at repartition at <console>:25
piped: org.apache.spark.rdd.RDD[String] = PipedRDD[5] at pipe at <console>:25
c: Array[String] = Array(maziyar)

这将返回在username中设置了这些配置后启动Spark会话的yarn-site.xml,并在所有节点之间同步所有用户/组。