我正在阅读Apache Spark文档,我知道我可以使用spark-submit将我的工作提交给包含在Jar中的Spark集群管理器。
我的问题是,让我说,我有一个有很多依赖关系的工作,结果可能是我有一个jar文件,其大小为几MB。
这应该如何运作?如果我想动态提交这些工作,我该怎么办呢?
是否有一个有效的用例在运行时动态创建这些作业作为jar文件?我会这样做吗?请原谅我的问题,因为我对使用Apache Spark完全不熟悉。
答案 0 :(得分:1)
我只使用标准问题Spark,因此在与IBM或其他发行版相关的其他答案中引用的解决方案可能更接近您的需求。
在我正在阅读你的问题时,你会问,
“是否有一个有效的用例将这些作业创建为jar文件 在运行时动态?“
现在我可以听到你问,“我每次打电话给Spark时都应该运行gradle build(或者哪个构建系统)?”
这听起来很疯狂,但实际上如果您更新Java代码并希望使用spark-submit($ SPARK_HOME / bin中的spark-submit脚本)运行它,则需要关闭奴隶并掌握并重新启动它们以进行读取新的罐子。 (但是你的名字是SparkR所以你有罐子吗?:)
现在您真的在问,是否有一个用例,每次运行Spark时,即使它们没有更改,您也可以在整个集群中运送您的jar?基本上答案是您可以,但如果你有大罐子,它会产生不必要的网络流量。相对来说,取决于你的实际工作创造了多少流量/洗牌。
但最好的方法(恕我直言)是将您的jar放在群集的每个节点上的/ usr / local / spark / jars 目录中(使用$ SPARK_HOME中的spark-submit脚本) / bin)将--jars参数与逗号描述的jar列表一起使用。
我发现--jars想要一个逗号描述的列表来回答另一个问题,如果我能再次找到它,我会在这里链接它。我提出这个问题来记录一个更广泛的答案(将在以后链接),以获得用--jars提交罐子的所有选项。
根据文档:
使用spark-submit时,应用程序jar和任何jar 包含在--jars选项中将自动转移到 集群。 Spark使用以下URL方案来允许不同的
传播罐子的策略:
文件: - 绝对路径和文件:/ URI由驱动程序的HTTP文件服务器提供,每个执行程序从驱动程序HTTP服务器提取文件。
hdfs:,http:,https:,ftp: - 这些按预期从URI下拉文件和JAR
local: - 以local:/开头的URI应该作为每个工作节点上的本地文件存在。这意味着没有网络IO 已发生,适用于推送到每个文件/ JAR的大型文件/ JAR 工作者,或通过NFS,GlusterFS等共享
希望有所帮助。
答案 1 :(得分:0)
因此,有很多方法可以做,而且所有依赖项都打包在一起,Spark作业jar可以变得非常大。有些人喜欢IBM Spark Kernel之类的方法能够提交使用的代码共享Spark上下文中的现有jar,但该解决方案可能不适合所有人。
动态提交作业也可以使用长期运行的Spark Context与Spark作业服务器完成,但您也可以使用spark-submit动态提交作业。
一旦完成一个作业,你就不必担心jar文件了,它会被清理掉(虽然如果你使用其中一个长期运行的解决方案,比如作业服务器或者火花内核,清理就会发生不同的事情)。