2014-05-15 39 views
5

我正在使用spark-ec2来运行一些Spark代码。当我将主设置为 “本地”时,则运行正常。但是,当我将master设置为$ MASTER时, 工作人员立即失败,使用java.lang.NoClassDefFoundError为 这些类。工作人员连接到主人,并显示在用户界面中,并尝试运行该任务;但一旦加载它的第一个依赖类(它位于程序集jar中),立即立即引发该异常。Spark工作人员无法在EC2群集上找到JAR

我已经使用sbt-assembly来制作一个带类的jar,使用 jar tvf来确认这些类在那里,并且设置SparkConf来分发 这些类。星火的Web UI确实显示了组装罐子是 添加到类路径: http://172.x.x.x47441/jars/myjar-assembly-1.0.jar

看来,尽管myjar这一组件中包含 类,并且被添加到集群的事实,它没有达到工人 。我该如何解决? (我需要手动复制jar文件 如果是这样,这DIR到我认为SparkConf点添加 罐子被自动做到这一点?)

我在调试试图证明:

  1. 组件罐正在被拷贝到/根/火花/工作/ APP-XXXXXX/1/ (由ssh来工人测定和搜索罐)
  2. 然而,该路径不出现上worker's classpath (由日志确定,显示java命令,但缺乏该文件)

所以,好像我要告诉火花的路径添加到装配 罐子工人的类路径。我怎么做?还是有另一个罪魁祸首? (我花了几个小时试图调试但无济于事!)

+0

一种解决方法,它的工作原理,是对罐子复制到每个工人并将其明确添加到每个工人的“SPARK_CLASSPATH”上。 – SRobertJames

+0

由于上面的问题和评论,SPARK_CLASSPATH现在已被弃用。 – JimLohse

回答

-1

您需要在提交应用程序时注册一个带spark集群的jar,以便可以编辑代码,如下所示。

jars(0) = "/usr/local/spark/lib/spark-assembly-1.3.0-hadoop2.4.0.jar" 
val conf: SparkConf = new SparkConf() 
.setAppName("Busigence App") 
.setMaster(sparkMasterUrl) 
.setSparkHome(sparkHome) 
.setJars(jars); 
0

注意:EC2特定的答案,而不是普通的Spark答案。只是试图回答一年前问过的一个问题,一个问题具有相同的症状,但往往不同的原因,并绊倒了很多人。

如果我正确地理解了这个问题,你会问:“我需要手动复制jar文件吗?如果是,请指向哪个目录?”你说,“并设置SparkConf来分配类”,但你不清楚这是通过spark-env.sh还是spark-defaults.conf完成的?所以,做一些假设,其中最主要的是你在集群模式下运行,这意味着你的驱动器上的一个工人跑,你不知道哪提前一个...然后... ...

答案是肯定的,到类路径中命名的dir。在EC2中,唯一的持久数据存储是/ root/persistent-hdfs,但我不知道这是个好主意。

In the Spark docs on EC2 I see this line

To deploy code or data within your cluster, you can log in and use 
the provided script ~/spark-ec2/copy-dir, which, given a directory 
path, RSYNCs it to the same location on all the slaves. 

SPARK_CLASSPATH

,因为它不赞成星火1.0的我不会用SPARK_CLASSPATH这么一个好主意,就是用它在$ SPARK_HOME/conf目录/火花缺省更换。 conf:

spark.executor.extraClassPath /path/to/jar/on/worker 

这应该是有效的选项。如果您需要在运行中执行此操作,而不是在conf文件中,则建议为“./spark-submit with --driver-class-path来扩充驱动程序类路径”(from Spark docs about spark.executor.extraClassPath并查看其他来源的答案的结尾那)。

但是......你没有使用spark-submit ......我不知道EC2是如何工作的,看着脚本我没弄清楚EC2让你在命令行上提供这些参数。你提到你已经在设置你的SparkConf对象时这么做了,所以如果这对你有用的话。

我在Spark-years看到这是一个很老的问题,所以我想知道你是如何解决它的?我希望这能帮助别人,我学到了很多关于EC2的具体细节。


我必须承认,作为这个限制,它混淆了我在Spark docs that for spark.executor.extraClassPath它说:

用户通常不应该需要设置这个选项

我以为他们意味着大多数人会通过驱动程序配置选项获取类路径。我知道spark-submit的大部分文档都应该像脚本句柄一样在集群周围移动你的代码,但我认为这只是在“独立客户端模式”下,我假设你没有使用,我假设EC2必须是“独立的集群模式“。


更多/背景ON SPARK_CLASSPATH折旧:

更多的背景下,使我认为SPARK_CLASSPATH is deprecated is this archived thread.this one, crossing the other threadthis one about a WARN message when using SPARK_CLASSPATH

14/07/09 13:37:36 WARN spark.SparkConf: 
SPARK_CLASSPATH was detected (set to 'path-to-proprietary-hadoop-lib/*: 
/path-to-proprietary-hadoop-lib/lib/*'). 
This is deprecated in Spark 1.0+. 

Please instead use: 
- ./spark-submit with --driver-class-path to augment the driver classpath 
- spark.executor.extraClassPath to augment the executor classpath 
+0

对于一些非代码事物被格式化为代码感到抱歉,我无法提交这些部分的问题作为blockquote – JimLohse

+0

说完所有上述内容,仍然有部分Spark文档指出如何通过群集推送JAR但即使您可以让驱动程序为您执行此操作,网络流量也是一个不利之处,它仅适用于spark-submit,而不是EC2 http://spark.apache.org/docs/latest/submitting-applications.html#先进的依赖性管理 – JimLohse

相关问题