Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon ec2 Spark workers在EC2群集上找不到JAR_Amazon Ec2_Apache Spark - Fatal编程技术网

Amazon ec2 Spark workers在EC2群集上找不到JAR

Amazon ec2 Spark workers在EC2群集上找不到JAR,amazon-ec2,apache-spark,Amazon Ec2,Apache Spark,我正在使用spark-ec2运行一些spark代码。当我把师父设置为 “本地”,然后运行良好。但是,当我将master设置为$master时, 工人立即失败,java.lang.NoClassDefFoundError为 上课。工人连接到主机,并显示在UI中,并尝试运行任务;但在加载第一个依赖类(位于程序集jar中)后立即引发该异常 我已经使用sbt assembly创建了一个包含类的jar,使用 jar tvf,并将SparkConf设置为distribute 上课。Spark Web UI确

我正在使用spark-ec2运行一些spark代码。当我把师父设置为 “本地”,然后运行良好。但是,当我将master设置为$master时, 工人立即失败,java.lang.NoClassDefFoundError为 上课。工人连接到主机,并显示在UI中,并尝试运行任务;但在加载第一个依赖类(位于程序集jar中)后立即引发该异常

我已经使用sbt assembly创建了一个包含类的jar,使用 jar tvf,并将SparkConf设置为distribute 上课。Spark Web UI确实显示了要安装的程序集jar 添加到类路径:

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

我的调试尝试显示:

  • 正在将程序集jar复制到/root/spark/work/app-xxxxxx/1/ (由ssh发送给worker并搜索jar确定)
  • 但是,该路径不会出现在辅助进程的类路径上 (根据显示java-cp但缺少该文件的日志确定)
  • 因此,我似乎需要告诉Spark向程序集添加路径
    jar到工作者的类路径。我该怎么做?还是有其他罪魁祸首?(我花了好几个小时试着调试,但没有用!)

    提交应用程序时,您需要向spark cluster注册一个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);
    

    注:EC2特定答案,而不是一般的Spark答案。我只是想对一年前提出的一个问题给出一个完整的答案,这个问题有着相同的症状,但往往是不同的原因,让很多人困惑不解

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

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

    :

    SPARK\u类路径

    我不会使用SPARK_类路径,因为它在SPARK 1.0中已被弃用,所以最好在$SPARK_HOME/conf/SPARK-defaults.conf中使用它的替代品:

    spark.executor.extraClassPath /path/to/jar/on/worker
    
    这应该是可行的选择。如果您需要在运行中而不是在conf文件中执行此操作,建议使用“/spark submit with--driver class path来扩展驱动程序类路径”(请参阅答案的末尾,以获取关于此问题的另一个来源)

    但是。。。您没有使用spark提交。。。我不知道这在EC2中是如何工作的,查看脚本时,我不知道EC2让您在命令行上提供这些参数的位置。您提到您已经在设置SparkConf对象时这样做了,所以如果这对您有效,请继续使用它

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


    我必须承认,作为对这一点的限制,它让我感到困惑,因为它说:

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

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


    有关SPARK_类路径弃用的详细信息/背景:

    更多的背景让我想到SPARK_类路径和:


    一个可行的解决方法是将jar复制到每个工作人员,并将其显式添加到每个工作人员的
    SPARK_类路径
    。由于上面的问题和评论,SPARK_类路径现在已被弃用。很抱歉,一些非代码内容被格式化为代码,我无法提交问题,因为blockquoteHaving在上面说过这些,Spark文档中仍有一些部分为如何在集群中推送JAR提供了指导,但即使您可以让驱动程序为您这样做,网络流量也是一个不利因素,它只适用于Spark submit,而不是EC2
    spark.executor.extraClassPath /path/to/jar/on/worker
    
    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