Apache spark Spark应用程序-管理依赖项jar

Apache spark Spark应用程序-管理依赖项jar,apache-spark,cloudera-cdh,Apache Spark,Cloudera Cdh,我是spark的新手,正在寻找管理依赖性jar的最佳实践 我可以想出几个选择 将所有内容(应用程序和第三方jar)都包含在胖jar中 优点:依赖项通过maven pom文件控制,什么 我们用来编译、构建和测试的依赖项jar会转到不同的位置 环境(QA/Prod等) 缺点:由于它是一个胖罐子,maven存储库会被填满,需要时间来恢复 构建并将jar从构建机器推送到部署机器,等等 jar中只有与应用程序相关的代码,第三方jar导出为--conf spark.executor.extraClassPa

我是spark的新手,正在寻找管理依赖性jar的最佳实践

我可以想出几个选择

  • 将所有内容(应用程序和第三方jar)都包含在胖jar中
  • 优点:依赖项通过maven pom文件控制,什么 我们用来编译、构建和测试的依赖项jar会转到不同的位置 环境(QA/Prod等)

    缺点:由于它是一个胖罐子,maven存储库会被填满,需要时间来恢复 构建并将jar从构建机器推送到部署机器,等等

  • jar中只有与应用程序相关的代码,第三方jar导出为--conf spark.executor.extraClassPath=
  • 优点:应用程序jar体积小,易于构建,可以从构建环境推送到目标环境

    缺点:可能导致maven pom依赖项列表和类路径列表中指定的jar名称列表不一致,还需要 确保版本完好无损

    我们正在使用Cloudera发行版和Spark 2.3.0

    另外,在这两种情况下,我们不需要包括spark,默认情况下,与Hadoop相关的JAR将在spark executors中可用,因此无需在每次运行spark应用程序时将其传输到executor,对吗

    我们如何知道(Cloudera)spark executor中默认提供的所有依赖项jar是什么,这样我们就不会将其导出或包含在胖jar中

    将第三方JAR保存在HDFS中并将其导出到类路径中,而不是将JAR保存在客户机/边缘节点中并从那里导出,这样做好吗


    是否有任何最佳实践或建议?非常感谢您提供任何参考资料。

    这里有很多问题,但我会尽力回答

    此外,在这两种情况下,我们不需要包括spark、hadoop相关的JAR 默认情况下,spark executors中会提供,因此无需 每次运行spark应用程序时都将其传输给executor,是吗 对吧?

    haddop等所需的所有JAR都包含在每个节点的Cloudera存储库中,因此您无需复制它们或将它们包含在spark submit中。您可能需要做的唯一一件事是使用cloudera发行版的正确路径定义SPARK_HOME(在cloudera中,SPARK 1.6和2.0+之间也有区别,因此请确保使用正确的SPARK_HOME)

    例如,对于CM 5.10,Spark 2要导出的Spark home为:

    export SPARK_HOME="/cloudera/parcels/SPARK2/lib/spark2"
    
    我们如何知道默认情况下所有依赖项jar都是什么 在(cloudera)spark executor中提供,因此我们不会导出或 把它放在肥罐子里

    您可以转到cloudera中保存JAR的共同响应目录。您可以通过以下方式检查现有JAR:

    ls /cloudera/parcels/SPARK2/lib/spark2/jars
    
    运行某些东西总是有一个简单的选项,如果缺少一个jar,您将在执行错误中看到它

    将第三方JAR保存在HDF中并将其导出到 类路径,而不是将JAR保留在客户机/边缘节点中 出口吗

    在默认的CLASSATH中添加JAR几乎是一个坏主意,因为类路径是具有根访问权限的区域,所以您必须要求管理员在那里添加文件(这会减慢速度),我不确定更新到更高版本时会发生什么。您可以在所有节点中创建一个额外的存储库,在其中存储应用程序需要的所有额外JAR,并创建一个简单的sftp脚本,将所有JAR分发到所有机器中的该路径

    然后添加conf/spark-defaults.conf

    spark.driver.extraClassPath /my_extra_jars_path/* 
    spark.executor.extraClassPath /my_extra_jars_path/*
    
    或者在spark submit的add--jars选项中,所有jar的完整路径都用逗号分隔

    另一种方法是在Hdfs中存储额外的罐子,这将是非常好的,但我没有使用它

    在这两个选项中,我主张不要在Jar中包含所有依赖项,构建时间和分发速度较慢,使用一个只包含相关代码的轻型Jar,并使用simle sftp分发脚本管理依赖项,以复制专用目录(或者在hdfs中,如果可能的话)中所有节点中的Jar