我正在尝试从 Oozie 运行一个 spark 作业(使用 spark2-submit),所以这个作业可以按计划运行。
当运行我们从命令行在我们的服务帐户(不是 Yarn)下运行 shell 脚本时,作业运行得很好。当我们将它作为 Oozie 工作流运行时,会发生以下情况:
17/11/16 12:03:55 ERROR spark.SparkContext: Error initializing SparkContext.
org.apache.hadoop.security.AccessControlException: Permission denied:
user=yarn, access=WRITE, inode="/user":hdfs:supergroup:drwxrwxr-x
Oozie 正在以用户 Yarn 的身份运行该作业。 IT 不允许我们更改 Yarn 在 HDFS 中的权限,并且在 Spark 脚本中没有对 user
目录的单一引用。我们试图通过 ssh 进入服务器——虽然这不起作用——我们必须从我们的工作节点 ssh 到主节点。
shell脚本:
spark2-submit --name "SparkRunner" --master yarn --deploy-mode client --class org.package-name.Runner hdfs://manager-node-hdfs/Analytics/Spark_jars/SparkRunner.jar
如有任何帮助,我们将不胜感激。
最佳答案
您需要将“<env-var>HADOOP_USER_NAME=${wf:user()}</env-var>
”添加到 oozie workflow.xml 的 shell 操作中。因此 oozie 使用触发 oozie 工作流的用户的主目录,而不是使用 yarn 主目录。
例如
<action name='shellaction'>
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<exec>sparksubmitShellScript.sh</exec>
<argument>${providearg}</argument>
<env-var>HADOOP_USER_NAME=${wf:user()}</env-var>
<file>${appPath}/sparksubmitShellScript.sh#sparksubmitShellScript.sh
</file>
</shell>
</action>
根据您的工作流程进行修改 如果需要,您也可以直接提及用户名,而不是使用触发工作流的用户,如下所示
<env-var>HADOOP_USER_NAME=${userName}</env-var>
在你的 job.properties 中指定 userName=usernamevalue
关于hadoop - 从 Oozie (CDH) 运行 Spark2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47337637/