知识脉络
本文介绍Spark对比MapReduce的优势、基础概念、架构、运行流程、部署模式、数据结构,以及PySpark等
Spark对比MapReduce
高效性和易用性
通用性和兼容性
正因为有以上的优点,使得Spark可以在工业界获得大规模使用
Spark的基础概念
概念
RDD:是弹性分布式数据集(Resilient Distributed Dataset)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。 DAG:是Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依赖关系。 Driver Program:控制程序,负责为Application构建DAG图。 Cluster Manager:集群资源管理中心,负责分配计算资源。 Worker Node:工作节点,负责完成具体计算。 Executor:是运行在工作节点上的一个进程,负责运行Task,并为应用程序存储数据。
层级关系
Application:用户编写的Spark应用程序,一个Application包含多个Job。
Job:作业,一个Job包含多个RDD及作用于相应RDD上的各种操作。
Stage:阶段,一个作业会分为多组任务,每组任务被称为“阶段”,是作业的基本调度单位
Task:任务,运行在Executor上的工作单元,是Executor中的一个线程
总结:Application由多个Job组成,Job由多个Stage组成,Stage由多个Task组成。Stage是作业的基本调度单位
Spark的架构
Spark的运行流程
执行步骤
执行Application时,首先由Driver创建一个SparkContext,向资源管理器申请资源
资源管理器为Executor分配资源,向某些Work Node发送征召信号,被征召的Work Node启动Executor进程响应征召汇报资源使用情况
SparkContext根据RDD的依赖关系构建DAG,DAG被提交给DAG调度器分解成阶段(Stage),将一组Task提交给任务调度器处理
Executor向SparkContext申请Task,任务调度器将Task发送给Executor运行并提供应用程序代码
Task在Executor上运行,将执行结果反馈给任务调度器、DAG调度器,运行完毕后写入数据并向资源管理器发送注销信号,向Work Node发送释放资源信号,Work Node对应Executor停止运行
执行流程图
Spark的部署模式
4种模式
Local:本地运行模式,非分布式。
Standalone:使用Spark自带集群管理器,部署后只能运行Spark任务。
Yarn:Haoop集群管理器,部署后可以同时运行MapReduce,Spark,Storm,Hbase等各种任务。
Mesos:与Yarn最大的不同是Mesos 的资源分配是二次的,Mesos负责分配一次,计算框架可选择接受或拒绝
Hadoop和Spark的统一部署
Spark的数据结构
基本数据结构是RDD:RDD代表一个不可变、可分区、里面的元素可并行计算的集合
两种方式创建RDD
第一种是读取文件中的数据生成RDD,第二种则是通过将内存中的对象并行化得到RDD
#通过读取文件生成RDD
rdd = sc.textFile("hdfs://hans/data_warehouse/test/data")
#通过将内存中的对象并行化得到RDD
arr = [1,2,3,4,5]
rdd = sc.parallelize(arr)
RDD的操作
有两种:即Transformation操作和Action操作。转换操作是从已经存在的RDD创建一个新的RDD,而行动操作是在RDD上进行计算后返回结果到 Driver。Transformation操作都具有 Lazy 特性,即 Spark 不会立刻进行实际的计算,只会记录执行的轨迹,只有触发Action操作的时候,它才会根据 DAG 图真正执行
RDD之间的依赖关系
有两种类型,即窄依赖和宽依赖。窄依赖时,父RDD的分区和子RDD的分区的关系是一对一或者多对一的关系。而宽依赖时,父RDD的分区和自RDD的分区是一对多或者多对多的关系。 宽依赖关系相关的操作一般具有shuffle过程,即通过一个Patitioner函数将父RDD中每个分区上key不同的记录分发到不同的子RDD分区。依赖关系确定了DAG切分成Stage的方式。切割规则:从后往前,遇到宽依赖就切割Stage。
DAG有向无环图
RDD之间的依赖关系形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分成相互依赖的多个stage,划分stage的依据就是RDD之间的宽窄依赖。遇到宽依赖就划分stage,每个stage包含一个或多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行。
WordCount范例
import pyspark
from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName("test").setMaster("local[4]")
sc = SparkContext(conf=conf)
#只需要5行代码就可以完成WordCount词频统计。
rdd_line = sc.textFile("/home/kesci/input/eat_pyspark9794/data/data/hello.txt")
rdd_word = rdd_line.flatMap(lambda x:x.split(" "))
rdd_one = rdd_word.map(lambda t:(t,1))
rdd_count = rdd_one.reduceByKey(lambda x,y:x+y)
rdd_count.collect()
[('world', 1),
('love', 3),
('jupyter', 1),
('pandas', 1),
('hello', 2),
('spark', 4),
('sql', 1)]
PySpark
对比Spark-scala
维度 |
Spark-scala |
PySpark |
应用场景 |
很高的性能需求 |
机器学习算法、数据分析需求 |
支持功能 |
支持spark graphx图计算模块 |
不支持spark graphx图计算模块 |
学习成本 |
较高,环境配置相对复杂 |
较低,环境配置相对容易 |
工业界使用 |
普遍使用 |
越来越普遍使用 |
PySpark的架构
和Spark架构相比,基本相同
PySpark的架构
通过以上对比,我们入手PySpark的学习,以下的篇章无特殊说明都是PySpark
结尾
亲爱的读者朋友:感谢您在繁忙中驻足阅读本期内容!您的到来是对我们最大的支持❤️
正如古语所言:"当局者迷,旁观者清"。您独到的见解与客观评价,恰似一盏明灯💡,能帮助我们照亮内容盲区,让未来的创作更加贴近您的需求。
若此文给您带来启发或收获,不妨通过以下方式为彼此搭建一座桥梁: ✨ 点击右上角【点赞】图标,让好内容被更多人看见 ✨ 滑动屏幕【收藏】本篇,便于随时查阅回味 ✨ 在评论区留下您的真知灼见,让我们共同碰撞思维的火花
我始终秉持匠心精神,以键盘为犁铧深耕知识沃土💻,用每一次敲击传递专业价值,不断优化内容呈现形式,力求为您打造沉浸式的阅读盛宴📚。
有任何疑问或建议?评论区就是我们的连心桥!您的每一条留言我都将认真研读,并在24小时内回复解答📝。
愿我们携手同行,在知识的雨林中茁壮成长🌳,共享思想绽放的甘甜果实。下期相遇时,期待看到您智慧的评论与闪亮的点赞身影✨!
万分感谢🙏🙏您的点赞👍👍、收藏⭐🌟、评论💬🗯️、关注❤️💚~
自我介绍:一线互联网大厂资深算法研发(工作6年+),4年以上招聘面试官经验(一二面面试官,面试候选人400+),深谙岗位专业知识、技能雷达图,已累计辅导15+求职者顺利入职大中型互联网公司。熟练掌握大模型、NLP、搜索、推荐、数据挖掘算法和优化,提供面试辅导、专业知识入门到进阶辅导等定制化需求等服务,助力您顺利完成学习和求职之旅(有需要者可私信联系)
友友们,自己的知乎账号为“快乐星球”,定期更新技术文章,敬请关注!