【问题标题】:Spark performance with a small dataset [duplicate]小数据集的 Spark 性能 [重复]
【发布时间】:2018-09-21 13:41:22
【问题描述】:

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

  1. 从大量数据中构建模型。 (Python)
  2. 使用模型在生产服务器中执行估计。 (斯卡拉)

我正在使用带有 VectorIndexer 和 GBTRegressor 的管道。我有 5 个输入列(目前。最终,我们想添加更多)。我也许可以只使用 GBTRegressor,或者如果它有所作为,甚至可以使用其他模型。

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

我知道 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

相关问题:

更新:最后一个正在寻找如何提供预测。我已经知道(一种方式)如何,但我担心性能。

【问题讨论】:

  • 如果 100 毫秒太多,那么您选择了错误的工具。然而,构建模型和服务模型是完全不同的问题。有许多工具专门用于生产 Spark 模型。

标签: scala apache-spark data-science


【解决方案1】:

关于“实时”服务 Spark PipelineModel 的最佳选择是 MLeap。

要使用它,您必须:

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

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

关于表演:MLeap FAQ

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-22
    • 2018-05-04
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多