gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:03:45 25 4
gpt4 key购买 nike

我正在使用 spark-ec2 来运行一些 Spark 代码。当我将 master 设置为
“本地”,然后它运行良好。但是,当我将 master 设置为 $MASTER 时,
worker 立即失败, java.lang.NoClassDefFoundError 为
类(class)。 worker 连接到 master,并显示在 UI 中,并尝试运行任务;但是一旦它加载了它的第一个依赖类(它在程序集 jar 中),就会立即引发该异常。

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

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

我的调试尝试表明:

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

  • 所以,似乎我需要告诉 Spark 将路径添加到程序集
    jar 到 worker 的类路径。我怎么做?还是有另一个罪魁祸首? (我花了几个小时试图调试它,但无济于事!)

    最佳答案

    注意:EC2 特定的答案,而不是一般的 Spark 答案。只是想对一年前提出的一个问题做一个完整的回答,这个问题有相同的症状,但通常是不同的原因,让很多人绊倒。

    如果我正确理解了这个问题,你会问,“我需要手动复制 jar 文件吗?如果是,复制到哪个目录?”你说,“并设置 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 中感到困惑。它说:

    Users typically should not need to set this option



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

    更多/关于 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

    关于amazon-ec2 - Spark 工作人员无法在 EC2 集群上找到 JAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23687081/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com