如何加快基本的pyspark语句

时间:2017-10-30 21:45:35

标签: performance apache-spark pyspark

作为一个新的spark / pyspark用户,我在本地模式下运行AWS t2.small ec2实例上的脚本(用于测试目的)。

即。举个例子:

from __future__ import print_function
from pyspark.ml.classification import NaiveBayesModel
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.sql import SparkSession
import ritc (my library)
if __name__ == "__main__":
    spark = SparkSession\
        .builder\
        .appName("NaiveBayesExample")\
        .getOrCreate()
    ...
    request_dataframe = spark.createDataFrame(ritc.request_parameters, ["features"])
    model = NaiveBayesModel.load(ritc.model_path)
    ...
    prediction = model.transform(ritc.request_dataframe)
    prediction.createOrReplaceTempView("result")
    df = spark.sql("SELECT prediction FROM result")
    p = map(lambda row: row.asDict(), df.collect())
    ...

我遗漏了代码,专注于我的问题,关于基本火花语句的速度,例如spark = SparkSession ......

使用日期时间库(上面未显示),我有三个最大的“罪魁祸首”的时间安排:

'spark = SparkSession...' -- 3.7 secs
'spark.createDataFrame()' -- 2.6 secs
'NaiveBayesModel.load()'  -- 3.4 secs

为什么这些时间这么久?

为了给出一点背景知识,我想提供将上述脚本公开为REST服务的功能。

In supervised context:
- service #1: train a model and save the model in the filesystem
- service #2: load the model from the filesystem and get a prediction for a single instance

(注意:#2 REST请求将在不同的,未预料到的(随机)时间运行。一般模式将是:      - >曾经:训练模型 - 期待很长的周转时间      - >多次:请求单个实例的预测 - 期望以毫秒为单位的周转时间 - 例如。 < 400毫秒。

我的想法有缺陷吗?我是否可以期望显着提高性能以实现亚秒级周转时间的目标?

在我遇到的关于火花表现的大多数文章/视频/讨论中,重点都放在“繁重”的任务上。上面的“火车模型”任务可能确实是一个“重型” - 我预计在生产中运行时会出现这种情况。但是“请求预测单个实例”需要做出响应。

有人可以帮忙吗?

感谢您的期待。

科林戈德堡

1 个答案:

答案 0 :(得分:0)

所以ApacheSpark旨在以这种方式使用。如果您的目标是处理预测的流输入数据,您可能需要查看Spark Streaming。您可能还想查看其他服务Spark模型的选项,例如PMML或MLeap。