使用 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.jar
和 app.jar
)。
当我 运行 在本地应用程序时,它执行得很好。下一步是将应用程序部署到我的服务器。我用的是 Cloudera 的 CDH 5.4.
我使用 Hue 创建了一个带有 Spark 任务的新 Oozie 工作流,参数如下:
- 火花大师:
yarn
- 模式:
cluster
- 应用名称:
myApp
- Jars/py 个文件:
lib/env.jar,lib/app.jar
- 主要 class:
env.Main
(在 Env
模块中)
- 参数:
app.AggBlock1Task
然后我将 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
模块也被引用并且应用程序成功运行。
我用 Scala 编写了一个使用 Spark 的应用程序。
该应用程序由两个模块组成 - App
模块,其中包含具有不同逻辑的 classes,以及 Env
模块,其中包含环境和系统初始化代码,以及实用程序功能。
入口点位于Env
,初始化后在App
中创建一个class(根据args
,使用Class.forName
)逻辑为已执行。
模块被导出到 2 个不同的 JAR(即 env.jar
和 app.jar
)。
当我 运行 在本地应用程序时,它执行得很好。下一步是将应用程序部署到我的服务器。我用的是 Cloudera 的 CDH 5.4.
我使用 Hue 创建了一个带有 Spark 任务的新 Oozie 工作流,参数如下:
- 火花大师:
yarn
- 模式:
cluster
- 应用名称:
myApp
- Jars/py 个文件:
lib/env.jar,lib/app.jar
- 主要 class:
env.Main
(在Env
模块中) - 参数:
app.AggBlock1Task
然后我将 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
模块也被引用并且应用程序成功运行。