scala和python之间的API兼容性?
Posted
技术标签:
【中文标题】scala和python之间的API兼容性?【英文标题】:API compatibility between scala and python? 【发布时间】:2013-06-18 16:26:21 【问题描述】:我已经阅读了十几页文档,似乎:
我可以跳过学习 scala 部分
API 完全用 python 实现(我不需要学习 scala 任何东西)
交互模式与 scala shell 一样完整和快速,故障排除同样简单
仍然会导入像 numpy 这样的 Python 模块(没有残缺的 Python 环境)
是否存在无法实现的不足之处?
【问题讨论】:
【参考方案1】:在最近的 Spark 版本 (1.0+) 中,我们实现了下面列出的所有缺少的 PySpark 功能。仍然缺少一些新功能,例如用于 GraphX 的 Python 绑定,但其他 API 已经实现了近乎平价(包括用于 Spark Streaming 的实验性 Python API)。
我之前的答案转载如下:
Spark 0.9 的原始答案
自我最初回答(转载于本回答底部)以来的七个月里发生了很多变化:
Spark 0.7.3 修复了“forking JVMs with large heaps”问题。 Spark 0.8.1 添加了对 persist()、sample() 和 sort() 的支持。 即将发布的 Spark 0.9 版本增加了对 custom Python -> Java serializers 的部分支持。 Spark 0.9 还添加了Python bindings for MLLib (docs)。 我已经实现了tools to help keep the Java API up-to-date。从 Spark 0.9 开始,PySpark 中缺少的主要功能有:
zip() / zipPartitions。 支持读取和写入非文本输入格式,例如 HadoopSequenceFile
(对此有一个开放的 pull request)。
Support for running on YARN clusters.
Cygwin 支持(不过,Pyspark 在 Windows powershell 或 cmd.exe 下运行良好)。
Support for job cancellation。
尽管我们对性能进行了许多改进,但 Spark 的 Scala 和 Python API 之间仍然存在性能差距。 Spark 用户邮件列表中有an open thread 讨论其当前性能。
如果您发现 PySpark 中缺少任何功能,请在我们的 JIRA issue tracker 上开新票。
Spark 0.7.2 的原始答案:
Spark Python Programming Guide 有一个缺少 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 问题,当派生具有大堆的进程时,但有一个 open pull request 应该可以解决这个问题。另一个瓶颈来自序列化:目前,PySpark 不要求用户为他们的对象显式注册序列化程序(我们目前使用二进制 cPickle 加上一些批处理优化)。过去,我曾考虑添加对用户可自定义序列化程序的支持,这将允许您指定对象的类型,从而使用更快的专用序列化程序;我希望在某个时候恢复这方面的工作。
PySpark 是使用常规 cPython 解释器实现的,因此像 numpy 这样的库应该可以正常工作(如果 PySpark 是用 Jython 编写的,情况就不会如此)。
PySpark 很容易上手;只需downloading a pre-built Spark package 并运行pyspark
解释器就足以在您的个人计算机上对其进行测试,并让您评估其交互功能。如果你喜欢使用 IPython,你可以在你的 shell 中使用IPYTHON=1 ./pyspark
来使用 IPython shell 启动 Pyspark。
【讨论】:
乔希,您能否更新当前版本的答案,即。 0.8.1?到目前为止,Python API 似乎更加同步,而且我个人只需要通常的 map、reduce 和 join 函数,所以我想我会安全地使用 Python。现在的性能场景是什么?叉子问题似乎已解决。序列化怎么样?它能否匹配 Java/Scala 类可写序列化(事先了解对象类型,减少 I/O)性能?另外,一个可能很愚蠢的问题 - 循环在 Python 中似乎很慢,你认为这会成为一个问题吗? 我的基本顾虑是,如果我同样精通 Java 和 Python,考虑到性能和内存使用情况,我应该选择哪一个? @Nilesh 我已经更新了 Spark 0.8.1 和 Spark 0.9 的答案。 非常感谢乔希。 :) 请澄清这一点:“支持在 YARN 集群上运行”缺失 - 这是否意味着在使用 PySpark 时我将无法在我的 Hadoop 集群旁边运行 Spark 或访问/写入 HDFS 数据集? 【参考方案2】:我想补充几点说明为什么许多使用过这两种 API 的人都推荐 Scala API。如果不指出 Python 与 Scala 的一般弱点以及我自己对用于编写生产质量代码的动态类型和解释语言的厌恶,我很难做到这一点。所以这里有一些特定于用例的原因:
性能永远不会像 Scala 那样好,不是按顺序,而是按分数,这部分是因为 python 是解释的。随着 Java 8 和 JIT 技术成为 JVM 和 Scala 的一部分,这种差距在未来可能会扩大。
Spark 是用 Scala 编写的,因此在 Scala 中调试 Spark 应用程序、了解 Spark 的工作原理以及学习如何使用 Spark 要容易得多,因为您可以非常轻松地 CTRL + B 进入源代码并阅读下面的代码Spark 的级别以了解正在发生的事情。我发现这对于优化作业和调试更复杂的应用程序特别有用。
现在我的最后一点可能看起来只是一个 Scala 与 Python 的论点,但它与特定用例高度相关 - 即 规模 和 并行处理 . Scala 实际上代表 Scalable Language,许多人将此解释为意味着它是专门设计的,考虑到了可伸缩性和简单的多线程。这不仅仅是关于 lambda,它是 Scala 的从头到脚的特性,这使得它成为进行大数据和并行处理的完美语言。我有一些数据科学的朋友,他们习惯了 Python,不想学习一门新语言,但坚持他们的锤子。 Python 是一种脚本语言,它不是为这个特定的用例而设计的——它是一个很棒的工具,但不适合这项工作。结果在代码中很明显——它们的代码通常比我的 Scala 代码长 2 到 5 倍,因为 Python 缺乏很多特性。此外,由于离底层框架更远,他们发现更难优化代码。
让我这么说吧,如果有人同时了解 Scala 和 Python,那么他们几乎总是会选择使用 Scala API。唯一使用 Python 的 IME 是那些根本不想学习 Scala 的人。
【讨论】:
如果人们想在本地使用 Python 对象怎么办? Python 有大量有用的库。 sklearn、nltk 等 @trianta2 没错,但 Scala 现在也有相当多的库。我发现我在 Scala 中编写一个方法所花费的时间比我找到一个方法、使用它、然后在 Python 中调试我的代码所花费的时间要少得多。 Scala 比 Python 先进得多,编写自己的库的工作量很小。以上是关于scala和python之间的API兼容性?的主要内容,如果未能解决你的问题,请参考以下文章