使用 Oozie(带 Hue)在 YARN 上 运行 Spark 应用程序的正确方法是什么?

What is the proper way of running a Spark application on YARN using Oozie (with Hue)?

我用 Scala 编写了一个使用 Spark 的应用程序。
该应用程序由两个模块组成 - App 模块,其中包含具有不同逻辑的 classes,以及 Env 模块,其中包含环境和系统初始化代码,以及实用程序功能。
入口点位于Env,初始化后在App中创建一个class(根据args,使用Class.forName)逻辑为已执行。
模块被导出到 2 个不同的 JAR(即 env.jarapp.jar)。

当我 运行 在本地应用程序时,它执行得很好。下一步是将应用程序部署到我的服务器。我用的是 Cloudera 的 CDH 5.4.

我使用 Hue 创建了一个带有 Spark 任务的新 Oozie 工作流,参数如下:

然后我将 2 个 JAR 文件放入工作流文件夹 (/user/hue/oozie/workspaces/hue-oozie-1439807802.48) 的 lib 文件夹中。

当我 运行 工作流时,它抛出 FileNotFoundException 并且应用程序不执行:

java.io.FileNotFoundException: File file:/cloudera/yarn/nm/usercache/danny/appcache/application_1439823995861_0029/container_1439823995861_0029_01_000001/lib/app.jar,lib/env.jar does not exist

然而,当我将 Spark master 和模式参数留空时,一切正常,但当我以编程方式检查 spark.master 时,它设置为 local[*] 而不是 yarn。另外,在观察日志时,我在 Oozie Spark 操作配置下遇到了这个:

--master
null
--name
myApp
--class
env.Main
--verbose
lib/env.jar,lib/app.jar
app.AggBlock1Task

我假设我做的不对 - 没有设置 Spark 主参数和模式参数并且 运行 将应用程序 spark.master 设置为 local[*]。据我所知,在应用程序中创建一个 SparkConf 对象应该将 spark.master 属性 设置为我在 Oozie 中指定的任何值(在本例中为 yarn),但它不会当我这样做时'工作..

我做错了什么或遗漏了什么吗?
任何帮助将不胜感激!

我设法通过将两个 JAR 放在用户目录 /user/danny/app/ 并将 Jar/py files 参数指定为 ${nameNode}/user/danny/app/env.jar 来解决问题。 运行 它导致抛出 ClassNotFoundException,即使 JAR 位于 HDFS 中的同一文件夹中。要解决这个问题,我必须转到设置并将以下内容添加到选项列表中:--jars ${nameNode}/user/danny/app/app.jar。这样 App 模块也被引用并且应用程序成功运行。