前言:
💞💞大家好,我是书生♡,本阶段和大家一起分享和探索大数据技术–spark计算引擎,本篇文章主要讲述了:spark的概念,spark的起源,Spark的计算框架,Spark组成架构,Spark部署方式,Spark开发方式等等。欢迎大家一起探索讨论!!!
💞💞代码是你的画笔,创新是你的画布,用它们绘出属于你的精彩世界,不断挑战,无限可能!
个人主页⭐: 书生♡
gitee主页🙋♂:闲客
专栏主页💞:大数据开发
博客领域💥:大数据开发,java编程,前端,算法,Python
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬
目录
- 1. Spark的概念
- 2. Spark的起源
- 3. Spark和Hadoop的区别
- 4. Spark特性
- 5. Spark架构--流程
- 5.1 MapReduce架构--流程
- 5.2 HIve计算流程
- 5.3 Spark计算流程
- 5.4 Spark组成架构
- 5.5 Spark Core 和RDD的关系
- 5.5.1 RDD是什么
- 5.5.1 Spark Core是什么
- 5.5.3 Spark Core 和RDD的关系
- 6. Spark部署方式
- 7. spark开发方式
- 7.1 交互式开发
- 7.1.1 Scala交互式开发
- 7.1.2 Python交互式开发
- 7.2 脚本式开发
- 8. PyCharm远程开发配置
1. Spark的概念
定义:
- Apache Spark是专为大规模数据处理而设计的快速通用的分布式计算引擎(基于内存),是开源的类Hadoop MapReduce的通用分布式计算框架。和MapReduce一样,都是完成大规模数据的计算处理。
- Spark 被设计用于处理诸如批处理、流处理、机器学习、图计算等多种类型的数据处理任务,并且可以在各种数据源上运行,包括结构化与非结构化的数据。
RDD是整个 Spark 的核心数据结构,Spark整个平台都围绕着RDD进行
小结:
- Spark 保留了分布式并行计算的优点并改进了其明显的缺陷。
- 中间数据存储在内存中
- 提供丰富的操作数据的API提高了开发速度。
2. Spark的起源
3. Spark和Hadoop的区别
Hadoop | Spark | |
---|---|---|
类型 | 分布式存储和处理大规模数据的框架,包含计算、存储、调度 | 分布式计算引擎 |
场景 | 大规模数据的批处理(离线) | 迭代计算、交互式计算、流计算(实时) |
价格 | 对机器要求低,便宜 | 对内存有要求,相对较贵 |
编程范式 | Map+Reduce,API 较为底层,算法适应性差 | API 较为顶层,方便使用 |
数据存储结构 | MapReduce中间计算结果在HDFS磁盘上,速度慢 | RDD中间运算结果在内存中,速度快 |
运行方式 | Task以进程方式执行 | Task以线程方式执行 |
Spark能完全取代Hadoop? —》不能
- Spark主要用于替代Hadoop中的MapReduce计算模型。存储依然可以使用HDFS,但是中间结果可以存放在内存中,内存数据的读写速度要比磁盘快的多,所以Spark的计算速度要比MapReduce快
- Spark已经很好地融入了Hadoop生态圈,它可以借助于YARN实现资源调度管理,借助于HDFS实现分布式存储
注意:Presto也是基于内存计算的,Presto不适合海量数据处理,而且不能创建库表。Spark对海量数据在内存上的计算做了优化,内存不足是会将结果存在磁盘上,适合海量数据处理,并且可以进行库表创建
面试题:Hadoop的基于进程计算和Spark的基于线程计算方式优缺点?
Hadoop MapReduce (基于进程)
- 优点:
容错性: MapReduce 框架提供了强大的容错机制,当任务失败时,它会自动重新调度失败的任务。 大规模数据处理:
适用于处理大规模的数据集,因为每个Map或Reduce任务都是独立运行的,可以并行执行。
- 缺点:
高延迟: MapReduce 中的进程启动和关闭成本较高,导致较高的延迟。 不适合迭代计算:
对于需要多次迭代的算法,每次迭代都需要读取和写入磁盘,效率较低。
Apache Spark (基于线程)
- 优点:
内存计算: Spark 可以将中间结果缓存在内存中,减少磁盘I/O操作,从而提高处理速度。
低延迟: 基于线程的执行模型减少了任务启动的开销,提高了整体性能。
支持多种类型的数据处理:如批处理、流处理、机器学习等。
- 缺点:
内存消耗:内存中的数据存储可能会导致较大的内存占用
线程安全问题:多线程并发访问共享资源时需要考虑线程安全问题。
资源竞争:在多任务环境下,多个Spark作业可能会竞争有限的资源,影响性能。
进程和线程的区别:
- 进程是操作系统资源分配的基本单位,分配资源需要花费时间
- 线程是处理器任务调度和执行的基本单位,使用进程创建的资源执行任务
- 一个进程一般包含多个线程, 一个进程下的多个线程共享进程的资源
- 进程之间不共享资源
- 不同进程之间的线程相互不可见
- 线程不能独立执行,必须依附在进程中执行
4. Spark特性
Spark四大特性:高效性、易用性、通用性和兼容性
-
高效性
计算速度快,由于Apache Spark支持内存计算,并且是通过线程执行计算任务,所以在内存中的运算速度要比Hadoop的MapReduce快100倍,在硬盘中要快10倍。
-
易用性
支持多种编程语言开发 (Python,Java,Scala,SQL,R等),降低了学习难度
-
通用性
- 支持多种计算方式
- RDD计算 -> Spark core
- SQL计算(离线计算)-> Spark SQL
- 图计算 -> Spark GraphX
- 机器学习计算 -> Spark MLlib
- 流式数据计算(实时数仓中使用)-> Spark Streaming
- 支持多种开发方式
- 交互式开发 -> 通过输入命令完成程序运行
- 脚本式开发 -> 通过编写代码文件完成程序运行
- 支持多种计算方式
-
兼容性
- 支持三方工具接入
- 数据存储工具
- hdfs
- kafka
- hbase
- es
- mysql
- 资源调度工具
- yarn
- standalone(spark自带)
- mesos
- 高可用工具
- zookeeper
- 数据存储工具
- 支持多种操作系统
- Linux
- Windows
- Mac
- 支持三方工具接入
5. Spark架构–流程
5.1 MapReduce架构–流程
- 客户端提交一个MR程序给ResourceManager(校验请求是否合法…)
- 如果请求合法,ResourceManager随机选择一个NodeManager用于生成appmaster(应用程序控制者,每个应用程序都单独有一个appmaster)
- appmaster会主动向ResourceManager应用管理器(application manager)注册自己,告知自己的状态信息,并且保持心跳
- appmaster会根据任务情况计算自己所需要的container资源(cpu,内存),主动向ResourceManager资源调度器(resource
scheduler)申请并获取这些container资源- appmaster获取到container资源后,把对应指令和container分发给其他NodeManager,让NodeManager启动task任务(maptask,reducetask)
- NodeManager要和appmaster保持心跳,把自己任务计算进度和状态信息等同步给appmaster,(注意当maptask任务完成后会通知appmaster,appmaster接到消息后会通知reducetask去maptask那儿拉取数据)直到最后任务完成
- appmaster会主动向ResourceManager注销自己(告知ResourceManager可以把自己的资源进行回收了,回收后自己就销毁了)
5.2 HIve计算流程
HIve就是将HIveSql语言转换为MR的计算语言,其他的和MR一样
5.3 Spark计算流程
Spark就是将SparkSql语言转换为Spark的RDD计算方式,中间数据存储在内存上,最终结果是存储在HDFS上的
5.4 Spark组成架构
- Spark Core: 基于RDD计算, 处理非结构化数据(多维数据), spark的核心数据结构, 所有组件基于RDD进行计算
- Spark SQL: 基于DataFrame/DataSet计算, 处理结构化数据, 提供了DSL方式和SQL两种编写方式。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。
- Spark/Structured Streaming: 流计算, 进行实时计算。Spark Streaming允许程序能够像普通RDD一样处理实时数据
- Spark ML/MLlib: 机器学习, AI项目开发, 推荐系统 了解
- Spark Graphx: 图计算组件, 控制图、并行图操作和计算的一组算法和工具的集合
5.5 Spark Core 和RDD的关系
5.5.1 RDD是什么
- RDD (Resilient Distributed Datasets)
RDD 是 弹性分布式数据集 的缩写,它是 Apache Spark 中最基本的数据抽象。RDD 代表一个不可变的、可分区的、包含元素的集合,这些元素可以并行地在集群的不同节点上进行计算。
以下是 RDD 的一些关键特点:
- 不可变性:一旦创建,RDD 就不能改变其内部的状态或结构。
- 分区:RDD 可以被划分为多个分区,这些分区可以在集群的不同节点上进行并行处理。
- 容错性:RDD 具有自动恢复丢失数据的能力,并且能够从失败中恢复。
- 懒加载:许多 RDD 操作都是惰性的,这意味着它们不会立即执行,直到遇到一个行动(action)操作时才会触发实际的计算。
- 血统:RDD 之间的转换操作会形成一种依赖关系,这种依赖关系被称为“血统”,Spark 使用血统信息来重新计算丢失的数据分区。
5.5.1 Spark Core是什么
- Spark Core
Spark Core 是 Apache Spark 的核心组件,提供了 Spark 的基础功能,包括任务调度、内存管理、故障恢复以及与存储系统的交互等。Spark Core 提供了一个运行时环境,支持所有其他的 Spark 模块,例如 Spark SQL、Spark Streaming、MLlib(机器学习库)和 GraphX(图处理库)。
Spark Core 的主要组成部分包括:
- RDD API:提供了用于操作和处理数据集的功能。
- 任务调度器:负责任务的分配和执行。
- 内存管理器:管理应用程序使用的内存。
- 容错机制:确保即使在硬件故障的情况下也能正确执行程序。
5.5.3 Spark Core 和RDD的关系
通俗点来说就是:Spark Core是Spark的核心组件,他的底层引擎就是RDD ,Spark Core 的编程模型允许开发者以 RDD 为基础编写应用程序,SparkCore要遵守RDD的规则。
我们如果要使用SparkSQL去Sql语句的话,sql要遵守DataFrame/DataSet类型,然后转化为RDD能执行的代码(DataFrame 和 Dataset API 内部已经实现了对 RDD 的封装和优化。当你使用 DataFrame 或 Dataset API 时,Spark 会自动将这些操作转换为一系列的 RDD 转换操作),但是Spark Core不需要进行转化,即可以直接进行计算执行代码,因为他的底层引擎就是RDD
总结
- Spark Core 是 Spark 的核心组件,支持 RDD 作为其主要的数据抽象。
- RDD是一种低级别的数据抽象,适用于更细粒度的控制和自定义逻辑。
- DataFrame 和 Dataset是更高层次的抽象,提供了更简单的接口和更好的性能优化。
- 当使用 DataFrame 和 Dataset 时,Spark 会自动将操作转换为RDD 操作,但用户通常不需要关心这个细节。
6. Spark部署方式
Spark部署模式分为
Local模式
(本地单机模式)和集群模式
。
- Local 模式(本地模式)
- 本地模式部署,使用一台服务器进行部署,一般用于测试代码,在本地能运行成功的代码在集群下也能运行成功
- 集群模式
- spark on standalone模式
- Standalone模式被称为集群单机模式。Spark框架自带了完整的资源调度管理服务,可以独立部署到一个集群中,无需依赖任何其他的资源管理系统。在该模式下,Spark集群架构为主从模式,即一台Master节点与多台Slave节点,Slave节点启动的进程名称为Worker。此时集群会存在单点故障问题,利用Zookeeper搭建Spark HA集群解决单点问题。
集群主从架构
- cluster manager: 主节点, 管理集群,控制整个集群,监控worker。在YARN模式中为资源管理器
- worker: 从节点, 控制计算任务, 创建executor或driver进程
- driver: 进程程序, 负责管理计算任务, 当spark的计算代码程序运行Application的main()函数时就会产生一个drive。
- executor: 进程程序, 负责执行计算任务, 在executor进程中创建线程执行task
- spark on yarn模式
- Yarn模式被称为Spark on Yarn模式,即把Spark作为一个客户端,将作业提交给Yarn服务,由于在生产环境中,很多时候都要与Hadoop使用同一个集群,因此采用Yarn来管理资源调度,可以有效提高资源利用率,Yarn模式又分为Yarn Cluster模式和Yarn Client模式:
- yarn cluster模式: 由yarn自行选择资源充足的节点创建driver进程, 生成环境中使用
- yarn client模式: spark应用程序提交到哪台节点, 就由哪台节点创建driver进程, 测试环境中使用
- spark on mesos模式 了解
- mesos资源调度工具管理spark集群资源,Mesos模式被称为Spark on Mesos模式,Mesos与Yarn同样是一款资源调度管理系统,可以为Spark提供服务,由于Spark与Mesos存在密切的关系,因此在设计Spark框架时充分考虑到了对Mesos的集成,但如果你同时运行Hadoop和Spark,从兼容性的角度来看,Spark on Yarn是更好的选择。
7. spark开发方式
spark开发方式有两种:
- 交互式开发:交互式开发是指在开发过程中,程序员可以即时地测试代码片段或者函数的效果,而不必等到整个程序完成后再进行测试
- 脚本开发:脚本开发是一种传统的编程方式,程序员编写完整的脚本或程序文件,然后一次性运行整个脚本。这种方式适用于自动化任务和构建大型应用程序。
7.1 交互式开发
交互式开发有 2中模式:
- Scala交互式开发
- Python交互式开发
Scala 交互式开发 :
Scala 是一种静态类型的函数式编程语言,同时兼容面向对象编程风格。在 Scala 中进行交互式开发通常涉及到使用
REPL(Read-Eval-Print Loop)环境,如 scala 命令行工具或集成开发环境中的 Scala REPL 特性。
Python 交互式开发:
Python 是一种动态类型的解释型语言,广泛应用于数据分析领域。在 Python 中进行交互式开发通常涉及到使用 Jupyter Notebook、Zeppelin 或 IPython shell 等工具。
准备前提:启动Hadoop集群 ,因为Spark的最终结果是存储在HDFS上面的因此我们其实要启动的是HDFS
# 启动Hadoop集群
start-all.sh
7.1.1 Scala交互式开发
- 输入spark-shell指令进入终端进行开发
spark-shell
7.1.2 Python交互式开发
注意:park依赖的Python解析器版本是Python3,系统中如果没有Python3会报如下错误
python3:没有那个文件或目录
- 安装Anaconda工具, 自带python3解析器
python3的安装可以借助Anconada工具完成,Anconada中自带Python3,同时还集成了各种Python的科学计算库(Pandas,Numpy等)Anconada的安装参考《部署文档》注意安装完成后需要重启服务
init 6
anaconda虚拟环境操作指令:
# 查看所有的虚拟环境
conda info --envs
# 创建新的虚拟环境, 并安装python解析器 conda create -n 虚拟环境名 python=版本号
conda create -n itcast python=3.9
# 切换进入虚拟环境 conda activate 虚拟环境名
conda activate itcast
# 退出虚拟环境
conda deactivate
# 删除 conda remove -n 虚拟环境名 --all
conda remove -n itcast --all
conda activate base # 要先进入base虚拟环境
输入pyspark
进入python终端
我们可以在这里进行计算(注意:相当在内存中进行了计算,结果不会保留)
7.2 脚本式开发
先写一个以.py 结尾的文件
然后执行
示例:要自信root下面的sparkshell1.py文件
我们既可以通过python3 来执行
注意:
我们需要在文件中 导入 pyspark这个模块,如果环境中没有,那么就会报错,这个时候我们只需要下载pyspark这个模块就可以了。
pip install pyspark==3.1.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
然后再次运行程序,即可以正常的出结果。
注意:一般不同spark应用程序可以使用不同的spark和python解析器, 可以通过以下代码指定spark和python解析器
也可以将以下spark和python解析器路径添加到 /etc/bashrc 文件中, 此时就不需要在每个应用程序中手动指定spark和python解析器(练习时可以设置, 实际工作中不建议使用此方式)
我们在进入etc目录下会有一个bashrc文件
这个文件里面就存放我们的spark和python解析器的路径,这样我们就可以避免每一次都需要写路径
8. PyCharm远程开发配置
- 创建一个pycharm项目
- 创建好项目之后,我们点击“文件”–“设置”–“SSH连接”
这一步是为了我们的pycharm能够连接上我们的服务器
我们需要连接几台这里就连接几台 - 配置远程的Python环境
pycharm中点击File,选择Settings,选择项目python解析器: Python Interpreter, 添加新的python解析器
我们这里选择我们刚那个连接好的服务器,看python具体在那一台上面
一直点击下一步,然后选择系统解释器,我们可以修改服务器上同步文件夹的位置
最后点击创建就可以了 - 配置sftp服务
当配置Python远程环境时,指定了远程映射目录后,会自动配置sftp。
- 使用sftp操作远程服务器的文件
- 将本地开发的代码自动上传服务器
我们这里选择自动上传文件
下面这个配置是自动生成的,如果出现问题可以自行修改
- 第一个python spark开发程序
创建一个文件写入数据
右键执行查看结果,是否能正常运行
- 配置数据库
点击右边的数据库标识
点击加号,选择数据源
进入后填写数据库的链接信息,最后测试通过就可以。第一次连接时候需要下载驱动