为什么使用 Livy 或 spark-jobserver 而不是简单的 Web 框架?

why Livy or spark-jobserver instead of a simple web framework?

我正在 Apache Spark 之上构建 RESTful API。使用 spark-submit 服务以下 Python 脚本似乎工作正常:

import cherrypy
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('myApp').getOrCreate()
sc = spark.sparkContext

class doStuff(object):
    @cherrypy.expose
    def compute(self, user_input):
        # do something spark-y with the user input
        return user_output

cherrypy.quickstart(doStuff())

但是谷歌搜索我看到了类似 Livy and spark-jobserver 的东西。我阅读了这些项目的文档和一些教程,但我仍然不完全理解 Livy 或 spark-jobserver 相对于使用 CherryPy 或 Flask 或任何其他 Web 框架的简单脚本的优势。与可扩展性有关吗?上下文管理?我在这里错过了什么?如果我想要的是一个用户不多的简单 RESTful API ,Livy 或 spark-jobserver 值得麻烦吗?如果是,为什么?

如果你使用spark-submit,你必须手动上传JAR文件到集群和运行命令。一切都必须在运行

之前准备好

如果您使用 Livy 或 spark-jobserver,则可以通过编程方式上传文件和 运行 作业。您可以添加其他应用程序,这些应用程序将连接到同一集群并在下一个作业中上传 jar

此外,Livy 和 Spark-JobServer 允许您在交互模式下使用 Spark,这在 spark-submit 中很难做到;)

我不会具体评论使用 Livy 或 spark-jobserver,但至少有三个原因可以避免在您的应用程序中直接嵌入 Spark 上下文:

  • 安全性,主要侧重于减少集群对外界的暴露。如果集群配置不正确,则获得对您的应用程序的控制权的攻击者可以在访问您的数据和在您的集群上执行任意代码之间做任何事情。

  • 稳定。 Spark 是一个复杂的框架,有许多因素会影响其长期性能和稳定性。解耦 Spark 上下文和应用程序允许您优雅地处理 Spark 问题,而无需完全停机您的应用程序。

  • 响应能力。面向 Spark API 的用户大部分(仅在 PySpark 中)是同步的。使用外部服务基本可以帮你解决这个问题