基于Spark环境对比Python和Scala语言利弊

摘要:
在数据挖掘中,Python和Scala非常流行。本文总结了Spark环境中这两种语言的特点。在Spark中使用Python的性能成本高于Scala,但它的重要性取决于您正在做什么。与Scala相比,Java或Python是一种灵活而复杂的语言。因此,最好缓慢而安全地使用Scala,而不是快速而严格地使用Python。Python是一种比Scala更友好的语言。Scala无疑是Sparkstreaming的最佳选择,因为Python调用Spark。通过pySpark流式传输,它不如Scala先进和成熟。
在数据挖掘中,Python和Scala语言都是极受欢迎的,本文总结两种语言在Spark环境各自特点。

本文翻译自  https://www.dezyre.com/article/Scala-vs-Python-for-apache-Spark/213

1.性能对比

由于Scala是基于JVM的数据分析和处理,Scala比Python快10倍。当编写Python代码用且调用Spark库时,性能是平庸的,但如果程序涉及到比Python编码还要多的处理时,则要比Scala等效代码慢得多。Python解释器PyPy内置一个JIT(及时)编译器,它很快,但它不提供各种Python C扩展支持。在这样的情况下,对库的C扩展CPython解释器优于PyPy解释器。

使用Python在Spark的性能开销超过Scala,但其重要性取决于您在做什么。当内核数量较少时,Scala比Python快。随着核数的增加,Scala的性能优势开始缩小。

当大量的处理其工作时,性能不是选择编程语言的主要驱动因素。然而,当有重要的处理逻辑时,性能是一个主要因素,Scala绝对比Python提供更好的性能,用于针对Spark程序。

 

2.学习曲线

在用Scala语言编写Spark程序时有几个语法糖,所以大数据专业人员在学习Spark时需要非常小心。程序员可能会发现Scala语法有时会让人发疯。Scala中的一些库很难定义随机的符号运算符,而这些代码可以由没有经验的程序员理解。在使用Scala时,开发人员需要关注代码的可读性。与Scala相比,Java或Python是一个灵活的语法复杂的语言。对Scala开发人员的需求越来越大,因为大数据公司重视能在Spark中掌握数据分析和处理的高效而健壮的开发人员。

Python是为Java程序员学习相对容易的因为它的语法和标准库。然而,Python是不是一个高度并行和可扩展的像SoundCloud或推特系统的理想选择。

学习Scala丰富了程序员对类型系统中各种新抽象的认识,新的函数编程特性和不可变数据。

 

3.并发性

大数据系统的复杂多样的基础结构需要一种编程语言,它有能力集成多个数据库和服务。在大数据的生态系统中,Scala胜在Play框架提供了许多异步库和容易集成的各种并发原语,比如Akka。Scala使开发人员编写高效的、可读性和可维护性的服务而不是。相反,Python不支持的重量级进程并行在用uWSGI时,但它不支持真正的多线程。

当使用Python写Spark程序时,不管进程有多少线程,每次只有一个CPU在Python进程中处于活动状态。这有助于每个CPU核心只处理一个进程,但糟糕的是,每当部署新代码时,需要重新启动更多的进程,还需要额外的内存开销。Scala在这些方面更高效,更容易共事。

 

4.类型安全

当用Spark编程时,开发人员需要根据变化的需求不断地重新编码代码。Scala是静态类型语言,尽管它看起来像一种动态类型语言,因为它具有优雅的类型推断机制。作为静态类型语言,Scala仍然提供编译器来捕获编译时错误。

重构像Scala这样的静态类型语言的程序代码比重构像Python这样的动态语言代码要容易得多且简单。开发人员在修改Python程序代码后常常会遇到困难,因为它造成的bug比修复程序原有的bug要多。所以最好是缓慢而安全地使用Scala,而不是快速的、死地使用Python。

对于小型的特殊实验,Python是一种有效的选择,但它并不像静态语言那样有效地扩展到大型软件工程中。

 

5.易用性

Scala和Python语言在Sparkcontext中有同样的表达,因此通过使用Scala或Python可以实现所需的功能。无论哪种方式,程序员都会创建一个Sparkcontext并调用函数。Python是一种比Scala更便于用户使用的语言。Python不那么冗长,开发人员很容易用Python编写脚本来调用Spark。易用性是一个主观因素,因为它取决于程序员的个人偏好。

 

6.高级特性

Scala编程语言有几个存在类型、宏和隐式。Scala的晦涩难懂的语法可能很难对开发人员可能无法理解的高级特性进行实验。然而,Scala的优势在于在重要的框架和库中使用这些强大的特性。

话虽如此,Scala没有足够的数据科学工具和库,如Python用于机器学习和自然语言处理。Sparkmlib–机器学习库只有较少的ML算法但他们是理想的大数据处理。Scala缺乏良好的可视化和本地数据转换。Scala无疑是Spark streaming特性的最佳选择,因为Python 通过pySpark 调用Spark.streaming不像Scala那样先进和成熟。

 

总结:

“Scala速度更快,使用方便 但上手难,而Python则较慢,但很容易使用。”

 

Spark框架是用Scala编写的,所以了解Scala编程语言有助于大数据开发人员轻松地挖掘源代码,如果某些功能不能像预期的那样发挥作用。使用Python增加了更多问题和bug的可能性,因为2种不同语言之间的转换是困难的。为Spark使用Scala提供对Spark框架的最新特性的访问,因为它们首先在Scala中可用,然后移植到Python中。

根据Spark决定Scala和Python取决于最适合项目需要的特性,因为每种语言都有自己的优点和缺点。在使用Apache Spark编程语言之前,开发者必须学习Scala和Python来熟悉它们的特性。学习了Python和Scala之后,决定何时使用Scala来Spark以及何时使用Python来调用Spark是相当容易的。Apache Spark编程语言的选择完全取决于要解决的问题。

 

 

 

免责声明:文章转载自《基于Spark环境对比Python和Scala语言利弊》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇S4 到 PO/PI proxy 配置手册CSS问题:怎么样让鼠标经过按钮的时候发生的状态一直停留在当页呢?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Docker安装flink及避坑指南

Docker安装flink 导航 无处不在的大数据 安装flink 拉取flink镜像 编写docker-compose.yml 生成启动 查看安装效果 常见坑及解决方案 问题1 问题2 参考   本节是《flink入门实战》的第4篇,感谢您的阅读,预计阅读时长3min。 “泰山不拒细壤,故能成其高,江海不择细流,故能就其深。” flink...

【Azure 应用服务】Azure Function App Linux环境下的Python Function,安装 psycopg2 模块错误

问题描述 在Azure中创建Function App(函数应用), 用以运行Python代码(Python Version 3.7)。 通过VS Code创建一个HttpTrigger的Function,其中使用到了psycopg2 模块,以便连接Azure Database for PostgreSQL 数据库 当通过VS Code发布到Azure后,...

136-如何访问redis数据库

//当我们使用Redis的时候,并没有注入Mapper,反而时注入了一个redisTemPlate @Autowired private RedisTemplate<Object,Object> redisTemplate; @Override public Integer queryUserCount() {...

Python:字典的pop()方法

pop():移除序列中的一个元素(默认最后一个元素),并且返回该元素的值。 一)移除list的元素,若元素序号超出list,报错:pop index out of range(超出范围的流行指数); A、默认移除最后一个元素 list_1=[1, 2, 3, 4, 5] a = list_1.pop() print(list_1, a) -->[1,...

大数据培训班 cloudera公司讲师面对面授课 CCDH CCAH CCP

大数据助力成就非凡。大数据正在改变着商业游戏规则,为企业解决传统业务问题带来变革的机遇。毫无疑问,当未来企业尝试分析现有海量信息以推动业务价值增值时,必定会采用大数据技术。 目前对大数据的分析工具,首选的是Hadoop平台。由于Hadoop深受客户欢迎,许多公司都推出了各自版本的Hadoop,也有一些公司则围绕Hadoop开发产品。在Hadoop生态系统...

redis 在 php 中的应用(key篇)

本文为我阅读了redis参考手册之后结合博友的博客编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: KEY(键) DEL EXISTS EXPIRE EXPIREAT keys MOVE PERSIST TTL RANDOMKEY RENAME RENAMENX TYPE SORT KEY(...