You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
14 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 开篇词 | 入门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性能调优实战](https://time.geekbang.org/column/intro/100073401)》这一专栏,把我积累的与性能调优有关的技巧、心得、最佳实践分享给有需要的同学。
让我欣慰的是专栏的内容受到了同学们的广泛好评有不少同学反馈采用专栏中的调优技巧Spark作业的执行性能提升了好几倍。但同时也有一些同学反馈自己才入门大数据专栏中的很多内容表示看不懂。
实际上我身边也有不少同学他们有的科班出身于机器学习、人工智能有的准备从后端开发、DBA甚至是其他行业转型做大数据开发有的想基于开源框架构建企业级数据仓库都面临着如何快速入门Spark的难题。
## “快”和“全”让Spark成了互联网公司的标配
不过你可能会好奇“Spark还有那么火吗会不会已经过时了”实际上历经十多年的发展Spark已经由当初的“大数据新秀”成长为数据应用领域的中流砥柱。在数据科学与机器学习魔力象限当中IT研究与咨询公司Gartner连续3年2018 ~ 2020将DatabricksSpark云原生商业版本提名为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这两个并驾齐驱的计算引擎我们开发出的数据应用并不需要太多的调整或是优化就能享有不错的执行性能。
![](https://static001.geekbang.org/resource/image/17/f8/17154dcd29143a0959596344ac38a3f8.jpg?wh=2248x935 "图片来源Apache Spark官网")
而这主要得益于Spark社区对于底层计算引擎的持续打磨与优化才让开发者能够把精力专注于业务逻辑实现而不必关心框架层面的设计细节。
说完了Spark的“快”接下来我们再来说说它的“全”。**全指的是Spark在计算场景的支持上非常全面**。我们知道,在数据应用领域,有如下几类计算场景,它们分别是批处理、流计算、数据分析、机器学习和图计算。
批处理作为大数据的基础,自然不必多说了。与以往任何时候都不同,今天的大数据处理,对于延迟性的要求越来越高,**流处理的基本概念与工作原理,是每一个大数据从业者必备的“技能点”**。而在人工智能火热的当下,数据分析与机器学习也是我们必须要关注的重中之重。
对于这几类计算场景Spark提供了丰富的子框架予以支持。比如针对流计算的Structured Streaming用于数据分析的Spark SQL服务于机器学习的Spark MLlib等等。Spark全方位的场景支持让开发者“足不出户”、在同一套计算框架之内即可实现不同类型的数据应用从而避免为了实现不同类型的数据应用而疲于奔命地追逐各式各样的新技术、新框架。
![](https://static001.geekbang.org/resource/image/19/e0/1963d2823eb61f7d77c90f248f71f0e0.jpg?wh=2284x582 "Spark子框架与不同的计算场景")
不难发现Spark集众多优势于一身在互联网又有着极其深远的影响力**对于想要在数据应用领域有所建树的同学来说Spark可以说是一门必修课**。
不管你是专注于应用开发与二次开发的大数据工程师还是越来越火热的数据分析师、数据科学家、以及机器学习算法研究员Spark都是你必须要掌握的一项傍身之计。
不过尽管Spark优势众多但入门Spark却不是一件容易的事情。身边的同学经常有这样的感叹
* 网上的学习资料实在太多,但大部分都是零星的知识点,很难构建结构化的知识体系;
* Spark相关的书籍其实也不少但多是按部就班、照本宣科地讲原理看不下去
* 要想学习Spark还要先学ScalaScala语法晦涩难懂直接劝退
* 开发算子太多了,记不住,来了新的业务需求,不知道该从哪里下手;
* ……
既然Spark是数据应用开发者在职业发展当中必需的一环而入门Spark又有这样那样的难处和痛点那么我们到底该如何入门Spark呢
## **如何入门Spark**
如果把Spark比作是公路赛车的话那么我们每一个开发者就是准备上车驾驶的赛车手。要想开好这辆赛车那么第一步我们首先要熟悉车辆驾驶的基本操作比如挡位怎么挂油门、离合、刹车踏板分别在什么地方等等。
再者,为了发挥出赛车的性能优势,我们得了解赛车的工作原理,比如它的驱动系统、刹车系统等等。只有摸清了它的工作原理,我们才能灵活地操纵油、离、刹之间的排列组合。
最后,在掌握了赛车的基本操作和工作原理之后,对于不同的地形,比如公路、山路、沙漠等等,我们还要总结出针对不同驾驶场景的一般套路。遵循这样的三步走,我们才能从一个赛车小白,逐渐化身为资深赛车手。
和学习驾驶赛车一样,**入门Spark也需要这样的“三步走”**。第一步就像是需要熟悉赛车的基本操作我们需要掌握Spark常用的开发API与开发算子。毕竟通过这些API与开发算子我们才能启动并驱使Spark的分布式计算引擎。
接着要想让Spark这台车子跑得稳我们必须要深入理解它的工作原理才行。因此在第二步我会为你讲解Spark的核心原理。
第三步就像是应对赛车的不同驾驶场景我们需要了解并熟悉Spark不同的计算子框架Spark SQL、Spark MLlib和Structured Streaming来应对不同的数据应用场景比如数据分析、机器学习和流计算。
![](https://static001.geekbang.org/resource/image/3c/af/3cc1140d4cd342f0fb3715bc6edd13af.jpg?wh=2248x1037)
**与三步走相对应我把这门课设计成了4个模块**其中第一个模块是基础知识模块我会专注于三步走的前两步也即熟悉开发API和吃透核心原理。在后面的三个模块中我会依次讲解Spark应对不同数据场景的计算子框架分别是Spark SQL、Spark MLlib和Structured Streaming。由于图计算框架GraphFrames在工业界的应用较少因此咱们的课程不包含这部分内容的介绍。
这四个模块和“三步走”的关系如下图所示:
![](https://static001.geekbang.org/resource/image/61/bf/615da0cba86c806caf1afc26bcd10dbf.jpg?wh=2284x797 "“三步走”与专栏内容安排")
从图中你可以看到由于在这三种子框架中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应用开发的大门。
![](https://static001.geekbang.org/resource/image/eb/a2/eb5d573a0800c1457774479c6a91fda2.jpg?wh=2284x797 "Spark知识体系图")
对于绝大多数的数据应用需求来说,我相信你都能够游刃有余地做到灵活应对,分分钟交付一个满足业务需求、运行稳定、且执行性能良好的分布式应用。
最后欢迎你在这里畅所欲言提出你的困惑和疑问也欢迎多多给我留言你们的鼓励是我的动力。三步走的路线已经规划完毕让我们一起携手并进、轻松而又愉快地完成Spark的入门之旅吧
掌握了Spark这项傍身之计我坚信它可以让你在笔试、面试或是日常的工作中脱颖而出从而让Spark为你的职业发展增光添彩