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

时间:2017-01-11 20:11:14

标签: apache-spark spark-jobserver livy

我正在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())

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

2 个答案:

答案 0 :(得分:8)

如果使用@IBAction func registerAccountButtonWasPressed(sender: UIButton) { let manager = AFHTTPSessionManager() let dob = self.dobTextField.text!.components(separatedBy: "/") let URL = "https://splitterstripeservertest.herokuapp.com/account/create" let params = [ "first_name": firstNameTextField.text!, "last_name": lastNameTextField.text!, "line1": addressLine1TextField.text!, "city": cityTextField.text!, "postal_code": postCodeTextField.text!, "country": countryTextField.text!, "day": UInt(dob[0])! as UInt, "month": UInt(dob[1])! as UInt, "year": UInt(dob[2])! as UInt] as [String : Any] let serializer = AFHTTPRequestSerializer() serializer.stringEncoding = String.Encoding.utf8.rawValue manager.requestSerializer = serializer manager.requestSerializer.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") manager.responseSerializer = AFHTTPResponseSerializer() manager.post(URL, parameters: params, progress: nil, success: {(_ task: URLSessionDataTask, _ responseObject: Any) -> Void in print(responseObject) if let response = responseObject as? [String: Any] { UIAlertView(title: response["status"] as! String?, message: response["message"] as! String?, delegate: nil, cancelButtonTitle: "OK").show() print(response) } }, failure: {(_ task: URLSessionDataTask?, _ error: Error) -> Void in self.handleError(error as NSError) }) } ,则必须手动将JAR文件上载到群集并运行命令。在运行之前必须准备好一切

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

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

答案 1 :(得分:2)

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

  • 安全性主要侧重于减少群集对外界的暴露。如果未正确配置群集,攻击者可以在访问您的数据与执行群集上的任意代码之间执行任何操作。

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

  • 响应性。面向Spark API的用户主要是(在PySpark中)专用的。使用外部服务基本上可以解决这个问题。