5

我已经阅读了十几页文档,似乎:

  1. 我可以跳过学习 scala 部分

  2. API 完全在 python 中实现(我不需要学习 scala 任何东西)

  3. 交互模式与 scala shell 一样完整和快速,故障排除同样容易

  4. 仍然会导入像 numpy 这样的 python 模块(没有残缺的 python 环境)

是否存在无法实现的空缺区域?

4

2 回答 2

8

在最近的 Spark 版本 (1.0+) 中,我们已经实现了下面列出的所有缺少的 PySpark 功能。仍然缺少一些新功能,例如 GraphX 的 Python 绑定,但其他 API 已经实现了近乎平价(包括用于 Spark Streaming 的实验性 Python API)。

我之前的答案转载如下:

Spark 0.9 的原始答案

自我最初回答以来的七个月里发生了很多变化(转载在这个答案的底部):

从 Spark 0.9 开始,PySpark 中缺少的主要功能是:

尽管我们进行了许多性能改进,但 Spark 的 Scala 和 Python API 之间仍然存在性能差距。Spark 用户邮件列表有一个讨论其当前性能的开放线程。

如果您发现 PySpark 中缺少任何功能,请在我们的JIRA 问题跟踪器上开一张新票。

Spark 0.7.2 的原始答案:

Spark Python 编程指南列出了缺少的 PySpark 功能。从 Spark 0.7.2 开始,PySpark 目前缺少对不同 StorageLevels 的 sample()、sort() 和持久性的支持。它还缺少一些添加到 Scala API 的便捷方法。

Java API 在发布时与 Scala API 同步,但从那时起添加了许多新的 RDD 方法,但并非所有这些方法都已添加到 Java 包装器类中。在https://groups.google.com/d/msg/spark-developers/TMGvtxYN9Mo/UeFpD17VeAIJ讨论了如何使 Java API 保持最新。在那个帖子中,我提出了一种自动查找缺失功能的技术,因此只需有人花时间添加它们并提交拉取请求即可。

在性能方面,PySpark 会比 Scala Spark 慢。部分性能差异源于一个奇怪的 JVM 问题,当派生具有大堆的进程时,但有一个开放的拉取请求应该可以解决这个问题。另一个瓶颈来自序列化:目前,PySpark 不要求用户为他们的对象显式注册序列化程序(我们目前使用二进制 cPickle 加上一些批处理优化)。过去,我曾考虑添加对用户可自定义序列化程序的支持,这将允许您指定对象的类型,从而使用更快的专用序列化程序;我希望在某个时候恢复这方面的工作。

PySpark 是使用常规 cPython 解释器实现的,因此像 numpy 这样的库应该可以正常工作(如果 PySpark 是用 Jython 编写的,情况就不会如此)。

PySpark 很容易上手;只需下载预构建的 Spark 包并运行pyspark解释器就足以在您的个人计算机上对其进行测试,并让您评估其交互功能。如果你喜欢使用 IPython,你可以IPYTHON=1 ./pyspark在你的 shell 中使用 IPython shell 来启动 Pyspark。

于 2013-06-29T03:21:30.157 回答
2

我想补充一些关于为什么许多使用这两种 API 的人都推荐 Scala API 的观点。如果不指出 Python 与 Scala 的一般弱点以及我自己对用于编写生产质量代码的动态类型和解释语言的厌恶,我很难做到这一点。因此,这里有一些特定于用例的原因:

  1. 性能永远不会像 Scala 那样好,不是按顺序,而是按分数,这部分是因为 python 被解释了。随着 Java 8 和 JIT 技术成为 JVM 和 Scala 的一部分,这种差距在未来可能会扩大。

  2. Spark 是用 Scala 编写的,因此在 Scala 中调试 Spark 应用程序、学习 Spark 的工作原理以及学习如何使用 Spark 要容易得多,因为您可以很容易地按 CTRL + B 进入源代码并阅读较低级别的 Spark 以搞清楚到底是怎么回事。我发现这对于优化作业和调试更复杂的应用程序特别有用。

  3. 现在我的最后一点可能看起来只是一个 Scala 与 Python 的论点,但它与特定用例高度相关——即规模并行处理。Scala 实际上代表Scalable Language,许多人将此解释为意味着它是专门为缩放和简单的多线程而设计的。这不仅仅是关于 lambda,它是 Scala 从头到脚的特性,使其成为进行大数据和并行处理的完美语言. 我有一些数据科学的朋友,他们习惯了 Python,不想学习一门新语言,但坚持他们的锤子。Python 是一种脚本语言,它不是为这个特定的用例而设计的——它是一个很棒的工具,但不适合这项工作。结果在代码中很明显——它们的代码通常比我的 Scala 代码长 2 到 5 倍,因为 Python 缺乏很多特性。此外,他们发现更难优化他们的代码,因为他们离底层框架更远。

让我这么说吧,如果有人同时了解 Scala 和 Python,那么他们几乎总是会选择使用 Scala API。唯一使用 Python 的 IME 是那些根本不想学习 Scala 的人。

于 2014-07-19T09:41:13.500 回答