13

我正在 Apache Spark 之上构建一个 RESTful API。提供以下 Python 脚本spark-submit似乎可以正常工作:

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())

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

4

2 回答 2

9

如果使用spark-submit,则必须手动将 JAR 文件上传到集群并运行命令。一切都必须在运行前准备好

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

更重要的是,Livy 和 Spark-JobServer 允许您在交互模式下使用 Spark,这是 spark-submit 很难做到的;)

于 2017-01-11T20:21:31.897 回答
2

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

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

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

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

于 2017-01-11T21:11:47.140 回答