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

Dan*_*ill 5 cloudera hue oozie hadoop-yarn apache-spark

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

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

我使用Hue使用Spark任务创建一个新的Oozie工作流,其中包含以下参数:

  • Spark Master: yarn
  • 模式: cluster
  • 应用名称: myApp
  • Jars/py文件: lib/env.jar,lib/app.jar
  • 主类:( env.MainEnv模块中)
  • 参数: app.AggBlock1Task

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

当我运行工作流时,它会抛出一个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
Run Code Online (Sandbox Code Playgroud)

然而,当我离开星火主和模式参数为空,这一切工作正常,但是当我检查spark.master编程设置为local[*],而不是yarn.此外,在观察日志时,我在Oozie Spark动作配置下遇到了这个:

--master
null
--name
myApp
--class
env.Main
--verbose
lib/env.jar,lib/app.jar
app.AggBlock1Task
Run Code Online (Sandbox Code Playgroud)

我假设我做得不对 - 没有设置Spark master和mode参数并且运行应用程序spark.master设置为local[*].据我所知,SparkConf在应用程序中创建一个对象应该将spark.master属性设置为我在Oozie中指定的任何属性(在这种情况下yarn),但是当我这样做时它只是不起作用..

有什么我做错了或错过了吗?
任何帮助都感激不尽!

Dan*_*ill 2

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