Spark工作人员无法在EC2集群上找到JAR

2023-11-22

我正在使用 Spark-ec2 运行一些 Spark 代码。当我将 master 设置为 “本地”,那么它运行良好。但是,当我将 master 设置为 $MASTER 时, 工作人员立即失败,并出现 java.lang.NoClassDefFoundError 课程。 Workers 连接到 master,并显示在 UI 中,并尝试运行任务;但一旦加载第一个依赖类(位于程序集 jar 中),就会立即引发该异常。

我已经使用 sbt-assemble 制作了一个带有类的 jar,并使用确认 jar tvf 类在那里,并设置 SparkConf 进行分发 课程。 Spark Web UI 确实显示了程序集 jar 添加到类路径:http://172.x.x.x47441/jars/myjar- assembly-1.0.jar

看来,尽管 myjar- assembly 包含 类,并且正在添加到集群中,但它还没有到达 工人。我该如何解决? (需要手动复制jar文件吗? 如果是这样,到哪个目录?我认为 SparkConf 的要点是添加 jars 是自动执行此操作的)

我的调试尝试表明:

  1. 程序集 jar 正在复制到 /root/spark/work/app-xxxxxx/1/(通过ssh到worker并搜索jar来确定)
  2. 但是,该路径不会出现在工作线程的类路径中(根据日志确定,日志显示 java -cp 但缺少该文件)

所以,看来我需要告诉 Spark 添加程序集的路径 jar 到工人的类路径。我怎么做?还是另有罪魁祸首? (我花了几个小时尝试调试这个但无济于事!)


注意:EC2 特定答案,而不是一般 Spark 答案。只是试图完善一年前提出的问题的答案,这个问题具有相同的症状,但往往有不同的原因,并且困扰了很多人。

如果我正确理解了这个问题,那么您会问:“我需要手动复制 jar 文件吗?如果需要,复制到哪个目录?”你说,“并设置 SparkConf 来分发类”,但你不清楚这是通过 Spark-env.sh 还是 Spark-defaults.conf 完成的?因此,做出一些假设,主要的一个是您正在集群模式下运行,这意味着您的驱动程序在其中一个工作人员上运行,而您事先不知道是哪一个......然后......

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

在 EC2 上的 Spark 文档中我看到这一行:

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 to Expand the driver classpath”(来自 Spark 文档关于spark.executor.extraClassPath并参阅另一个来源的答案末尾)。

但是......你没有使用spark-submit......我不知道它在EC2中是如何工作的,查看脚本我没有弄清楚EC2让你在命令行上提供这些参数。您提到您已经在设置 ​​SparkConf 对象时执行了此操作,因此如果这对您有用,请坚持下去。

我在 Spark 年中看到这是一个非常古老的问题,所以我想知道你是如何解决它的?我希望这对某人有帮助,我在研究 EC2 的细节方面学到了很多东西。


我必须承认,作为对此的限制,它让我感到困惑Spark 文档为spark.executor.extraClassPath它说:

用户通常不需要设置此选项

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


有关 SPARK_CLASSPATH 弃用的更多/背景:

更多背景让我思考 SPARK_CLASSPATH此存档线程已被弃用。 and 这一条,穿过另一条线 and 这是关于使用 SPARK_CLASSPATH 时出现的 WARN 消息:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark工作人员无法在EC2集群上找到JAR 的相关文章

随机推荐