Spark 在罐子里提交我的作业

Spark Submitting my Job in a Jar

我正在浏览 Apache Spark 文档,我了解到我可以使用 spark-submit 将我的作业提交到包装在 Jar 中的 Spark 集群管理器。

我的问题是,比方说,我的工作有很多依赖项,结果可能是我有一个大约几 MB 大小的 jar 文件。

这应该如何运作?如果我想动态提交这些作业,我该怎么做?

是否有在 运行 时动态地将这些作业创建为 jar 文件的有效用例?我会这样做吗?请原谅我的问题,因为我是 Apache Spark 的新手。

所以有很多方法可以做事,Spark 作业 jar 可以变得非常大,所有的依赖项都打包在里面。有些人喜欢像 IBM Spark Kernel 这样的东西的方法能够提交代码在共享的 Spark 上下文中使用现有的 jar,但该解决方案可能并不适合所有人。

动态提交作业也可以通过 Spark 作业服务器使用长 运行 Spark 上下文来完成,但您也可以使用 spark-submit 动态提交作业。

作业完成后,您无需担心 jar 文件,它会被清理(尽管如果您确实使用长 运行 解决方案之一,如作业服务器或 spark 内核清理发生不同)。

我只使用 standard-issue Spark,所以诚然,与 IBM 或其他发行版相关的其他答案中引用的解决方案可能更接近您的需求。

当我读到你的问题时,你问,

"Is there a valid use case to create these jobs as jar files dynamically at run time?"

现在我能听到你在问,“我应该在每次调用 Spark 时 运行 gradle 构建(或任何构建系统)吗?” =11=]

这听起来很疯狂,但实际上如果您更新 Java 代码并希望使用 spark-submit 运行 它($SPARK_HOME/bin 中的 spark-submit 脚本),你需要关闭你的 slaves 和 master 并重新启动它们来读取新的 jar。 (但是你的名字是 SparkR 所以你有罐子?:)

现在您真的要问了,有没有这样的用例,每次您 运行 Spark 时,您都会将 jar 发送到整个集群,即使它们没有改变? 基本上答案是可以的,但是如果你有大罐子,它会产生不必要的网络流量。相对而言,取决于您的实际工作创造了多少流量/洗牌。

但是最好的方法(恕我直言)是将您的 jar 放在集群的每个节点上的 /usr/local/spark/jars 目录中 和(使用 spark-submit $SPARK_HOME/bin) 中的脚本将 --jars 参数与 comma-delineated 罐子列表一起使用。

我发现 --jars 需要一个 comma-delineated 列表来回答另一个问题,如果我能再次找到它,我会 link 它在这里。我提出这个问题是为了记录一个更广泛的答案(稍后 link 它)以获得使用 --jars 提交 jar 的所有选项。

根据文档:

使用 spark-submit 时,应用程序 jar 以及任何 jar 包含在 --jars 选项中的将自动转移到 集群。 Spark 使用以下 URL 方案来允许不同的

传播罐子的策略:

file: - 绝对路径和 file:/ URI 由驱动程序的 HTTP 文件服务器提供,每个执行程序从驱动程序 HTTP 服务器拉取文件。

hdfs:、http:、https:、ftp: - 这些按预期从 URI 中提取文件和 JAR

local: - 以 local:/ 开头的 URI 应作为本地文件存在于每个工作节点上。这意味着不会有网络 IO 发生,并且适用于被推送到每个的大型 files/JARs worker,或通过 NFS、GlusterFS 等共享

希望对您有所帮助。