scala 和 python 之间的 API 兼容性?

2024-02-07

我读了十几页文档,似乎是:

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

  2. API完全用python实现(我不需要学习scala)

  3. 交互模式与 scala shell 一样完整、快速,并且故障排除同样简单

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

是否存在无法实现的不足之处?


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

我之前的回答转载如下:

Spark 0.9 的原始答案

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

  • Spark 0.7.3 修复了“使用大堆分叉 JVM”问题。
  • Spark 0.8.1 添加了对 persist()、sample() 和 sort() 的支持。
  • 即将发布的 Spark 0.9 版本添加了部分支持自定义 Python -> Java 序列化器 https://github.com/apache/incubator-spark/pull/146.
  • Spark 0.9 还添加了MLLib 的 Python 绑定 https://github.com/apache/incubator-spark/pull/283 (docs https://github.com/apache/incubator-spark/pull/322).
  • 我已经实施了帮助保持 Java API 最新的工具 https://cwiki.apache.org/confluence/display/SPARK/Java+API+Internals.

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

  • zip() / zip分区 https://spark-project.atlassian.net/browse/SPARK-977.
  • 支持读写非文本输入格式,例如 HadoopSequenceFile(有一个开放的拉取请求 https://github.com/apache/incubator-spark/pull/263为了这)。
  • 支持在 YARN 集群上运行 https://spark-project.atlassian.net/browse/SPARK-1004.
  • Cygwin 支持(不过,Pyspark 在 Windows powershell 或 cmd.exe 下工作正常)。
  • 支持取消工作 https://spark-project.atlassian.net/browse/SPARK-986.

尽管我们已经做出了许多性能改进,但 Spark 的 Scala 和 Python API 之间仍然存在性能差距。 Spark 用户邮件列表有一个开放的线程 http://apache-spark-user-list.1001560.n3.nabble.com/Python-API-Performance-td1048.html讨论其当前的表现。

如果您发现 PySpark 中缺少任何功能,请在我们的网站上开具新票证JIRA 问题跟踪器 https://spark-project.atlassian.net/issues/?jql=project%20%3D%20SPARK%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20PySpark%20ORDER%20BY%20priority%20DESC.

Spark 0.7.2 的原始答案:

The Spark Python 编程指南 http://spark-project.org/docs/0.7.2/python-programming-guide.html有一个缺少的 PySpark 功能的列表。从 Spark 0.7.2 开始,PySpark 目前缺少对sample()、sort() 和不同存储级别的持久性的支持。它还缺少一些添加到 Scala API 中的便捷方法。

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

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

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

PySpark 上手非常容易;简单地下载预构建的 Spark 包 http://spark-project.org/downloads/并运行pyspark解释器应该足以在您的个人计算机上对其进行测试,并让您评估其交互功能。如果你喜欢使用IPython,你可以使用IPYTHON=1 ./pyspark在您的 shell 中使用 IPython shell 启动 Pyspark。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scala 和 python 之间的 API 兼容性? 的相关文章

随机推荐