运行 来自 Oozie (CDH) 的 Spark2

Running Spark2 from Oozie (CDH)

我正在尝试 运行 来自 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

我可以通过关注

来解决这个问题

在我的 shell 脚本的开头,我现在包含以下行:

export HADOOP_USER_NAME=serviceAccount;

Launching Spark (2.1) on YARN...

spark.yarn.stagingDir
Staging directory used while submitting applications
Default: current user's home directory in the filesystem

因此,如果您可以在某处创建一个 HDFS 目录,并授予 yarn 所需的权限——即对所有父目录的 rx 和对目录本身的 rwx——然后请求 Spark 使用该目录而不是 /user/yarn(它不存在)那么你应该没问题。