Spark 应用程序 - 管理依赖 jar

Spark Application - Managing dependency jars

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

我可以想到几个选项

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

Pros: Dependencies are controlled through maven pom file, what dependency jars we use to compile, build and test go to different environments (QA/Prod etc)

Cons: Since it is a fat jar, maven repository fills up, takes time to build and push the jar from build machine to deployment machine, etc

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

Pros: application jar is small, easy to build and push from build to target environments

Cons: may lead to inconsistency between maven pom dependency list and list of jar names specified in classpath list, also need to make sure versions are intact

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

另外,在这两种情况下,我们都不需要包含 spark,Hadoop 相关的 jar 默认情况下在 spark 执行器中可用,因此不需要每次我们 运行 spark 应用程序时都将其传输到执行器,是吗?对吗?

我们怎么知道默认情况下所有的依赖 jar 将在 (Cloudera) spark 执行器中可用,这样我们就不会将其导出或包含在 fat jar 中

将第三方 jar 保存在 HDFS 中并将其导出到类路径中而不是将 jar 保存在 client/edge 节点中并从那里导出是否好?

有什么最佳做法或建议吗?任何参考表示赞赏?

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

Also in both cases we do not need to include spark,hadoop related jars by default would be available in spark executors so no need to transport it to executor every time we run spark application, is it right?

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"

how do we know what are all the dependency jars by default will be available in (cloudera) spark executor so that we do not export or include it in fat jar

你可以到cloudera中存放jar包的对应目录。您可以使用以下命令检查现有的罐子:

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

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

it is good to keep third party jars in hdfs and export it in the classpath instead of keeping jars in client/edge node and from there export it?

在默认的 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 选项,所有 jars 的完整路径以逗号分隔。

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

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