Spark从入门到熟悉(篇一)

发布于:2025-07-04 ⋅ 阅读:(14) ⋅ 点赞:(0)

知识脉络

本文介绍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的运行流程

执行步骤

  1. 执行Application时,首先由Driver创建一个SparkContext,向资源管理器申请资源

  2. 资源管理器为Executor分配资源,向某些Work Node发送征召信号,被征召的Work Node启动Executor进程响应征召汇报资源使用情况

  3. SparkContext根据RDD的依赖关系构建DAG,DAG被提交给DAG调度器分解成阶段(Stage),将一组Task提交给任务调度器处理

  4. Executor向SparkContext申请Task,任务调度器将Task发送给Executor运行并提供应用程序代码

  5. Task在Executor上运行,将执行结果反馈给任务调度器、DAG调度器,运行完毕后写入数据并向资源管理器发送注销信号,向Work Node发送释放资源信号,Work Node对应Executor停止运行

执行流程图

Spark的部署模式

4种模式

  1. Local:本地运行模式,非分布式。

  2. Standalone:使用Spark自带集群管理器,部署后只能运行Spark任务。

  3. Yarn:Haoop集群管理器,部署后可以同时运行MapReduce,Spark,Storm,Hbase等各种任务。

  4. 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、搜索、推荐、数据挖掘算法和优化,提供面试辅导、专业知识入门到进阶辅导等定制化需求等服务,助力您顺利完成学习和求职之旅(有需要者可私信联系)

友友们,自己的知乎账号为“快乐星球”,定期更新技术文章,敬请关注!   


网站公告

今日签到

点亮在社区的每一天
去签到