Spark,Fat Jar的替代品

Car*_*cas 8 java scala gradle amazon-emr apache-spark

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

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

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

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

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

更新

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

vaq*_*han 7

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

使用fat-jar,你必须安装Java并启动Spark应用程序需要执行java -jar [your-fat-jar-here].如果您想要从Web应用程序启动应用程序,则很难自动化它.

使用SparkLauncher,您可以选择从另一个应用程序启动Spark应用程序,例如上面的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();

}
Run Code Online (Sandbox Code Playgroud)

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

这里

  • setSparkHome("/ home/knoldus/spark-1.4.0-bin-hadoop2.6")用于设置内部使用的spark home来调用spark submit.

  • .setAppResource("/ home/knoldus/spark_launcher-assembly-1.0.jar")用于指定我们的spark应用程序的jar.

  • .setMainClass("SparkApp")火花程序的入口点即驱动程序.

  • .setMaster("local [*]")设置master的地址,从这里开始我们现在在loacal机器上运行它.

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

SparkLauncher与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


小智 0

制作胖罐子确实要花很多时间。我能够通过删除运行时不需要的依赖项来进行一些优化。但这确实很痛苦。