1

我正在尝试在 Google Dataproc 上运行 Spark 作业。然而,正如通常所见,Spark Driver 的初始化占用了很大一部分执行时间。我想知道使用同一个 JavaSparkContext 实例在 Google Dataproc 上运行多个 Spark 作业的好方法是什么,这样我就不会因为 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();
}
4

1 回答 1

0

Dataproc 目前基于 YARN 进行资源分配,因为这允许我们为基于 Hadoop 的作业(Hive、Pig、Hadoop MR)和 Spark 作业提供单一接口。这样做的缺点是,当您启动一个新的 (Java)SparkContext 时,分配 Spark AppMaster 和工作程序会产生开销。我认为 Dataproc 没有为您提供内置答案,而且我认为任何易于完成的解决方案都意味着您将不再使用 Dataproc Jobs API 来提交单个作业。

虽然 Dataproc 本身目前无法通过作业 API 提供低延迟 Spark 作业,但您可以运行 Dataproc 集群并将 Spark Job Server 指向 Dataproc 集群。您可以在 github 上找到有关作业服务器的更多信息https://github.com/spark-jobserver/spark-jobserver。使用作业服务器时,您应该能够创建 Spark 上下文,然后将上下文重用于以后的作业。您还需要确保将作业服务器配置为在 yarn-client 模式下运行。这意味着您创建的每个上下文仍然会产生 YARN 分配的启动成本,但每个上下文只会产生一次。

如果您的 REST 服务器在无法进行任意网络调用的环境(例如 AppEngine)中运行,您可能需要调查一个系统,该系统将消息发布到云 pubsub,然后在 GCE 中运行一个组件,该组件订阅消息然后提交代表您的 AppEngine 应用程序向 Spark 作业服务器发送作业。

于 2016-03-02T19:15:58.347 回答