我在Scala中编写了一个使用Spark的应用程序
该应用程序包含两个模块 - App
模块,其中包含具有不同逻辑的类,以及Env
模块,其中包含环境和系统初始化代码以及实用程序功能。
入口点位于Env
,初始化后,它在App
中创建一个类(根据args
,使用Class.forName
)并执行逻辑。 />
这些模块被导出到2个不同的JAR中(即env.jar
和app.jar
)。
当我在本地运行应用程序时,它执行得很好。下一步是将应用程序部署到我的服务器。我使用Cloudera的CDH 5.4。
我使用Hue使用Spark任务创建一个新的Oozie工作流,其中包含以下参数:
yarn
cluster
myApp
lib/env.jar,lib/app.jar
env.Main
(在Env
模块中)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
但是,当我将Spark主模式和模式参数留空时,一切正常,但是当我以编程方式检查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
),但它不是没有当我这样做时工作..
我有什么不对或错过的吗? 任何帮助将不胜感激!
答案 0 :(得分:2)
我设法通过将两个JAR放在用户目录/user/danny/app/
中并将Jar/py files
参数指定为${nameNode}/user/danny/app/env.jar
来解决问题。即使JAR位于HDFS中的同一文件夹中,运行它也会导致ClassNotFoundException
被抛出。要解决这个问题,我必须转到设置并将以下内容添加到选项列表中:--jars ${nameNode}/user/danny/app/app.jar
。这样也引用了App
模块,并且应用程序成功运行。