[译] Spark 环境下 Scala 和 Python 两种语言的对比

栏目: Python · 发布时间: 5年前

内容简介:而Apache Spark作为类Hadoop MapReduce的通用并行框架,一款专为大规模数据处理而设计的分布式计算引擎,以其优越的性能,较为完善的生态,受到了大数据从业人员的青睐。

点击上方“ 大数据与人工智能 ”,“星标或置顶公众号”

第一时间获取好内容

[译] Spark 环境下 Scala 和  <a href='https://www.codercto.com/topics/20097.html'>Python</a>  两种语言的对比

本文重点参考文章《Scala vs. Python for Apache Spark》,

链接传送门: https://www.dezyre.com/article/scala-vs-python-for-apache-/213

在部分内容翻译的基础上融入了笔者的些许理解,有兴趣的同学也可以看看原文。

2015年前后,互联网行业中的“ 大数据” 概念掀起一股热潮。

而Apache Spark作为类Hadoop MapReduce的通用并行框架,一款专为大规模数据处理而设计的分布式计算引擎,以其优越的性能,较为完善的生态,受到了大数据从业人员的青睐。

Spark的框架使用Scala编写 (注:Scala是一种运行在 Java 虚拟机上,实现和Java类库互联互通的面向对象及函数式编程语言) 而Spark的开发目前主要使用三种语言:Scala、Python、Java。

相比于Java,Spark中用Scala开发语法简洁许多,且支持类型推断,可大大提升开发效率。 更为重要的是,Java不支持REPL(Read-Evaluate-Print-Loop交互式编程环境),而REPL又对数据处理十分关键(很多时候需要即时查看结果)。

可以说Spark中的开发工作,Scala相对Java胜出了。

那么,一向以简洁易上手,“可读性爆表”著称,且拥有交互式编程环境的Python,在Spark环境下与Scala相比又如何呢?

本文将从以下几个方面来谈。

性能

Python作为一门解释型语言,性能可以说是从业人员诟病最多的一环。

Scala基于Java Virtual Machine,在数据分析处理过程中比Python快上近10倍,另外Scala可以无缝调用Java API,所以它同Hadoop框架(由Java开发)的交互、兼容非常好;Python在这方面就相形见绌了,在Spark环境下想实现同HDFS的交互,开发人员甚至需要使用第三方插件,如hadopy。

同时,用Python代码去调Spark库性能平庸,且在多进程并行之下比等效的Scala代码慢许多。

不过,速度不够,硬件(核数)来凑,Python这种由于语言特性导致的性能弱势,会随着核数的增加而被填补。而当核数充足的情况下,性能也通常不会是我们在Spark开发中决定选择Scala/Python的最主要因素。

上手难度/语法

在Python Console中输入importthis显示出的“Python之禅”,是对Python使用的一篇指导规则,“人生苦短,我用Python”更是业内无数Python程序员奉为圭臬的信条。

[译] Spark 环境下 Scala 和 Python 两种语言的对比

(Python之禅)

阅读一个命名规范良好的Python程序就像阅读英文一样流畅。这种接近伪代码的代码,能够使你高效的解决问题,无论是在Spark中还是其他环境。

此外,Python的中括号(切片操作)真是谁用谁知道,用过都说好。相比之下,Spark编程时用到Scala的take/takeRight方法,以及substring配以indexOf,打包编译几分钟,刚跑起来报个下标越界:-1的异常,着实令人抓狂。

编写Scala代码,通常需要添加并不是很有意义但又不得不加的“val”或“var”关键字,而Python“生死看淡,上来就干”,想一个漂亮的变量名,后面即取即用。

[译] Spark 环境下 Scala 和 Python 两种语言的对比

不过,笔者真的为Scala的API链式调用感到畅快,能一段搞定的话还是比绞尽脑汁去想花里胡哨的变量名来得实在。

此外Scala有些独特的语法规则,像通常不用“return”关键字,将函数体的最后一行作为返回值,可能会让其他语言的 程序员 上手初期感到些许不适,但Spark中有些Scala语法糖特特特别甜 (像RDD入HBase库经过包装之后的API十分简洁明了)。

总得来说,Python语法简单,有着更加标准的程序库,适合简单的逻辑处理,而Scala更适合复杂的工作流。

并发性

CPython解释器中,由于GIL(全局解释器锁)的存在,使用Python写Spark程序时,不管进程有多少线程,每次只有一个CPU在进程中处于活动状态。

[译] Spark 环境下 Scala 和 Python 两种语言的对比

GIL虽然保证了内存管理的线程安全,但每当需要部署新的代码/程序时,就得新启动更多的进程,需要额外的内存开销。在此场景下,Scala就显得更为高效和好用了。

类型安全

产品需求是不断变化的,代码重构是时刻准备的。

[译] Spark 环境下 Scala 和 Python 两种语言的对比

Scala具有优雅的类型推断机制,使得它看上去像是一门动态类型语言,不过,作为一门严格意义的静态类型语言,它令你在省去明确指定类型的同时保证类型安全。

Scala写Spark程序,可以在编译时就捕获到类型不匹配的错误。用静态类型语言重构Spark程序比动态语言容易许多,有时你可能会发觉,更改Python代码后新产生的bug比修复的原有程序的bug还多 (如遇此情形,送上一首《易燃易爆炸》,望笑纳) 。Python中有种哲学叫“duck typing”,类型检查的微妙程度可见一斑。

[译] Spark 环境下 Scala 和 Python 两种语言的对比

Spark集成

Spark框架的原生语言是Scala,当企业级应用需实现某些特定功能,要修改底层源码时,或功能呈现不及预期,需要排查原因时,使用Scala会更加得心应手;在执行调优、优化时,Scala也会更加方便。

Python代码在JVM中会被包装,因此无法控制函数中包含的内容。此外,最新的Spark版本中的一些新功能可能仅在Scala中可用,然后才能在Python中移植。Scala在工程方面相对更有优势。

高级特性/应用

想来,Python当前被看作人工智能领域的首选语言,多少有scikit-learn的功劳,其中集成了各种特征工程API和常用算法。

相比之下,Scala没有足够的数据科学 工具 和库,Spark-mllib中只集成了部分常用的机器学习方法,但优势是实现了分布式,可用于大规模数据处理。

关于交互式分析工具,Scala有Zeppelin,Python有Jupyter,也都可以很好地实现数据分析和可视化,算是平分秋色。流式计算方面,Scala是最佳选择,因为Python通过PySpark调SparkStreaming不及Scala高效和成熟。

结语

本文针对Apache Spark环境下的两种主流语言Scala和Python,从几个维度切入做了分析和对比。

总得来说,Python更加面向分析,而Scala更加面向工程,但它们都是构建数据科学应用程序的优秀语言。

最后提一句,即便一上来就限定了Spark开发编程的大环境,笔者也只是粗略的对两种语言做了比对,丝毫没有也不敢妄言定论孰优孰劣。

若你要强行分出高下,硬是问我哪种更胜一筹,我只能告诉你:

[译] Spark 环境下 Scala 和 Python 两种语言的对比

-end-

[译] Spark 环境下 Scala 和 Python 两种语言的对比


以上所述就是小编给大家介绍的《[译] Spark 环境下 Scala 和 Python 两种语言的对比》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数字乌托邦

数字乌托邦

[美]弗雷德·特纳 / 张行舟、王芳、叶富华、余倩 / 译言·东西文库/电子工业出版社 / 2013-5-1 / 49.80元

20世纪60年代早期,在美国大众眼中,计算机只是冷战中冰冷的机器,然而到了90年代互联网到来之时,计算机却呈现出一个截然不同的世界——它们模拟出了一个数字乌托邦般的协同体,而这正是曾经最反对冷战的嬉皮士们的共同愿景。 本书正是探索这次非同寻常,且颇具讽刺意味的变革的第一本书。作者挖掘出那些在旧金山湾区的先驱者——斯图尔特·布兰德和他的“全球网络”鲜为人知的故事。1968年到1998年期间,通......一起来看看 《数字乌托邦》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具