对多个作业使用相同的javasparkcontext,以防止在spark驱动程序初始化时使用时间

icnyk63a  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(240)

我试图在googledataproc上运行spark jobs。然而,正如它通常看到的,spark驱动程序的初始化占用了大量的执行时间。我想知道什么是一个很好的方式来运行多个工作的Spark在谷歌dataproc使用相同的示例javasparkcontext,这样我就不会失去每个工作性能由于Spark驱动程序初始化。目前,我的代码如下所示:

public static void main(String[] args) {

    SparkConf configuration = new SparkConf().setAppName("App");
    final JavaSparkContext context = new JavaSparkContext(configuration);

    // Do stuff

    // Stop connection to Java Spark
    context.stop();
}
5t7ly7z5

5t7ly7z51#

dataproc目前基于yarn进行资源分配,因为这允许我们为基于hadoop的作业(hive、pig、hadoop mr)和spark作业提供单一接口。这样做的缺点是,当您启动一个新的(java)sparkcontext时,会有分配spark appmaster和worker的开销。我不认为dataproc有一个内置的答案,我认为任何解决方案,很容易实现将意味着你将不再使用dataproc作业api提交个别作业。
虽然dataproc本身目前无法通过jobsapi提供低延迟的spark作业,但您可以运行dataproc集群并将spark作业服务器指向dataproc集群。您可以在github上找到更多关于作业服务器的信息https://github.com/spark-jobserver/spark-jobserver. 使用作业服务器时,您应该能够创建spark上下文,然后为以后的作业重用该上下文。您还需要确保将作业服务器配置为以客户机模式运行。这意味着您创建的每个上下文仍然会产生Yarn分配的启动成本,但每个上下文只会产生一次。
如果您的rest服务器运行在不能进行任意网络调用的环境中(例如appengine),则您可能需要调查一个系统,该系统将消息发布到cloud pubsub,然后在gce中运行一个组件,该组件订阅消息,然后代表您的appengine应用程序将作业提交到spark作业服务器。

相关问题