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


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

第一时间获取好内容

640?wx_fmt=gif

640?wx_fmt=png


本文重点参考文章《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程序员奉为圭臬的信条。


640?wx_fmt=png

 (Python之禅)

 

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


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


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



640?wx_fmt=png


 

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


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


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

 


并发性


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


640?wx_fmt=png


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

 

 

类型安全


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

 

640?wx_fmt=png


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


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


640?wx_fmt=png

 


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开发编程的大环境,笔者也只是粗略的对两种语言做了比对,丝毫没有也不敢妄言定论孰优孰劣。


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


640?wx_fmt=png

 

 

-end-



640?wx_fmt=png

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据与智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值