最近工作中,接触到最有用的“玩具”就是Spark了,在cpu密集型业务驱动下,提升CPU处理效率,高效的利用内存是最优先的事务,所以有个好的计算工具太重要了,这也是促使我去寻找各种分布式计算工具的动力。
初次接触Spark是在参与公司的一个日志系统项目了解的, 当时就觉得Spark是个内存计算,支持hive sql 的利器,而且调用api非常简单、好用。当时使用的是Spark1.3 的版本,虽然功能还不太完善但是已经初见威力。后来闲下来就打算深入研究一下Spark,这个研究持续近1年时间,其间参考了大量的网络和书籍,发现很多内容是我想搞清楚但是文档写的不深入,有的内容是我不需要知道,但是作者把技术细节讲的面面俱到,导致学习的周期很长。我一直主张的理念是学习从来不是靠量取胜的,所以我把自己对学习Spark的收获整理成一篇大家想看的Spark入门。
我要学Spark吗?
大多数人最开始是先被Spark铺天盖地的新闻给洗脑的,比hadoop快、有机器学习库、好多大公司在用... .... 于是上手就把Spark部署上, 跑一遍example,然后就“精通”了。其实不然,当你遇到硬件资源无法充分利用,出现OOM ,需要优化Spark RDD的时候就会发现,其实你的example远远还不够。我的建议是第一步搞清楚你的业务是否真的需要Spark,还是因为Spark名声鹊起你希望刷存在感在业务中插入一个你并不了解的程序。这个很重要,这个目标决定了你后面坚持学习Spark的时间,如果你的SparkSQL+HDFS完全可以用一台MySQL代替,是否真的有必要用SPARK?
我理解的Spark是个快速计算的框架,当你的单机计算能力不足,有充足的带宽和内存资源的时候,可以采用Spark来解决你能够并行处理的业务的。你的业务真的能并行吗?能拆分吗?如果不能真的不用给自己找麻烦,你有更多的选择。
在决定了用Spark在生产环境时,首先需要选择合适的版本来使用,你的业务需要哪些特性?SQL吗?流式计算吗?图计算吗?后期维护升级的时候是不是要改调用方法?(市面上很多入门参考资料的MLlib库在新版本已经变成ml库,更新了版本之后你要做大量的测试,耗时不省力) 。
我该用哪个语言来进行Spark编程?
Spark 原生由Scala语言编写,支持Java、Python、Scala、R API,学习Spark的时候选择你最熟悉的语言来执行Spark,因为你学习的是框架,清楚Spark的调用过程, 语言本身并不重要(当然Java、R有很多高级特性需要自己编写更多的代码),如果你对于每种语言都很陌生, 推荐你使用Scala,使用一段时间后会让你对函数式编程有更深入的了解。
我参考什么资料?
Spark 自带了“Quick Start” 和 “Programing Guides” 这是入门、入门、入门最好的方式,先用你熟悉的编程语言无脑的跑一遍,对Spark CoreRDD和 Spark SQL有个感性的认识,这时候对RDD的原理什么的不了解也没关系,跳过这些,用Spark-shell运行它们,看它是怎么调用的,返回了什么信息,你还要知道Spark 支持SQL ,而且有个Streaming 流式处理框架和MLlib机器学习库,以及图计算功能,那么你所跑的demo都是Core RDD的功能,底层的核心功能,后面大部分是可以用高级功能替代的。到这里你应该还对Spark能做什么不清楚?不用担心,推荐 edx 的Introduction to Apache Spark,地址 https://www.edx.org/course/introduction-apache-spark-uc-berkeleyx-cs105x
课程介绍了Spark 发展史和用途,Spark SQL 的使用,而且难度较低,讲解主要用Python语言解释的很多概念,建议用你自己熟悉的开发语言完成作业,预计每个Lab4小时左右,会对你入门Spark很有帮助。如果这时候你觉得信心满分可以补充《Spark快速大数据分析》,入门最经典的书籍。
你说的这些我都会,我是要用Spark干大事!
很多人学会了Spark不会用,就是在这个阶段了,哪怕你把Core RDD API都背下来也写不出好用的程序,这时候你需要看example ,注意在程序安装目录下的example程序官方已经打包成了jar包,包括测试数据你可以直接跑的 ,你需要会使用mvn sbt 打包,看Spark-submit的代码,如何执行你的jar包,pyspark 又是如何调用的。Spark文档默认认为你已经熟练提交了各种应用程序和IDE,这时候是你提升最快的时候, 脑袋里冒出来那些想法尽量采用Spark实现一遍。那这时候能写出功能强大的程序了吗? 这个Spark是弥补不了的,还要靠你多年的编程功底,那我们学习了Core RDD API有什么用呢?这是为了避免你自己造轮子,用Core RDD API 执行效率要比你自己写的高,你用的API越合理,你的程序效率越高,如果你想深入Spark就需要加深你的编程能力。scala编程可以参考《scala in Action》, API的各种demo 网上例子也很多,比如 Zhen He( La Trobe University )的《 Spark related topics》,其他编程语言网上的经典教程非常多,这里不啰嗦了。
这样足够了吗?
其实并没有,你只是在单机上利用了自己的cpu和内存,python 有数不清的库,实现的比你用Spark实现的更方便,而且效率更高。你需要从架构角度考虑怎样集群化部署Spark 跑在standalone模式还是yarn模式,选择的原则还是根据需要来决定,这种情况下你要考虑spark 的工作原理,怎样增加并行度?怎样减少action?设置成一个什么样的内存才合理?这些要依据业务来确定参数,所以要你深入了解Spark的原理,好在Spark还提供了web页面可以观测到程序执行的情况,OOM了,你在web页面可以看到哪里设置不合理,你要清楚的知道JVM相关的知识,这方面可以参考 Matei Zaharia(注1)的论文《 An Architecture for Fast and General Data Processing on Large Clusters》 4万字,阐述了Spark的架构和设计思想。直到你能够清晰的区分RDD、stage 、job、task、driver 这些概念为止,你把Spark用到生产环境才不会挖坑。
我还能干点什么?
如果完成了上面我说的这些,你可能找不到更多的深入的资料,这时候会有两个方向一个是想要知道更多的技术细节,为什么某个RDD的调用要这样用,需要你去关注Spark Core RDD的源代码,学会编译调试Spark代码是这个阶段的主要任务,scala的基本功要求非常高。通过代码理解Spark的逻辑。另一个方向是机器学习应用方向,机器学习方面理论支持推荐《白话大数据与机器学习》,利用书中的原理配合Spark MLlib实现常见的机器学习算法。
最后,希望我的Spark学习过程对大家有帮助。
注1:Matei Zaharia 是Spark的创造者,也是Databricks的CTO
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有