作为一个新的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毫秒。
我的想法有缺陷吗?我是否可以期望显着提高性能以实现亚秒级周转时间的目标?
在我遇到的关于火花表现的大多数文章/视频/讨论中,重点都放在“繁重”的任务上。上面的“火车模型”任务可能确实是一个“重型” - 我预计在生产中运行时会出现这种情况。但是“请求预测单个实例”需要做出响应。
有人可以帮忙吗?
感谢您的期待。
科林戈德堡答案 0 :(得分:0)
所以ApacheSpark旨在以这种方式使用。如果您的目标是处理预测的流输入数据,您可能需要查看Spark Streaming。您可能还想查看其他服务Spark模型的选项,例如PMML或MLeap。