使用小数据集的Spark性能

时间:2018-04-11 15:27:06

标签: scala apache-spark data-science

我正在测试以下工作流程:

  1. 从大量数据中构建模型。 (Python)的
  2. 使用该模型在生产服务器中执行估算。 (斯卡拉)
  3. 我正在使用带有VectorIndexer的管道,后跟一个GBTRegressor。我有5个输入列(目前为止。最后,我们想添加更多)。我可能只能使用GBTRegressor,或者甚至是其他模型,如果它有所作为。

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

    我知道火花适用于大型数据集,而这种缓慢可能是由于处理这一问题的开销,但是从大型数据集构建模型并在大型数据集上运行模型似乎是一种常见的用途 - 案件。我可以使用为较小数据集设计的东西,但是我将无法从大型数据集构建我的模型。

    是否有某种解决方法?我想坚持使用火花,但有没有办法以更快的速度执行第二次操作?我错过了什么吗?

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

    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
    

    相关问题:

    更新:最后一个正在寻找如何提供预测。我已经知道(单向)如何,但我关注性能。

1 个答案:

答案 0 :(得分:0)

关于提供Spark PipelineModel“realtime”的最佳选择是MLeap

要使用它,您必须:

  • 使用MLeap实用程序序列化Spark模型
  • 在MLeap中加载模型(不需要SparkContext或任何Spark依赖项)
  • 使用JSON(非DataFrame)创建输入记录
  • 使用MLeap为您的记录打分

这适用于Spark MLlib中已有的任何Pipeline Stage(本文撰写时LDA除外)。但是,如果您使用自定义Estimators / Transformers,事情可能会变得更复杂。

关于效果:MLeap FAQ

  

依赖于Spark Context的API可以进行优化,以便在大约100毫秒内处理查询,而这对于许多企业的需求来说往往太慢了。例如,营销平台对于许多请求需要不到5毫秒的响应时间。 MLeap提供具有亚毫秒性能的复杂流水线的执行。