Spark环境下Scala和Python两种语言的对比_pyspark和scalaspark的区别_AcceptedLin的博客-程序员秘密

技术标签: Spark  Python  

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

 

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相比又如何呢?

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

1、性能

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

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

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

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

 

2、上手难度/语法

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

图片

(Python之禅)

 

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

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

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

图片

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

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

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

 

3、并发性

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

图片

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

 

4、类型安全

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

图片

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

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

 

图片

 

5、Spark集成

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

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

 

6、高级特性/应用

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

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

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

 

结语

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

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

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

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013185349/article/details/114253257

智能推荐

看懂Class文件的装载流程_angliuji2722的博客-程序员秘密

Class文件的加载过程ClassLoader的工作模式类的热加载1 Class文件的装载流程只有被java虚拟机装载的Class类型才能在程序中使用(注意装载和加载的区别)1.1 类装载的条件Class只有在必须要使用的时候才会被装载,Java虚拟机不会无条件的装载Class类型。Java虚拟机规定:一个类或者接口在初次使用时,必须进行初始化。这里的使...

arkit与现实世界距离比_如何使用ARKit和Pusher构建实时增强现实测量应用程序_cumichun6193的博客-程序员秘密

arkit与现实世界距离比by Esteban Herrera 由Esteban Herrera 如何使用ARKit和Pusher构建实时增强现实测量应用程序 (How to Build a Real-Time Augmented Reality Measuring App with ARKit and Pusher)Augmented reality (AR) is all about m...

Python手写汉字(中文)识别~单字/多字推荐模式_python手写汉字识别_Color Space的博客-程序员秘密

基于Python, Pyqt5, OpenCV, TensorFlow的手写汉字(中文)识别。效果演示——单字推荐模式:手写汉字(中文)识别演示~单字推荐模式效果演示——多字推荐模式:手写汉字(中文)识别演示~多字推荐模式...

详解易经64卦-傅佩荣有声系列2_127ool的博客-程序员秘密

【app内容简介】傅佩荣先生的经典讲座《详解易经64卦》。节目列表:-------------------------包罗万象_易经的基本概念自强不息_乾卦(上)自强不息_乾卦(下)厚德载物_坤卦创业维艰_屯卦草创启蒙_蒙卦守时待命_需卦做事谋始_讼卦纵横天下_师卦舍逆取顺_比卦以小蓄大_小畜卦以礼待人_履卦天地交融_泰卦

Python实现微信抢红包_python抢红包代码_云焰的博客-程序员秘密

首先我们需要使用一个IDE工具叫Airtest。Airtest Ide工具安装下载地址是Airtest的官网:http://airtest.netease.com/,下载后截图如下:运行AirtestIDE.exe,出现如下登录窗口,r可以已github账号登录,进入如下界面点进Authorize AirtestProject,就进入了Airte...

随便推点

FileGDB API for linux 学习系列之一,编译例子程序___风__的博客-程序员秘密

FileGDB AIP for linux年后已经发布一段时间了,功能还是很强大的,其一共包括6个文件夹以及一个README文件,如下所示: 192.168.100.228 [sde filegdbapi]$ lsdoc include lib license README samples src其中      doc:      包括所有的帮助信息,      include: 包括所有的头文件      lib:          包括所有的库文

java基础知识入门大全(十年经验总结)_renlianggee的博客-程序员秘密

一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。java语言是跨平台,jvm不是跨平台的。JRE(Java Runtime Environment):java的运行环境,包括jvm+java的核心类库。JDK(Java D...

小米手机与计算机如何连接网络连接,小米手机连接不上电脑怎么办 图文教你小米手机怎么连接电脑..._CN队长的博客-程序员秘密

小米手机都是Android系统改版过来了,连接电脑前必须打开usb调试了否则手机连接电脑之后手机助手无法发现此款手机哦,下面我来给大家演示一下具体的连接方法。通用安卓手机连接电脑方法1.小米手机连接电脑我们需要在电脑中安装一款手机助手了,如360手机助手2.然后,用数据线将手机和电脑连接起来。小米手机如何连接电脑?小米连接不上电脑怎么办3.现在虽然是数据线与电脑连接了,但是你会发现360助手并没有...

springboot 项目中读取资源文件内容 如图片、文档文件_diaolong123123的博客-程序员秘密

1 问题描述:在 springboot 项目中有时候会需要读取一些资源文件,例如 office的 docx 文档或者 png、jpg的图片。在多模块项目中资源文件需要放到启动项目的 Resources 文件夹示例代码如下:InputStream pngInStream = Thread.currentThread().getContextClassLoader().getRe...

meethigher-腾讯课堂自动签到_"setinterval(function(){document.getelementsbyclas_言成言成啊的博客-程序员秘密

腾讯课堂腾讯课堂实现自动化原文链接腾讯课堂以及文库下载实现自动化打开chrome浏览器(其他的也可以,chrome最好啦)。打开开发者工具,直接将代码复制到console栏,按enter键即可。如果还不会用,就点击上面的那个链接。1 开启自动任务自动送花开启一个3秒送花的定时器:let flower=setInterval(function (){ document.getElementsByClassName("toolbar-icon")[2].click(); cons

vs2017 开始自己的第一个深度学习例子——MNIST分类(基于TensorFlow框架)_悲恋花丶无心之人的博客-程序员秘密

这是针对于博客vs2017安装和使用教程(详细)的深度学习例子——MNIST分类项目新建示例目录一、新建项目二、运行代码三、生成结果一、新建项目1.项目创建参照博主文章:vs2017 开始自己的第一个Python程序2.输入代码:# -*- coding: utf-8 -*-#获得数据集from tensorflow.examples.tutorials.m...

推荐文章

热门文章

相关标签