我正在尝试从Oozie运行一个火花作业(使用spark2-submit),所以这项工作可以按计划运行。
运行时运行正常,我们从服务帐户(不是Yarn)下的命令行运行shell脚本。当我们将其作为Oozie Workflow运行时,会发生以下情况:
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部门拒绝我们在HDFS中更改Yarn权限的任何能力,并且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
任何帮助都将不胜感激。
答案 0 :(得分:1)
您需要将“<env-var>HADOOP_USER_NAME=${wf:user()}</env-var>
”添加到oozie workflow.xml的shell操作中。所以oozie使用的用户的主目录已经触发了oozie worklfow,而不是使用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
答案 1 :(得分:0)
我可以通过关注https://stackoverflow.com/a/32834087/8099994
来解决这个问题在我的shell脚本的开头,我现在包括以下行:
export HADOOP_USER_NAME=serviceAccount;
答案 2 :(得分:0)
来自Launching Spark (2.1) on YARN ...
spark.yarn.stagingDir
提交申请时使用的登台目录
默认值:文件系统中当前用户的主目录
因此,如果您可以在某个地方创建HDFS目录,并授予yarn
所需的privs(即,所有父目录上的rx
和dir本身上的rwx
),然后请求火花使用该目录代替/user/yarn
(不存在),则应该没问题。