Scala 使用小数据集激发性能

Scala 使用小数据集激发性能,scala,apache-spark,data-science,Scala,Apache Spark,Data Science,我正在测试以下工作流: 从大量数据中构建模型。(Python) 使用该模型在生产服务器中执行评估。(斯卡拉) 我正在使用一个带有向量索引器和GBTRegressor的管道。我有5个输入列(目前。最终,我们希望添加更多)。我也许可以只使用GBTRegressor,或者如果它有什么不同的话,甚至可以使用另一个模型 步骤1在由8台机器组成的集群上大约需要15分钟,这很好。第2步估计单个值大约需要100毫秒。我们希望将其作为API调用的一部分返回,因此100ms太长 我知道spark适用于大型数据集,这

我正在测试以下工作流:

  • 从大量数据中构建模型。(Python)
  • 使用该模型在生产服务器中执行评估。(斯卡拉)
  • 我正在使用一个带有向量索引器和GBTRegressor的管道。我有5个输入列(目前。最终,我们希望添加更多)。我也许可以只使用GBTRegressor,或者如果它有什么不同的话,甚至可以使用另一个模型

    步骤1在由8台机器组成的集群上大约需要15分钟,这很好。第2步估计单个值大约需要100毫秒。我们希望将其作为API调用的一部分返回,因此100ms太长

    我知道spark适用于大型数据集,这种缓慢可能是由于处理该数据集的开销造成的,但是从大型数据集构建模型并在大型数据集上运行该模型似乎是一种常见的用例。我可以使用为较小的数据集设计的东西,但这样我就很难从大数据集构建模型

    有什么解决办法吗?我想继续使用spark,但是有没有办法让第二个操作执行得更快一些?我错过什么了吗

    下面是我代码中运行缓慢部分的一些摘录:

    val spark = SparkSession.builder()
        .master("local")
        .appName("Rendition Size Estimate")
        .config("spark.ui.enabled",false)
        .getOrCreate()
    model = PipelineModel.load(r.getPath)
    
     ....
    
    val input = RenditionSizeEstimator.spark.createDataFrame(Seq(
        (0.0, Vectors.dense(x1, x2, x3, x4, x5))
      )).toDF("label", "features")
    val t = model.transform(input)
    return t.head().getDouble(3) //column three is the prediction
    
    相关Qs:


    更新:最后一个是寻找如何服务于预测。我已经知道了(一种方法),但我关心的是性能。

    我对Spark PipelineModel“实时”服务的最佳选择是

    要使用它,您必须:

    • 使用MLeap实用程序序列化Spark模型
    • 在MLeap中加载模型(不需要SparkContext或任何Spark依赖项)
    • 用JSON(不是数据帧)创建输入记录
    • 使用MLeap为您的记录打分
    这适用于Spark MLlib中已经存在的任何管道阶段(撰写本文时LDA除外)。然而,如果使用自定义估计器/转换器,事情可能会变得更复杂一些

    关于表演:

    依赖Spark上下文的API可以优化,以在大约100毫秒内处理查询,这对于许多企业需求来说往往太慢。例如,对于许多请求,营销平台的响应时间不超过5毫秒。MLeap以亚毫秒的性能提供复杂管道的执行


    如果100毫秒太多,那么你选择了一个错误的工具。然而,构建模型和服务模型是完全不同的关注点。有许多工具是为生产电离火花模型而设计的。