VB_*_*VB_ 4 java rest apache-spark spring-data-hadoop
问题是您需要启动单独的JVM来创建每个作业具有不同RAM数量的单独会话。
如何在不手动生成单独的JVM的情况下同时提交几个Spark应用程序?
我的应用程序在单个JVM中的单个服务器上运行。对于每个JVM范例,Spark会话似乎存在问题。Spark范式说:
1 JVM => 1 app => 1 session => 1 context => 1 RAM/executors/cores config
Run Code Online (Sandbox Code Playgroud)
我希望每个Spark应用程序具有不同的配置,而无需手动启动额外的JVM。配置:
spark.executor.cores
spark.executor.memory
spark.dynamicAllocation.maxExecutors
spark.default.parallelism
您已经开始长时间运行,大约需要4-5个小时才能完成工作。该作业与CONFIGS会话中运行spark.executor.memory=28GB
,spark.executor.cores=2
。现在,您要根据用户需求启动5-10秒的工作,而无需等待4-5个小时。这个细小的工作需要1GB的RAM。你会怎么做?从长期运行的工作阶段提交微小的工作?比它将要求28GB((
Separate JVM per SparkContext for isolation (EXPERIMENTAL)
,这意味着spawn new JVM per context
对于一个用例,这现在要清楚得多。有两种可能的解决方案:
如果您需要这些作业之间的共享数据,请使用FAIR计划程序和(REST-)前端(SparkJobServer,Livy等也是如此)。您也不需要使用SparkJobServer,如果您有固定的作用域,那么它应该相对容易编码。我已经看到项目朝这个方向发展。您所需要的只是一个事件循环和一种将传入查询转换为Spark查询的方法。从某种意义上说,我希望有一个库来覆盖这个用例,因为当您在基于Spark的应用程序/框架上工作时,几乎总是要构建的第一件事。在这种情况下,您可以根据您的硬件调整执行程序的大小,Spark将管理您的作业计划。利用Yarn的动态资源分配,如果您的框架/应用程序处于空闲状态,则Yarn还将释放资源(杀死执行程序)。 有关更多信息,请阅读此处:http : //spark.apache.org/docs/latest/job-scheduling.html
如果不需要共享数据,请使用YARN(或其他资源管理器)以公平的方式将资源分配给两个作业。YARN具有公平的调度模式,您可以为每个应用程序设置资源需求。如果您认为这很适合您,但是需要共享数据,那么您可能需要考虑使用Hive或Alluxio提供数据接口。在这种情况下,您将运行两个spark-submit,并在集群中维护多个驱动程序。围绕“火花提交”构建附加的自动化功能可以帮助您减少烦恼,并使最终用户更加透明。这种方法也是高延迟的,因为资源分配和SparkSession初始化或多或少地占用固定时间。