【问题标题】:Spark Application - Managing dependency jarsSpark 应用程序 - 管理依赖项 jar
【发布时间】:2019-10-18 23:35:36
【问题描述】:

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

我能想到几个选项

  1. 将所有内容(应用程序和第三方 jar)都包含在一个 fat jar 中

优点:依赖是通过maven pom文件控制的,什么 我们用来编译、构建和测试的依赖 jars 去不同的 环境(QA/Prod 等)

缺点:由于它是一个胖 jar,maven 存储库已满,需要时间 构建并将 jar 从构建机器推送到部署机器等

  1. 只有与应用程序相关的代码驻留在 jar 中,第三方 jar 导出为 --conf spark.executor.extraClassPath=

优点:应用程序 jar 很小,易于构建并从构建环境推送到目标环境

缺点:可能会导致maven pom依赖列表和classpath列表中指定的jar名列表不一致,也需要make 确保版本完好无损

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

同样在这两种情况下,我们都不需要包含 spark,Hadoop 相关的 jars 默认会在 spark executors 中可用,所以每次我们运行 spark 应用程序时都不需要将其传输到 executor,对吗?

我们如何知道默认情况下所有依赖 jar 将在 (Cloudera) spark executor 中可用,以便我们不会将其导出或包含在胖 jar 中

将第三方 jars 保存在 HDFS 中并将其导出到类路径中而不是将 jars 保存在客户端/边缘节点中并从那里导出是否很好?

是否有任何最佳做法或建议?有任何参考吗?

【问题讨论】:

    标签: apache-spark cloudera-cdh


    【解决方案1】:

    这里有很多问题,但我会尽量解决它们。

    同样在这两种情况下,我们都不需要包含 spark、hadoop 相关的 jar 默认情况下,在 spark executors 中可用,所以不需要 每次我们运行 spark 应用程序时都将其传输到执行程序,是吗 对吧?

    haddop 等所需的所有 jar 包都包含在每个节点的 Cloudera 存储库中,因此您无需复制它们或将它们包含在您的 spark 提交中。您唯一需要做的就是为您的 cloudera 分发定义 SPARK_HOME 并使用正确的路径(在 cloudera 中,Spark 1.6 和 2.0+ 之间也有区别,因此请确保使用正确的 SPARK_HOME)。

    例如,对于 CM 5.10,要为 Spark 2 导出的 Spark 主页是:

    export SPARK_HOME="/cloudera/parcels/SPARK2/lib/spark2"
    

    我们如何知道默认情况下所有的依赖 jar 是什么 在(cloudera)火花执行器中可用,这样我们就不会导出或 把它放在胖罐子里

    你可以去cloudera中保存jar包的对应目录。您可以检查现有的罐子:

    ls /cloudera/parcels/SPARK2/lib/spark2/jars
    

    总是有一个简单的选项来运行某些东西,如果缺少一个 jar,你会在执行错误中看到它。

    最好将第三方 jars 保存在 hdfs 中并将其导出到 类路径而不是将 jars 保存在客户端/边缘节点中并从那里 导出吗?

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

    然后添加你的 conf/spark-defaults.conf

    spark.driver.extraClassPath /my_extra_jars_path/* 
    spark.executor.extraClassPath /my_extra_jars_path/*
    

    或在您的 spark 提交中添加 --jars 选项,其中所有 jar 的完整路径以逗号分隔。

    将额外的 jar 存储在 Hdfs 中的替代方法会非常好,但我没有使用它。

    在这两个选项之间,我主张不要在 Jar 中包含所有依赖项,并且构建时间和分发速度较慢,并且有一个仅包含相关代码的轻量级 jar,并使用简单的 sftp 分发脚本来管理依赖项以复制所有 jar专用目录中的节点(如果可能,也可以在 hdfs 中)。

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2011-10-19
      • 2012-11-22
      • 2016-08-01
      • 1970-01-01
      • 2023-01-05
      相关资源
      最近更新 更多