Spark,Fat Jar的替代品

时间:2017-09-19 19:10:00

标签: java scala apache-spark gradle amazon-emr

我知道至少有两种方法可以将我的依赖项放入Spark EMR作业中。一种是创建一个胖罐,另一种是使用--packages选项指定你想要在spark中提交哪些包。

胖罐需要很长时间才能拉上拉链。这是正常的吗? ~10分钟。我们是否可能错误配置了它?

命令行选项很好,但容易出错。

还有其他选择吗?我喜欢它,如果(已经存在)一种方法将依赖列表包含在带有gradle的jar中,然后让它下载它们。这可能吗?还有其他选择吗?

更新:我发布了部分答案。我在原始问题中没有说清楚的一点是,我关心你何时遇到依赖冲突,因为你有不同版本的jar。

更新

感谢您提供有关减少依赖项数量或尽可能提供使用的响应。为了这个问题,我们假设运行jar所需的依赖项最少。

4 个答案:

答案 0 :(得分:5)

如果必须在Spark发射器的帮助下通过某些应用程序启动Spark作业,则可以使用Spark启动器。您可以配置jar patah,而无需创建fat.jar来运行应用程序。

对于胖子罐,您必须安装Java,并且启动Spark应用程序需要执行java -jar [yy-fat-jar-here]。如果要从Web应用程序启动该应用程序,很难实现自动化。

使用SparkLauncher,您可以选择从另一个应用程序(例如,上面的Web应用程序。容易得多。

import org.apache.spark.launcher.SparkLauncher

SparkLauncher extends App {

val spark = new SparkLauncher()
.setSparkHome("/home/knoldus/spark-1.4.0-bin-hadoop2.6")
.setAppResource("/home/knoldus/spark_launcher-assembly-1.0.jar")
.setMainClass("SparkApp")
.setMaster("local[*]")
.launch();
spark.waitFor();

}

代码: https://github.com/phalodi/Spark-launcher

这里

  • setSparkHome(“ / home / knoldus / spark-1.4.0-bin-hadoop2.6”)用于设置Spark Home,在内部用于调用Spark提交。

  • .setAppResource(“ / home / knoldus / spark_launcher-assembly-1.0.jar”)用于指定我们的Spark应用程序的jar。

  • .setMainClass(“ SparkApp”)Spark程序(即驱动程序)的入口点。

  • .setMaster(“ local [*]”)设置主地址,从此处开始,现在我们在本地计算机上运行它。

  • .launch()只是启动我们的Spark应用程序

What are the benefits of SparkLauncher vs java -jar fat-jar?

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-SparkLauncher.html

https://spark.apache.org/docs/2.0.0/api/java/org/apache/spark/launcher/SparkLauncher.html

http://henningpetersen.com/post/22/running-apache-spark-jobs-from-applications

答案 1 :(得分:2)

例如,在Cloudera的集群上,已经有一些在所有节点上可用的库,这些库将在类路径上提供给驱动程序,执行程序。 这些是例如spark-core,spark-hive,hadoop等

版本由Cloudera分组,例如您有spark-core-cdh5.9.0,其中cdh5.9.0后缀表示Cloudera实际验证了带有该后缀的所有库,它们可以正常工作。 您唯一要做的就是使用具有相同组后缀的库,并且您不应有任何类路径冲突。

允许的是: 根据Maven提供的范围在应用程序中配置依赖项 ,这样它们就不会成为胖子的一部分,而是从节点上的类路径解析的。 / p>

您没有写出您拥有什么样的集群,但是也许您可以使用类似的方法。

maven阴影插件可用于创建胖子jar,它还允许设置要包含在jar中的库,而那些不在列表中的库则不包括在内。

我认为此答案Spark, Alternative to Fat Jar中描述了类似的东西,但使用S3作为依赖项存储。

答案 2 :(得分:0)

脂肪罐确实需要花费大量时间来制作。通过删除运行时不需要的依赖项,我能够优化一点。但这确实是一种痛苦。

答案 3 :(得分:0)

HubSpot有一个(部分)解决方案:SlimFast。您可以在http://product.hubspot.com/blog/the-fault-in-our-jars-why-we-stopped-building-fat-jars找到解释,然后在https://github.com/HubSpot/SlimFast

找到代码

实际上它会存储它在s3上所需的所有罐子,所以当它构建时它会在没有包装罐子的情况下完成它,但是当它需要运行时它会从s3获取它们。因此,您的构建速度很快,下载时间也不长。

我认为如果这也能够在上传时遮蔽jar的路径,为了避免冲突,那么这将是一个完美的解决方案。

相关问题