我试图在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();
}
1条答案
按热度按时间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作业服务器。