从oozie运行spark2(cdh)

vuktfyat  于 2021-06-01  发布在  Hadoop
关注(0)|答案(3)|浏览(385)

我正试图从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正在以用户身份运行作业。它剥夺了我们在hdfs中更改yarn权限的任何能力,并且没有一个引用 user spark脚本中的目录。我们已经尝试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

任何帮助都将不胜感激。

wfypjpf4

wfypjpf41#

从Yarn上发射Spark(2.1)开始。。。 spark.yarn.stagingDir 提交应用程序时使用的暂存目录
默认值:文件系统中当前用户的主目录
所以,如果你能在某处创建一个hdfs目录 yarn 所需的特权——即。 rx 在所有父目录和 rwx 在dir本身上——然后请求spark使用该dir而不是 /user/yarn (不存在的)那你就没事了。

5lwkijsr

5lwkijsr2#

您需要添加“ <env-var>HADOOP_USER_NAME=${wf:user()}</env-var> “到oozie workflow.xml的shell操作中。因此,oozie使用触发oozie workfow的用户的主目录,而不是使用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

ttp71kqs

ttp71kqs3#

我可以通过以下方法解决这个问题https://stackoverflow.com/a/32834087/8099994
在shell脚本的开头,我现在包含以下行:

export HADOOP_USER_NAME=serviceAccount;

相关问题