近年来,关于大数据讨论已然是热火朝天,虽不说是家喻户晓,那至少对于业界来说也是引起了轩然大波。作为学生党的我,最近也在研究关于大数据的东东。作为一个技术迷,总是会想尝试一些新鲜的东西。前一段时间学习了Hadoop之后,又想看看Spark是什么东东。那么在这里有必要八卦一下Spark了。
Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台。它立足于内存计算,从多迭代批量处理出发,兼收并蓄数据仓库、流处理和图计算等多种计算范式,是罕见的全能选手。就大数据集而言,对典型的迭代机器 学习、即席查询(ad-hoc query)、图计算等应用,Spark版本比基于MapReduce、Hive和Pregel的实现快上十倍到百倍。其中内存计算、数据本地性 (locality)和传输优化、调度优化等该居首功,也与设计伊始即秉持的轻量理念不无关系。
那么,天下武功,唯快不破,看到这里当然是以一种很激动的心情想要去学习它了。那么问题也来了,通过百度等各种小道消息打听到,Spark是采用Scala语言设计的,要想学好Spark,Scala这一关必须是要过的,并且像Twitter、Linkedin等这些公司都在用。于是,还能怎么办,学呗。。。
于是,就愉快的开始了Scala之旅,嘿嘿,然后就没有然后了。看了Scala前面的内容还好,看到后面真的是想吐血了,简直是受不了这种编写方式,不仅编译速度慢,而且编写代码过于随意、灵活,完全无法驾驭。于是,进行了内心的各种挣扎,并且还被实验室的几个研究生学长踏雪了一番,我也不能坐以待毙了,因此,我再一次选择了强大的网络,打开搜索引擎,然后查看各种八卦与新闻。以下是搜索到的各种观点。
来自知乎的小道消息:
我想大部分应用开发程序员,最关键是看有什么类库合适的方便特定领域的应用开发。就像ruby有rails做web开发,你可以去论证ruby优缺点,但实际上应用开发效率提升很大程度上依靠类库。
现在Spark是大数据领域的杀手级应用框架,BAT,我们现在几个领域巨头的客户(有保密协议不方便透露)都全面使用Spark了,这个时候再谈Scala适不适合大数据开发其实意义不大。因为大家比的不只是编程语言,而是构建在这个编程语言之上的类库、社区和生态圈(包括文档和数据、衍生类库、商业技术支持、成熟产品等等)。
那么反过来问,为什么Spark会选择Scala可能更有意义一点。Spark主创Matei在不同场合回答两次这个问题,思考的点稍微不一样,但重点是一样的,很适合回答题主的问题。总结来说最主要有三点:
1. API能做得优雅; 这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。
2. 能融合到Hadoop生态圈,要用JVM语言; Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。
3. 速度要快; Scala是静态编译的,所以和JRuby,Groovy比起来速度会快很多,非常接近Java。
关于Scala性能的问题,主要分两种情况,
1. Scala的基准性能很接近Java,但确实没有Java好。但很多任务的单次执行的,性能损失在毫秒级不是什么问题;
2. 在大数据计算次数很多的情况下,我们全部写成命令式,而且还要考虑GC,JIT等基于JVM特性的优化。
Scala很难是个很含糊的问题,关键是要看你想达到什么目的。
我们培训客户做Spark开发,基本上一两个星期就可以独立工作了。
当然师傅领进门,修行靠个人,一两个星期能独立工作不代表能马上成为Scala或Spark专家。
这里回答主要针对大数据产品应用开发,不是大数据分析。大数据分析是个更泛的话题,包括大数据分析实验和大数据分析产品等。实验关心建模和快速试不同方式,产品关心稳定、可拓展性。大数据分析实验首选R(SAS),python和Matlab, 通常只拿真实数据的一小部分,在一个性能很好的单机上试各种想法。Scala目前在大数据分析实验上没有太多优势,不过现在有人在做R语言的Scala实现,可以无缝和Spark等大数据平台做衔接。当然现在也已经有SparkR了,可能用R和Spark做交互。
来自InfoQ的小道消息:
Scala是一门现代的多范式编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala允许用户使用命令和函数范式编写代码。Scala运行在Java虚拟机之上,可以直接调用Java类库。对于新手来说,Scala相对比较复杂,其看起来灵活的语法并不容易掌握,但是对于熟悉Scala的用户来说,Scala是一把利器,它提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构。近日,Spotify的软件工程师Neville Li发表了一篇题为《数据工程师应该学习Scala的三个理由》的文章,他认为现在的编程语言种类非常多,每种语言都各有优缺点,并且它们的适用的场景也不同,比如Scala就非常适合用于数据处理和机器学习。
在大数据和机器学习领域,很多开发者都有Python/R/Matlab语言的背景,相比与Java或者C++,Scala的语法更容易掌握。从以往的经验来看,只要掌握基本的集合API以及lambda,一个没有经验的新员工就可以快速上手处理数据。像Breeze、ScalaLab和BIDMach这样的类库都通过操作符重写模仿了一些流行工具的语法以及其它的一些语法糖,简单并且容易使用。另外,Scala的性能比传统的Python或者R语言更好。
由于Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序,所以Scala可以和大数据相关的基于JVM的系统很好的集成,比如基于JVM类库的框架Scalding(Cascading)、Summingbird(Scalding和Storm)、Scrunch(Crunch)、Flink(Java编写并有Scala的API),本身使用Scale开发的系统Spark、Kafka。另外,很多数据存储解决方案都支持JVM语言,比如Cassandra、HBase、Voldemort和Datomic。
函数编程范式更适合用于Map/Reduce和大数据模型,它摒弃了数据与状态的计算模型,着眼于函数本身,而非执行的过程的数据和状态的处理。函数范式逻辑清晰、简单,非常适合用于处理基于不变数据的批量处理工作,这些工作基本都是通过map和reduce操作转换数据后,生成新的数据副本,然后再进行处理。而大多数的Scala数据框架都能够把Scala数据集合API和抽象数据类型相统一,比如Scalding中的TypedPipe与Spark中的RDD都有相同的方法,包括map、flatMap、filter、reduce、fold和groupBy,这样使用Scala来处理就更为方便。开发者只需要学习标准集合就可以迅速上手其它工具包。另外,很多的类库都参考了范畴论中的一些设计,它们通过使用semigroup、monoid、group标识来保证分布式操作的正确性。
来自内存溢出的小道消息:
有不少人问过我这个问题:你为什么要学习Scala?
在最开始,我也是被各种宣传忽悠了,以为Scala是一门简单的,对Java有很多改进的,甚至可能很快就成为下一代Java的语言。当时正打算做一个网站,于是就用它边学边做。几个月后,实在无法忍受它的编译速度、各种类库的缺失、以及各种各样的编译错误,放弃了它。
但是当时创建的那个Scala群里,却有非常好的交流氛围。很多人由于对Scala很有兴趣,在群里讨论各种新鲜好玩的技术,让我大开眼界,发现Java原来只是一个小世界。另外在群里认识了杨云,也因此加入了TW,现在他是我的sponsor。
来到我们公司之后,居然有两次参与Scala项目的机会。发现我们的客户居然都喜欢用Scala,西安办公室里也有越来越多的人主动或者被迫学习Scala。由于现在有了更多学习的时间,所以我又把它捡了起来,同时惊喜地发现之前一直没搞懂的问题,现在竟然差不多理解了。
我认为我现在学习Scala的原因是:它为我打开了编程世界的一扇门,让我看到了与之前完全不同的世界。通过对它的学习,我可以强迫自己学习更多编程知识,提高自己的能力,从而有机会跟更多牛人交流。另外,我个人也看好Scala的未来,所以认为越早掌握它对自己越有利。
来自知乎的小道消息:
Scala正如其名,一门可扩展的语言,它就是一个含有精美工具的工具箱,里面有静态类型, OOP, FP, 宏等工具。
我想这是马丁设计的初衷,也是他写的书上所说的,Scala不是在单纯的混合面向对象和函数式,它是一门可被无限扩展的语言,每次添加新特性都是在丰富工具箱,所以有人说Scala太复杂了,也有人说Scala满足了我对编程语言的所有幻想。
来自segmentfault的小道消息:
个人觉得比较运行速度其实没啥意义, 因为两种语言都是生成 JVM 的字节码, 依赖 JVM 这个虚拟平台来跑代码. 除非 Scalac (scala的编译器) 有重大 bug, 生成的字节码执行让人无法接受, 否则基本上不会相差太多. 再说, scala 都到大版本2了, 这种概率实在是不大.
相比较与 Java, 在下觉得 Scala 最主要的有以下两点优势:
FP 泛型支持
如果用多了 Spring 中大量的 template 接口, 你就会觉得 FP 其实还是蛮好用的.
而这仅仅是 FP 好处的冰山一角.
函数其实就是一个 input -> output (scala 也是这么表示一个函数的), 没有任何副作用, 与状态无关, 由于这种特性, 所以函数式的编程范式在分布式领域有很多好处
对于函数式编程,我的知识实在是皮毛, 但可以这么说, FP 相对与 OO 有哪些优势, Scala 对于 Java 差不多就有哪些优势.
正因为 FP 有如此多的优势, 所以 Java8 才引入了 FP. 从某种程度上来说, Java 认可了 Scala 的做法.
类型系统支持
如果说 Java 是一种类型安全的语言, 那么毫无疑问, Scala 的类型更加安全, 从某种程度上说, Scala 的类型是图灵完备的, 而 Java 不是. 我的一位好朋友在这方面研究的比较深( http://hongjiang.info/scala/ ), 而我对与 Scala 的类型系统的理解, 也还是皮毛.
正是以上这两点大优势, 造成了 Scala 比 Java 更加安全, 同时又具备灵活性, 想象力.
其他语言层面上的优势
在 Java 中, 你是否有时很想继承多个 AbstractClass 呢? 对不起, Java 只支持单继承
在 Scala 中, 你可以进行 mixin (Java 8 也开始引入 default method 了呢)
在 Java 中, 想要一个 singleton ? 要么在 static block 中做, 要么利用 Enum 的单例特性完成, 或者其他更纠结的方法.
在 Scala 中, 只要声明为 object, 即为单例.
在 Java 中, 想要延迟加载一个单例? double check吧
在 Scala 中, 只要在 object 中将变量修饰为 lazy 即可
在 Java 中, 想要对集合进行一些操作? 使用一层一层的 for 循环吧
在 Scala 中, 使用 collection 的一些集合操作, 即可获得如写SQL般的享受.
在 Java 中, 在并发中想对Future进行回调? 对不起, Future 不是 Listenable (无法支持回调), 除非你使用额外的工具(如 guava, spring)
在 Scala 中, 本来就主张异步编程, future 和 promise 的配合让人非常愉快.
在 Java 中, 要透明扩展一个第三方库的类怎么办? 包装, 再加一层.
在 Scala 中, 有强大的 implicit 机制让你更优雅的做到这一点, 同时还能保证类型安全(比起 Ruby 的 monkey patch, 要安全得多)
Scala 的表达力很强, 相同功能的代码, 用 Java 和 Scala 的行数不可同日而语.
这些单单是语言层面上的优势, 除此之外, Scala 还能无缝结合 Java
尽管罗列了如此多的好处, 但 Scala 有如下劣势:
语法复杂, 学习曲线非常高
国内 Scala 程序员很难找 (目前 Scala 的影响力也在缓慢扩大, 比如 Scala 社区中的明星 Spark 的流行也在慢慢拉动 Scala 的流行, 如同 rails 之于 ruby)
社区, 生态还比较小, Scala 风格的库还非常少(但可以和 Java 很容易的斜街很多时候弥补了这一点)
对于程序员来说: Scala 很难学, 但值得学
对于企业来说: Scala 是过滤优秀(好学)程序员(Geek)的好滤斗。
。。。。。
好吧,看了这么多观点,也算是接受了一下思想的洗礼,一千个读者就有一千个哈姆雷特,用于不用各有时,爱与不爱都是伤害。那么,最为大三党的我,我想还是先放放,作为自己也后的一个学习方向,现在先掌握好一些基础知识,准备即将到来的校招,go for it。