一文理解Spark的基本概念和工作原理

162次阅读
没有评论

共计 6561 个字符,预计需要花费 17 分钟才能阅读完成。

“IT 有得聊”是机械工业出版社旗下 IT 专业资讯和服务平台,致力于帮助读者在广义的 IT 领域里,掌握更专业、更实用的知识与技能,快速提升职场竞争力。点击蓝色微信名可快速关注我们! 在 Hadoop 1.x 版本中,采用的是 MRv1 版本的 MapReduce 编程模型,包括 3 个部分:运行时环境(JobTracker 和 TaskTracker)、编程模型(MapReduce)、数据处理引擎(MapTask 和 ReduceTask)。但是 MRv1 存在以下不足:1)可扩展性差。在运行时,JobTracker 既负责资源管理,又负责任务调度,当集群繁忙时 JobTracker 很容易成为瓶颈,最终导致它的可扩展性问题。2)可用性差。采用了单节点的 Master,没有备用 Master 及选举操作,这就存在单点故障的问题,一旦 Master 出现故障,整个集群将不可用。3)资源利用率低。TaskTracker 使用 slot 来划分节点上的 CPU、内存等资源,并将空闲的 slot 分配给 Task 使用,一个 Task 只有在获得 slot 后才有机会进行运行。但是一些 Task 并不能充分利用获得的 slot,导致 slot 有空闲,而其他 Task 又无法使用这些空闲资源。Apache 为了解决 MRv1 中的缺陷,对 Hadoop 进行了升级改造及重构,就有了 MRv2。MRv2 重构了 MRv1 中的运行时环境,将原来的 JobTracker 拆分成集群资源调度平台(ResourceManager)、节点资源管理者(NodeManager)、任务管理者(ApplicationMaster),这就是后来 Hadoop 中的 YARN。除了运行时环境,编程模型和数据处理引擎变成了可插拔的,可以用其他框架模型来替换,比如 Spark。PART1:Spark 是什么官方网站表明 Spark 是一个用于大规模数据(Large-scala Data)分析的统一引擎(Unified Engine)。Apache Spark™是一个多语言引擎,用于在单节点机器或集群上执行数据工程、数据科学和机器学习。一文理解 Spark 的基本概念和工作原理图 1.Spark 是什么 Spark 最早源于加州大学柏克莱分校的 Matei Zaharia 等人发表的一篇论文“Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing”。Spark 借鉴了 MapReduce 的思想,保留了分布式并行计算的优点并改进了其明显的缺陷,对 MapReduce 做了大量的优化,例如减少磁盘 I /O、增加并行度、避免重新计算、以及采用内存计算及灵活的内存管理策略等。Spark 提出了一种弹性分布式数据集(Resilient Distributed Datasets,RDD)的概念,RDD 是一种分布式内存数据抽象,使得程序员能够在大规模集群中做内存运算,并且有一定的容错方式,而这也是整个 Spark 的核心数据结构,Spark 整个平台都围绕着 RDD 进行。中间数据存储在内存中提高了运行速度,并且 Spark 提供丰富的操作数据的 API,提高了开发速度。Spark 是如何处理数据的?Spark 会将 HDFS 中文件的每个数据块读取为 RDD 的一个分区(Partition),每个分区会启动一个计算任务(Task),以实现大规模数据集的并行计算,过程如图 2 所示。一文理解 Spark 的基本概念和工作原理图 2.Spark 如何处理数据 Spark 是一款分布式内存计算的统一分析引擎,其特点就是对任意类型的数据进行自定义计算,可以计算结构化、半结构化、非结构化等各种类型的数据结构。Spark 的适用面比较广,所以被称为统一的分析引擎,它同时支持使用 Python、Java、Scala、R 以及 SQL 语言开发应用程序处理数据。PART2:Spark 的特点 Spark 具有运行速度快、易用性好、通用性强和随处运行等特点。1)速度快。由于 Apache Spark 支持内存计算,并且通过有向无环图(DAG)执行引擎支持无环数据流,所以官方宣称其在内存中的运算速度要比 Hadoop 的 MapReduce 快 100 倍,在硬盘中要快 10 倍。Spark 处理数据与 MapReduce 处理数据相比,有两个不同点:其一,Spark 处理数据时,可以将中间处理结果数据存储到内存中;其二,Spark 提供了非常丰富的算子(API),可以做到复杂任务在一个 Spark 程序中完成。2)易用性好。Spark 的版本已经更新到 3.4.0(截至 2023 年 4 月 13 日),支持包括 Java、Scala、Python、R 和 SQL 语言在内的多种语言。为了兼容 Spark 2.x 企业级应用场景,Spark 仍然持续更新 Spark 2.x 版本。3)通用性强。在 Spark 核心基础上,Spark 还提供了包括 Spark SQL、Spark Streaming、MLlib 及 GraphX 在内的多个工具库,可以在一个应用中无缝地使用这些工具库。4)随处运行。Spark 支持多种运行方式,包括在 YARN 和 Mesos 上支持独立集群运行模式,同时也可以运行在云 Kubernetes(Spark 2.3 开始支持)和云环境上。5)批处理 / 流数据。可以使用首选语言(Python、SQL、Scala、Java 或 R)以批处理和实时流的方式统一数据处理。6)SQL 分析。执行快速、分布式的 ANSI SQL 查询,用于仪表板和即席报告。运行速度比大多数数据仓库都快。7)大规模数据科学。对 PB 级数据执行探索性数据分析(EDA),而无须采用缩减采样。8)机器学习。在笔记本电脑上训练机器学习算法,并使用相同的代码扩展到数千台计算机的容错群集。PART3:Spark 的生态系统 Spark 有一套自己的生态体系,以 Spark 为核心(Spark Core),并提供支持 SQL 语句操作的 Spark SQL 模块、支持流式计算的 Spark Streaming 模块、支持机器学习的 MLlib 模块、支持图计算的 GraphX 模块。在资源调度方面,Spark 支持自身独立集群的资源调度、YARN 及 Mesos 等资源调度框架。Spark 的体系架构如图 3 所示。一文理解 Spark 的基本概念和工作原理图 3.Spark 的体系架构 1)Spark Core。包含 Spark 的基本功能,包含任务调度、内存管理、容错机制等,内部采用 RDD 数据抽象,并提供了很多 API 来创建和操作这些 RDD。为其他组件提供底层的服务。2)Spark SQL。用来操作结构化数据的核心组件,通过 Spark SQL 可以直接查询 Hive、HBase 等多种外部数据源中的数据。Spark SQL 能够统一处理关系表,在处理结构化数据时,开发人员无须编写 MapReduce 程序,直接使用 SQL 命令就能完成更复杂的数据查询操作。3)Spark Streaming。Spark 提供的流式计算框架,支持高吞吐量、可容错处理的实时流式数据处理,其核心原理是将流式数据分解成一系列微小的批处理作业,每个微小的批处理作业都可以使用 Spark Core 进行快速处理。Spark Streaming 支持多种数据来源,如文件、Socket、Kafka、Kinesis 等。4)MLlib。Spark 提供的关于机器学习功能的算法程序库,包括分类、回归、聚类、协同过滤算法等,还提供了模型评估、数据导入等额外的功能,开发人员只需了解一定的机器学习算法知识就能进行机器学习方面的开发,降低了学习成本。5)GraphX。Spark 提供的分布式图处理框架,拥有图计算和图挖掘算法的 API 接口以及丰富的功能和运算符,极大地方便了对分布式图的处理,能在海量数据上运行复杂的图算法。PART4:Spark 的部署模式 Spark 提供多种部署模式,包括:1)本地模式(单机模式)。本地模式就是以一个独立的进程,通过其内部的多个线程来模拟整个 Spark 运行时环境。本地模式不适合用于生产环境,仅用于本地程序开发、代码验证等。2)独立集群模式(集群模式)。Spark 中的各个角色以独立进程的形式存在,并组成 Spark 集群环境,这种模式下 Spark 自己独立管理集群的资源。3)Spark on YARN 模式(集群模式)。Spark 中的各个角色运行在 YARN 的容器内部,并组成 Spark 集群环境,这种模式下 Spark 不再管理集群的资源,而由 YARN 进行集群资源管理。4)Kubernetes 模式(容器集群)。Spark 中的各个角色运行在 Kubernetes 的容器内部,并组成 Spark 集群环境。5)云服务模式(运行在云平台上)。Spark 的商业版本 Databricks 就运行在谷歌、微软、亚马逊云服务提供商的云平台上。PART5:Spark 的运行架构从物理部署层面上看,如果是独立集群模式部署的集群,则 Spark 主要包含两种类型的节点:Master 节点和 Worker 节点。Master 节点负责管理集群资源,分配 Application 到 Worker 节点,维护 Worker 节点、Driver 和 Application 的状态。Worker 节点负责具体的任务运行。如果是运行在 YARN 环境下,则不需要 Master 节点和 Worker 节点。从程序运行层面上看,Spark 主要分为 Driver 和 Executor。Driver 充当单个 Spark 任务运行过程中的管理者,Executor 充当单个 Spark 任务运行过程中的执行者。Spark 中的 4 类角色组成了 Spark 的整个运行时(Runtime)环境。这些角色与 YARN 中的各个角色有类似的地方。在集群资源管理层面:整个集群的管理者,在 YARN 中是 ResourceManager,在 Spark 中是 Master;单个节点的管理者,在 YARN 中是 NodeManager,在 Spark 中是 Worker。在任务执行层面:单个任务的管理者,在 YARN 中是 ApplicationMaster,在 Spark 中是 Driver;单个任务的执行者,在 YARN 中是 Task,在 Spark 中是 Executor。Spark 官方提供的运行结构如下图所示。一文理解 Spark 的基本概念和工作原理图 4.Spark 的运行结构在 Spark 的运行结构中涉及一些关键概念:1)Master Node。集群中的主节点,负责集群的资源管理。2)Worker Node。可以在集群中运行应用程序代码的任何节点。3)Application。基于 Spark 构建的用户应用程序。由集群上 Driver 程序和 Executor 执行。4)Driver 程序。运行应用程序的 main()函数,并创建 SparkContext 的过程。5)Executor。为 Worker 节点上的应用程序启动的进程,用于运行任务并将数据保存在内存中或跨磁盘存储。每个 Application 都分配有自己的 Executor。6)Cluster Manager(集群管理者)。用于获取、管理集群上的资源,如果是独立集群模式部署的集群则是 Standalone Manager,否则就是外部服务,例如 Mesos、YARN、Kubernetes。7)Job。Spark 的数据抽象是 RDD,RDD 提供了很多算子(API),这些算子被划分为 Transformation 和 Action 算子两种类型。Transformation 算子只构建程序的执行计划,但并不会执行;Action 算子的作用是触发 Spark 程序的真正执行。为了响应 Action 算子,当程序中遇到一个 Action 算子时,Spark 会提交一个 Job,用来真正执行前面的一系列操作。通常一个 Application 会包含多个 Job,Job 之间按串行方式依次执行。8)Stage。每个 Job 会根据 Shuffle 依赖划分为更小的任务集,称为 Stage(阶段),Stage 之间具有依赖关系及执行的先后顺序,比如 MapReduce 中的 map stage 和 reduce stage。9)Task。Stage 再细分就是 Task(任务),Task 是发送给一个 Executor 的最细执行单元,RDD 的每个 Partition 都会启动一个 Task,因此每个 Stage 中 Task 的数量就是当前 Stage 的并行度。PART6:PySpark 库介绍 Spark 是用 Scala 语言编写的,运行在 JVM 上,即 Spark 的任务都是以 JVM 的进程来运行的。Python 是机器学习的首选语言,Python 编写的代码运行在 Python 进程里面。在 Python 代码中想要调用 Spark 的 API,就涉及 Python 进程与 JVM 进程之间的通信与交互,想要实现这样不同进程之间的交互,就需要用到远程过程调用(RPC)。Py4j 是一个非常有趣的 RPC 库,它可以在 JVM 进程开辟一个 ServerSocket 来监听客户端的连接,在 Python 进程端启动一个连接池连接到 JVM,所有的远程调用都被封装成消息指令,通过连接池中的连接将消息指令发送到 JVM 远程执行。Py4j 实现了让 Python 自由操纵 Java,借助 Py4j 就可以实现在 Python 代码中调用 Spark 的 API,但是,每次调用 Spark 的 API 都让开发人员自己编写 RPC 代码,效率低下且不易使用。为了让 Spark 支持 Python,Apache Spark 社区发布了一个工具库 PySpark,PySpark 是 Python 中 Apache Spark 的接口。SparkContext 作为 Spark 应用程序的入口,执行 Spark 应用程序会优先在 Driver 端创建 SparkContext。在 Python Driver 端,SparkContext 利用 Py4j 启动一个 JVM 并创建 JavaSparkContext,借助 Py4j 实现 Python 代码与 JavaSparkContext 的通信。Python 环境下的 RDD 会被映射成 Java 环境下的 PythonRDD。在 Executor 端,PythonRDD 对象会启动一些子进程,并与这些子进程通信,以此来发送数据和执行代码。PySpark 的架构如下图所示。一文理解 Spark 的基本概念和工作原理图 5.PySpark 架构大多数数据科学家和数据分析师都熟悉 Python,并使用它来实现机器学习,PySpark 允许他们在大规模分布式数据集上使用自己最熟悉的语言。以上内容节选自《PySpark 大数据分析实战》作者:伍鲜常丽娟 PART7:快速入门 PySpark 为了帮助大家快速掌握 PySpark 大数据分析核心技术,我们邀请中电金信软件有限公司高级软件工程师、《PySpark 大数据分析实战》作者,伍鲜老师。于 2 月 29 日(周四),为大家带来免费直播分享,“程序员核心技能提升”系列直播讲座 第 13 讲——如何快速入门 PySpark 大数据分析”直播主题:程序员核心技能提升”系列直播讲座 第 13 讲——如何快速入门 PySpark 大数据分析开放时间:2024 年 2 月 29 日(周四)20:00 主讲老师:伍鲜课程类型:视频直播观看平台:九州云播平台 机械工业出版社“IT 有得聊”视频号合作媒体:SegmentFault 思否、蔻享学术、示说网、志明与数据、数据社
讲师介绍伍鲜一文理解 Spark 的基本概念和工作原理中电金信软件有限公司高级软件工程师拥有多年金融领域大数据处理实战经验,曾负责多家银行的 Teradata 数据仓库、FusionInsight 大数据集群、阿里云大数据仓库、智能营销客户集市和客户中心建设。直播内容  一文理解 Spark 的基本概念和工作原理 直播入口入口一:机械工业出版社 IT 有得聊视频号预约入口:入口二:识别下方二维码可进入九州云播平台直播间:一文理解 Spark 的基本概念和工作原理添加小编微信进入读者交流群一文理解 Spark 的基本概念和工作原理相关图书  一文理解 Spark 的基本概念和工作原理 本书是 PySpark 大数据分析的入门读物,适合有一定 Python 基础的读者学习使用。本书基于最新版本的 PySpark 3.4.x 编写,全书共 11 章,系统地介绍了 PySpark 大数据分析的方法和技巧,内容涵盖了大数据的相关技术、PySpark 的基本概念、Spark 环境搭建、数据分析的基本概念及相关工具、开发工具的选择、Spark 核心编程和 Spark SQL 操作等基础知识和核心技术,以及 Spark 流式数据处理、Spark 机器学习库 MLlib 和基于协同过滤的图书推荐系统等高级主题。本书通过多个实战案例,带领读者掌握使用 Python 和 Spark 进行大数据分析的方法和技巧,从而提高读者的数据处理能力和业务价值。撰 稿 人:计旭责任编辑:张淑谦审 核 人:曹新宇
正文完
 0
root
版权声明:本站原创文章,由 root 于2024-02-27发表,共计6561字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码