开篇词 | 入门Spark,你需要学会“三步走”

你好,我是吴磊,欢迎和我一起入门学习Spark。

在过去的7年里,我一直在围绕着Spark来规划我的职业发展。2014年,Spark以“星火燎原”之势席卷了整个大数据生态圈,正是在那个时候,我结识了Spark。起初,怀揣着强烈的好奇心,我花了一个星期,用Spark重写了公司(IBM)的ETL任务。

让我颇为惊讶的是,Spark版本的ETL任务,在执行性能上提升了一个数量级。从那以后,我便深深地着迷于Spark,孜孜不倦、乐此不疲地学习、实践与Spark有关的一切,从官方文档到技术博客,从源代码再到最佳实践,从动手实验再到大规模应用,在这个过程里:

  • 在IBM,我用Spark Streaming构建了流处理应用,帮助业务人员去实时分析用户行为。
  • 在联想研究院,我用Spark SQL + Hive搭建的公司级数仓,服务于所有业务部门。
  • 在微博,我基于Spark MLlib来构建微博机器学习框架,配置化的开发框架让上百位算法工程师从繁重的数据处理、特征工程、样本工程中解脱出来,把宝贵的精力和时间投入到了算法研究与模型调优上来。
  • 在FreeWheel,在所有的机器学习项目中,我们使用Spark进行数据探索、数据处理、特征工程、样本工程与模型训练,将一个又一个机器学习项目落地到业务中。

为了把Spark吃得更透,在日常的工作中,我热衷于把学过的知识、习得的技巧、踩过的坑、绕过的弯路付诸笔头。通过这种“学、用、写”不断迭代的学习方式,我把零散的开发技巧与知识点,逐渐地归纳成了结构化的知识体系

在2021年的3月份,我与极客时间合作了《Spark性能调优实战》这一专栏,把我积累的与性能调优有关的技巧、心得、最佳实践分享给有需要的同学。

让我欣慰的是,专栏的内容受到了同学们的广泛好评,有不少同学反馈:采用专栏中的调优技巧,Spark作业的执行性能提升了好几倍。但同时,也有一些同学反馈:自己才入门大数据,专栏中的很多内容表示看不懂。

实际上,我身边也有不少同学,他们有的科班出身于机器学习、人工智能,有的准备从后端开发、DBA甚至是其他行业转型做大数据开发,有的想基于开源框架构建企业级数据仓库,都面临着如何快速入门Spark的难题。

“快”和“全”,让Spark成了互联网公司的标配

不过,你可能会好奇:“Spark还有那么火吗?会不会已经过时了?”实际上,历经十多年的发展,Spark已经由当初的“大数据新秀”成长为数据应用领域的中流砥柱。在数据科学与机器学习魔力象限当中,IT研究与咨询公司Gartner连续3年(2018 ~ 2020)将Databricks(Spark云原生商业版本)提名为Market Leader。

不仅如此,凭借其自身的诸多优势,Spark早已成为绝大多数互联网公司的标配。比如,字节跳动基于 Spark 构建数据仓库,服务着旗下几乎所有的产品线,包括抖音、今日头条、西瓜视频、火山视频;比如,美团早在2014年就引入了Spark,并逐渐将其覆盖到美团App、美团外卖、美团打车等核心产品;再比如,Netflix基于Spark构建端到端的机器学习流水线,围绕着Spark打造服务于超过两亿订阅用户的推荐引擎。

事实上,任何一家互联网公司,都离不开推荐、广告、搜索这3类典型业务场景。推荐与搜索帮助企业引流、提升用户体验、维持用户黏性、拓展用户增长,而广告业务则用于将流量变现,是互联网公司最重要的商业模式之一。而在这些业务场景背后的技术栈当中,你都能看到Spark的身影,它或是用于ETL与流处理、或是用于构建企业级数据分析平台、或是用于打造端到端的机器学习流水线。

那么,我们不禁要问:“在发展迅猛的数据应用领域,同类竞品可以说是层出不穷、日新月异,Spark何以傲视群雄,在鹰视狼顾的厮杀中脱颖而出,并能持久地立于不败之地?”在我看来,这主要是得益于Spark的两大优势:快、全。

快,有两个方面,一个是开发效率快,另一个是执行效率快。Spark支持多种开发语言,如Python、Java、Scala、R和SQL,同时提供了种类丰富的开发算子,如RDD、DataFrame、Dataset。这些特性让开发者能够像搭积木一样,信手拈来、驾轻就熟地完成数据应用开发。

在我的身边,有很多不具备大数据背景,却需要从零开始用Spark做开发的同学。最开始,他们往往需要“照葫芦画瓢”、参考别人的代码实现才能完成自己的工作。但是,经过短短3个月的强化练习之后,绝大多数同学都能够独当一面、熟练地实现各式各样的业务需求。而这,自然要归功于Spark框架本身超高的开发效率。

再者,凭借Spark Core和Spark SQL这两个并驾齐驱的计算引擎,我们开发出的数据应用并不需要太多的调整或是优化,就能享有不错的执行性能。

而这,主要得益于Spark社区对于底层计算引擎的持续打磨与优化,才让开发者能够把精力专注于业务逻辑实现,而不必关心框架层面的设计细节。

说完了Spark的“快”,接下来,我们再来说说它的“全”。全,指的是Spark在计算场景的支持上非常全面。我们知道,在数据应用领域,有如下几类计算场景,它们分别是批处理、流计算、数据分析、机器学习和图计算。

批处理作为大数据的基础,自然不必多说了。与以往任何时候都不同,今天的大数据处理,对于延迟性的要求越来越高,流处理的基本概念与工作原理,是每一个大数据从业者必备的“技能点”。而在人工智能火热的当下,数据分析与机器学习也是我们必须要关注的重中之重。

对于这几类计算场景,Spark提供了丰富的子框架予以支持。比如,针对流计算的Structured Streaming,用于数据分析的Spark SQL,服务于机器学习的Spark MLlib,等等。Spark全方位的场景支持,让开发者“足不出户”、在同一套计算框架之内,即可实现不同类型的数据应用,从而避免为了实现不同类型的数据应用,而疲于奔命地追逐各式各样的新技术、新框架。

不难发现,Spark集众多优势于一身,在互联网又有着极其深远的影响力,对于想要在数据应用领域有所建树的同学来说,Spark可以说是一门必修课

不管你是专注于应用开发与二次开发的大数据工程师,还是越来越火热的数据分析师、数据科学家、以及机器学习算法研究员,Spark都是你必须要掌握的一项傍身之计。

不过,尽管Spark优势众多,但入门Spark却不是一件容易的事情。身边的同学经常有这样的感叹:

  • 网上的学习资料实在太多,但大部分都是零星的知识点,很难构建结构化的知识体系;
  • Spark相关的书籍其实也不少,但多是按部就班、照本宣科地讲原理,看不下去;
  • 要想学习Spark,还要先学Scala,Scala语法晦涩难懂,直接劝退;
  • 开发算子太多了,记不住,来了新的业务需求,不知道该从哪里下手;
  • ……

既然Spark是数据应用开发者在职业发展当中必需的一环,而入门Spark又有这样那样的难处和痛点,那么我们到底该如何入门Spark呢?

如何入门Spark?

如果把Spark比作是公路赛车的话,那么我们每一个开发者就是准备上车驾驶的赛车手。要想开好这辆赛车,那么第一步,我们首先要熟悉车辆驾驶的基本操作,比如挡位怎么挂,油门、离合、刹车踏板分别在什么地方,等等。

再者,为了发挥出赛车的性能优势,我们得了解赛车的工作原理,比如它的驱动系统、刹车系统等等。只有摸清了它的工作原理,我们才能灵活地操纵油、离、刹之间的排列组合。

最后,在掌握了赛车的基本操作和工作原理之后,对于不同的地形,比如公路、山路、沙漠等等,我们还要总结出针对不同驾驶场景的一般套路。遵循这样的三步走,我们才能从一个赛车小白,逐渐化身为资深赛车手。

和学习驾驶赛车一样,入门Spark也需要这样的“三步走”。第一步,就像是需要熟悉赛车的基本操作,我们需要掌握Spark常用的开发API与开发算子。毕竟,通过这些API与开发算子,我们才能启动并驱使Spark的分布式计算引擎。

接着,要想让Spark这台车子跑得稳,我们必须要深入理解它的工作原理才行。因此,在第二步,我会为你讲解Spark的核心原理。

第三步,就像是应对赛车的不同驾驶场景,我们需要了解并熟悉Spark不同的计算子框架(Spark SQL、Spark MLlib和Structured Streaming),来应对不同的数据应用场景,比如数据分析、机器学习和流计算。

与三步走相对应,我把这门课设计成了4个模块,其中第一个模块是基础知识模块,我会专注于三步走的前两步,也即熟悉开发API和吃透核心原理。在后面的三个模块中,我会依次讲解Spark应对不同数据场景的计算子框架,分别是Spark SQL、Spark MLlib和Structured Streaming。由于图计算框架GraphFrames在工业界的应用较少,因此咱们的课程不包含这部分内容的介绍。

这四个模块和“三步走”的关系如下图所示:

从图中你可以看到,由于在这三种子框架中,Spark SQL在扮演数据分析子框架这个角色的同时,还是Spark新一代的优化引擎,其他子框架都能共享Spark SQL带来的“性能红利”,所以我在讲解Spark SQL的时候,也会涉及一些第一步、第二步中的基本操作和原理介绍。

在这四个模块中,我们都会从一个小项目入手,由浅入深、循序渐进地讲解项目涉及的算子、开发API、工作原理与优化技巧。尽管每个项目给出的代码都是由Scala实现的,但你完全不用担心,我会对代码逐句地进行注释,提供“保姆级”的代码解释。

第一个模块是基础知识。

在这个模块中,我们会从一个叫作“Word Count”的小项目开始。以Word Count的计算逻辑为线索,我们会去详细地讲解RDD常用算子的含义、用法、注意事项与适用场景,让你一站式掌握RDD算子;我还会用一个又一个有趣的故事,以轻松诙谐、深入浅出的方式为你讲解Spark核心原理,包括RDD编程模型、Spark进程模型、调度系统、存储系统、Shuffle管理、内存管理等等,从而让你像读小说一样去弄懂Spark。

第二个模块在讲Spark SQL时,我首先会从“小汽车摇号”这个小项目入手,带你熟悉Spark SQL开发API。与此同时,依托这个小项目,我会为你讲解Spark SQL的核心原理与优化过程。最后,我们再重点介绍Spark SQL与数据分析有关的部分,如数据的转换、清洗、关联、分组、聚合、排序,等等。

在第三个模块,我们会学习Spark机器学习子框架:Spark MLlib。

在这个模块中,我们会从“房价预测”这个小项目入手,初步了解机器学习中的回归模型、以及Spark MLlib的基本用法。我还会为你介绍机器学习的一般场景,会带你一起,深入学习Spark MLlib丰富的特征处理函数,细数Spark MLlib都支持哪些模型与算法,并学习构建端到端的机器学习流水线。最后,我还会讲Spark + XGBoost集成,是如何帮助开发者应对大多数的回归与分类问题。

在课程的最后一部分,我们一起来学习Spark的流处理框架Structured Streaming。

在这个模块中,我们将重点讲解Structured Streaming如何同时保证语义一致性与数据一致性,以及如何应对流处理中的数据关联,并通过Kafka + Spark这对“Couple”的系统集成,来演示流处理中的典型计算场景。

经过“熟悉开发API、吃透核心原理与玩转子框架”这三步走之后,你就建立了属于自己的Spark知识体系,完全跨进了Spark应用开发的大门。

对于绝大多数的数据应用需求来说,我相信你都能够游刃有余地做到灵活应对,分分钟交付一个满足业务需求、运行稳定、且执行性能良好的分布式应用。

最后,欢迎你在这里畅所欲言,提出你的困惑和疑问,也欢迎多多给我留言,你们的鼓励是我的动力。三步走的路线已经规划完毕,让我们一起携手并进、轻松而又愉快地完成Spark的入门之旅吧!

掌握了Spark这项傍身之计,我坚信,它可以让你在笔试、面试或是日常的工作中脱颖而出,从而让Spark为你的职业发展增光添彩!

精选留言

  • Geek_038655

    2021-09-13 02:20:29

    请问:什么时候更新?一周更新多少节?
    作者回复

    每周一三五更新,一周更新三篇。

    2021-09-13 03:16:13

  • Alvin-L

    2021-09-10 07:58:09

    可否追加python版的代码。平常都是使用python
    作者回复

    好问题,这块我是这么打算的:

    课程更新完毕之后,可以把课程里面所有的代码,整理出一份Python版本的,然后放到github上(暂时不会考虑放到课程里,不同语言的代码放一起太凌乱了)。随着课程的推进,当然也可以征集感兴趣的小伙伴一起做这件事情。

    不过毕竟课程还没更完,所以可能需要小伙伴们稍安勿躁,等待一段时间~

    不过,还是那句话,其实课程中涉及到的代码实现,虽然是用Scala实现的,但其实每句代码都会有注释和讲解,所以我觉得语言上确实算不上是障碍~

    2021-09-11 15:10:55

  • 初心

    2021-09-06 21:22:11

    有开发经验但没有大数据处理经验,女孩纸一名,能学会吗
    作者回复

    可以的哈,零基础入门~ 有开发经验更佳~

    2021-09-06 22:08:54

  • Neo-dqy

    2021-09-14 16:08:59

    老师好,我是研一新生,导师这里主要做的是nlp和知识图谱相关的研究,但是我个人更倾向于成为一名大数据开发工程师,不知道您能不能给一些对于校招学生的学习建议?我本科时在 Jupyter notebook上使用过sklearn来进行机器学习实验,但是貌似在企业里使用spark来做机器学习才是更普遍的选择,请问spark做机器学习应用时,会用到微服务技术这些来部署吗?最后想问下您对于Flink的看法,它会不会撼动spark的地位?
    作者回复

    直播已经回答啦~

    2021-09-15 17:50:46

  • 夜空中最亮的星

    2021-09-07 17:24:36

    我就喜欢听故事,必须订阅
    作者回复

    特别喜欢讲故事~ 欢迎欢迎~

    2021-09-07 22:00:17

  • 钱鹏 Allen

    2021-09-07 07:25:06

    拿好自己的小本本,开始自己的Spark学习之旅!!
    作者回复

    欢迎加入学习,加油!

    2021-09-10 12:41:02

  • zhongmin

    2021-09-06 22:31:00

    从《spark性能调优实战》转过来的👍
    作者回复

    欢迎👏👏👏

    2021-09-07 11:57:03

  • 慎独明强

    2023-12-08 08:17:27

    工作中要用到spark,跟着老师快速入门,掌握这门技能
  • Geek_5d2c69

    2021-11-03 15:07:43

    感谢吴老师!new grad刚毕业 入职了湾区一家公司,开始onboarding的第一个project就是用pyspark做offline ML model然后转线上。遇到了很多spark上面的问题和code bug,希望上这门课可以帮我更加熟悉spark!
    作者回复

    首先恭喜老弟~ 希望这门课对老弟的职业发展有所帮助,一起加油~

    2021-11-03 23:32:43

  • Joey

    2021-09-30 16:08:04

    说起来spark太有感觉了,毕业后的第一家公司就是负责spark、hbase相关的开发;后来跳槽了就主要做实时kafka、flink这一块了,已经两年没写过spark相关的代码了。再来重温一下spark,重温当时倔强的自己哈哈...
    作者回复

    欢迎归来~

    2021-10-01 09:21:13

  • Owen

    2021-09-10 17:43:46

    老师,你教的是哪个版本呢? 还有,能简单说一下spark2和3的不同点吗,谢谢
    作者回复

    其实课程里面涉及到的知识点和开发技巧,对于2.x和3.x来说都是一致的~ 所以版本方面不用特别担心,课程里面涉及到的代码,在2.x和3.x都是能跑通的~

    回答你的问题,相比2.x,3.x的改进还是挺多的,不过从性能的角度来看,最主要的改进还是在Spark SQL部分,比如像AQE(Adaptive Query Execution)、DPP(Dynamic Partition Pruning)等等。

    当然,完整的改进列表,可以参考3.0的release note:https://spark.apache.org/releases/spark-release-3-0-0.html

    2021-09-11 15:05:08

  • 又菜又爱玩

    2021-09-09 20:09:04

    后面会有关于SPARK的项目实践么
    作者回复

    会有的~ 每个模块都是从一个项目入手~

    2021-09-10 09:18:17

  • qbit

    2021-09-07 18:42:49

    请问课程基于哪个 spark 版本?有关于 pyspark 的内容吗?
    作者回复

    3.x版本,专栏的开发技巧同样适用于PySpark,因此没有单设PySpark模块哈~

    2021-09-07 21:59:33

  • 1900

    2021-09-07 10:08:14

    对scala有要求吗?会讲解scala吗?
    作者回复

    没有要求~ 代码示例虽然是Scala,不过会逐行讲解的~

    2021-09-07 11:55:39

  • lyz

    2025-01-21 09:36:13

    再次来打卡,温故知新
  • Michael

    2024-10-16 20:56:30

    GraphFrame可以计算clustering
  • 灰太狼

    2024-08-13 23:49:06

    老师,考虑出flink的专栏吗
  • 小李

    2022-10-22 12:03:14

    老师,能否针对partitions做一下答疑?比如我目前就对spark在从各种源读文件生成rdd时其partition数的计算规则以及进行shuffle时shuffle read阶段的partition数的计算规则有点儿不明白!
    当然上述问题可以去看源码但是我希望老师能泛化地讲一下,这样能更快更好的理解改问题!
  • 笑笑是个好孩子

    2022-04-30 11:33:16

    有关于大数据测试特别是大数据自动化测试相关的课程吗? 我们现在测试基本都是基于pyspark框架把业务逻辑再次实现一遍 与研发输出结果进行对比 这个感觉是不是成本略高了 有木有其他的测试思路啊?或者你们是如何做自测的啊
  • piboye

    2022-01-20 16:29:35

    老师, Spark 和 Flink 都适合什么场景? 现在这个时间点, 是不是直接学 Spark Sql 就行了, 还是要学Spark 的其它api?
    作者回复

    Flink在流处理方面,尤其是实时流处理方面,更胜Spark Streaming / Structured Streaming一筹。学Spark的话,建议还是把DataFrame的API熟悉一下,相比SQL,DataFrame API开发效率更高一些~

    2022-01-21 23:14:47