从Oozie(CDH)运行Spark2

时间:2017-11-16 19:28:48

标签: hadoop apache-spark cloudera oozie cloudera-cdh

我正在尝试从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

任何帮助都将不胜感激。

3 个答案:

答案 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(不存在),则应该没问题。