我正在使用spark-ec2来运行一些Spark代码。当我把主人设置为 “本地”,然后运行正常。但是,当我将master设置为$ MASTER时, 工作者立即失败,使用java.lang.NoClassDefFoundError 课程。工作人员连接到主人,并显示在UI中,并尝试运行任务;但是一加载第一个依赖类(在程序集jar中)就立即引发异常。
我已经使用sbt-assembly来制作一个带有类的jar,并确认使用 jar tvf表示类存在,并设置SparkConf进行分发 课程。 Spark Web UI确实显示了程序集jar 添加到类路径: http://172.x.x.x47441/jars/myjar-assembly-1.0.jar
似乎尽管myjar-assembly包含了 class,并且正被添加到集群中,它没有到达 工作人员。我该如何解决? (我需要手动复制jar文件吗? 如果是这样,哪个目录?我认为SparkConf的重点在于 罐子是自动执行此操作)
我的调试尝试显示:
所以,似乎我需要告诉Spark添加程序集的路径 jar到worker的classpath。我怎么做?或者还有另一个罪魁祸首? (我花了好几个小时试图调试这个,但没有用!)
答案 0 :(得分:0)
注意:EC2特定的答案,而不是一般的Spark答案。只是试图找出一年前提出的一个问题的答案,这个问题具有相同的症状,但往往是不同的原因并且绊倒了很多人。
如果我正确地理解了这个问题,你会问,“我是否需要手动复制jar文件?如果是这样,哪个dir?”你说,“并设置SparkConf来分发类”,但你不清楚这是通过spark-env.sh还是spark-defaults.conf完成的?所以做出一些假设,主要的是你的集群模式运行,这意味着你的驱动程序在其中一个工作人员上运行而你事先不知道哪个...然后...
答案是肯定的,对于类路径中命名的目录。在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
我不会使用SPARK_CLASSPATH,因为它从Spark 1.0开始就被弃用了,所以最好在$ SPARK_HOME / conf / spark-defaults.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年看到这是一个非常古老的问题,所以我想知道你是如何解决它的?我希望这对某人有所帮助,我学到了很多关于EC2细节的研究。
我必须承认,作为对此的限制,它让我感到困惑的是Spark docs that for spark.executor.extraClassPath它说:
用户通常不需要设置此选项
我认为他们的意思是大多数人会通过驱动程序配置选项获取类路径。我知道大多数用于spark-submit的文档使得它应该像脚本处理在集群中移动你的代码但我认为这只是在“我认为你没有使用的”独立客户端模式“中,我认为EC2必须是”独立的“集群模式。“
更多/背景SPARK_CLASSPATH弃用:
更多背景让我认为SPARK_CLASSPATH is deprecated is this archived thread.和this one, crossing the other thread以及this 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
答案 1 :(得分:-1)
您需要在提交应用时注册带有火花簇的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);