为什么spark.ml不实现任何spark.mllib算法?

时间:2015-10-20 12:47:24

标签: machine-learning apache-spark pyspark apache-spark-mllib apache-spark-ml

Spark MLlib Guide之后我们可以读到Spark有两个机器学习库:

  • spark.mllib,建立在RDD之上。
  • spark.ml,构建于Dataframes之上。

根据StackOverflow上的thisthis问题,Dataframe比RDD更好(和更新),应尽可能使用。

问题是我想使用常见的机器学习算法(例如:Frequent Pattern MiningNaive Bayes等)和spark.ml(对于数据帧)不提供此类方法,只有spark.mllib(对于RDD)提供此算法。

如果Dataframes比RDD更好并且推荐指南建议使用spark.ml,为什么不能在该lib中实现常见的机器学习方法?

这里遗漏的是什么?

1 个答案:

答案 0 :(得分:14)

Spark 2.0.0

目前,Spark正在向DataFrame API强烈推动RDD API的持续弃用。虽然有多少本土" ML"算法正在增长下面强调的要点仍然有效,内部许多阶段直接使用RDD实现。

另请参阅:Switch RDD-based MLlib APIs to maintenance mode in Spark 2.0

Spark< 2.0.0

我想主要的缺点是spark.ml算法通常不会对DataFrame进行操作。所以在实践中,更多的是拥有ml包装器而不是其他任何东西。甚至本机ML实现(如ml.recommendation.ALS内部使用RDDs。)

为什么不在DataFrames之上从头开始实现所有内容?最有可能的原因是,只有非常小的机器学习算法子集实际上可以从当前在Catalyst中实现的优化中受益,更不用说使用DataFrame API / SQL有效且自然地实现了。

  • 大多数ML算法都需要高效的线性代数库,而不是表格处理。使用基于成本的线性代数优化器可能是一个有趣的补充(我认为已经有一个),但现在看起来没有什么可以获得的。
  • DataFrames API几乎无法控制数据。 你不能使用分区器 *,你当时不能访问多个记录(我的意思是整个分区),你只限于一组相对较小的类型和操作,你不能使用可变数据结构等。
  • Catalyst应用本地优化。如果您传递SQL查询/ DSL表达式,它可以分析它,重新排序,应用早期预测。所有这些都是伟大但典型的可扩展算法需要迭代处理。所以你真正想要优化的是一个完整的工作流程,而单独的DataFrame并不比普通的RDD快,并且取决于操作实际上可能更慢。
  • Spark中的迭代处理,尤其是连接,需要对分区数进行精细控制,否则为weird things happen。 DataFrames无法控制分区。此外,DataFrame / Dataset 不提供本机检查点功能(在Spark 2.1中修复),这使得迭代处理几乎不可能没有丑陋的黑客攻击
  • 忽略低级实现细节某些算法组(如FPM)不能很好地适应ML管道定义的模型。
  • 许多优化仅限于本机类型,而不是VectorUDT等UDT扩展。

DataFrames还有一个问题,它与机器学习无关。当您决定在代码中使用DataFrame时,您几乎可以获得静态类型和类型推断的所有好处。如果你认为它是一个问题或者没有问题,这是非常主观的,但有一点肯定,它在Scala世界中并不自然。

关于更好,更新,更快,我会看看Deep Dive into Spark SQL’s Catalyst Optimizer,特别是与quasiquotes相关的部分:

  

下图显示quasiquotes让我们生成的代码具有与手动调优程序类似的性能。

*这已在Spark 1.6中更改,但仍限于默认HashPartitioning