zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Spark简介

2023-04-18 16:19:37 时间

Spark是什么

Spark 是 UC Berkeley AMP Lab 开源的通用分布式并行计算框架。
Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法。
spark是基于内存计算框架,计算速度非常之快,但是它仅仅只是涉及到计算,并没有涉及到数据的存储,后期需要使用spark对接外部的数据源,比如hdfs。


Spark的四大特性

Simple(易用性)

Spark 提供了丰富的高级运算操作,支持丰富的算子,并支持 Java、Python、Scala、R、SQL 等语言的 API,使用户可以快速构建不同的应用。

开发人员只需调用 Spark 封装好的 API 来实现即可,无需关注 Spark 的底层架构。

Fast(速度快)

Spark 将处理的每个任务都构造成一个DAG(Directed Acyclic Graph, 有向无环图)来执行,实现原理是基于RDD(Resilient Distributed Dataset, 弹性分布式数据集)在内存中对数据进行迭代计算,以实现批量和流式数据的高性能快速计算处理。

Spark比MR速度快的原因

  • 基于内存
    mapreduce任务后期再计算的时候,每一个job的输出结果会落地到磁盘,后续有其他的job需要依赖于前面job的输出结果,这个时候就需要进行大量的磁盘io操作。性能就比较低。
    spark任务后期再计算的时候,job的输出结果可以保存在内存中,后续有其他的job需要依赖于前面job的输出结果,这个时候就直接从内存中获取得到,避免了磁盘io操作,性能比较高
    对于spark程序和mapreduce程序都会产生shuffle阶段,在shuffle阶段中它们产生的数据都会落地到磁盘。
  • 进程与线程
    mapreduce任务以进程的方式运行在yarn集群中,比如程序中有100个MapTask,一个task就需要一个进程,这些task要运行就需要开启100个进程。
    spark任务以线程的方式运行在进程中,比如程序中有100个MapTask,后期一个task就对应一个线程,这里就不再是进程,这些task需要运行,这里可以极端一点:只需要开启1个进程,在这个进程中启动100个线程就可以了。
    进程中可以启动很多个线程,而开启一个进程与开启一个线程需要的时间和调度代价是不一样。 开启一个进程需要的时间远远大于开启一个线程。## Scalable(可融合性)

Unified(通用性)

大数据处理的传统方案需要维护多个平台,比如,离线任务是放在 Hadoop MapRedue 上运行,实时流计算任务是放在 Storm 上运行。

而Spark 提供了一站式的统一解决方案,可用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)等。这些不同类型的处理都可以在同一个应用中无缝组合使用。

Scalable(兼容性)

Spark 可以非常方便地与其他的开源产品进行融合。比如:Spark 可以使用 Hadoop 的 YARN 和 Apache Mesos 作为它的资源管理和调度器;可以处理所有 Hadoop 支持的数据,包括 HDFS、HBase 和 Cassandra 等。


Spark运行原理

Spark运行模式

运行模式运行类型说明
Local本地模式常用于本地开发,分为Local单线程和Local-Cluster多线程模式
Standalone集群模式独立模式,在Spark自己的资源调度管理框架上运行,该框架采用master/salve结构
ON YARN集群模式用于生产环境,在YARN资源管理器框架上运行,由YARN负责资源管理,Spark负责任务调度和计算
ON Mesos集群模式用于生产环境,在Mesos资源管理器框架上运行,由Mesos责资源管理,Spark负责任务调度和计算
ON Cloud集群模式运行在AWS、阿里云等环境

Spark集群架构

Spark 集群架构图

  1. Cluster Manager
    Cluster Manager 是 Spark 的集群资源管理器,存在于 Master 进程中,主要用于对整个集群资源进行管理和分配,根据其部署模式的不同,可以分为 Local、Standalone、YARN、Mesos、Cloud 等模式。
  2. Driver:
    执行客户端写好的main方法,它会构建一个名叫SparkContext对象,该对象是所有spark程序的执行入口
  3. Worker:
    Spark的工作节点,用于执行提交的任务,其主要的工作职责有以下几点:
  • Worker 节点通过注册机向 Cluster Manager 汇报自身的 CPU、内存等资源使用信息。
  • Worker 节点在 Spark Master 的指示下,创建并启用 Executor(真正的计算单元)。
  • Spark Master 将资源和 Task 分配给 Worker 节点上的 Executor 并执行运用。
  • Worker 节点同步 Executor 状态和资源信息给 Cluster Manager。
  1. Executor:
    它是一个进程,它会在worker节点启动该进程(计算资源),一个worker节点可以有多个Executor进程
  2. Task:
    spark任务是以task线程的方式运行在worker节点对应的executor进程中
  3. Application:
    Application 是基于 Spark API 编写的应用程序,包括实现 Driver 功能的代码和在集群中各个 Executor 上要执行的代码。
    一个 Application 由多个 Jobs 组成。
    其中 Application 的入口为用户所定义的 main() 方法。

Spark Core

Spark 基础配置

  • SparkConf :用于定义 Spark Application 的配置信息。
  • SparkContext Spark Application 所有功能的主要入口点, 其隐藏了网络通信、消息通信,分布式部署、存储体系、计算存储等底层逻辑,开发人员只需使用其提供的 API 即可完成 Application 的提交与执行。核心作用是初始化 Spark Application 所需要的组件,同时还负责向 Master 进程进行注册等。
  • SparkRPC :基于 Netty 实现的 Spark RPC 框架用于 Spark 组件之间的网络通信,分为异步和同步两种方式。
  • SparkEnv :Spark 的执行环境,其内部封装了很多 Spark 运行所需要的基础环境组件。
  • ListenerBus :事件总线,主要用于 SparkContext 内部各组件之间的事件交互,属于监听者模式,采用异步调用。
  • MetricsSystem :度量系统,用于整个 Spark 集群中各个组件状态的运行监控。

Spark 存储系统

Spark 存储系统用于管理 Spark 运行中依赖的数据的存储方式和存储位置。存储系统会优先考虑在各节点的内存中存储数据,内存不足时将数据写入磁盘中,这也是 Spark 计算性能高的重要原因。

数据存储在内存和磁盘之间的边界可以灵活控制,同时可以通过远程网络调用将结果输出到远程存储中,比如 HDFS、HBase 等。

Spark调度系统

Spark 调度系统主要由 DAGSchedulerTaskScheduler 组成。

  • DAGScheduler:负责创建 Job,把一个 Job 根据 RDD 间的依赖关系,划分到不同 Stage 中,并将划分后的每个 Stage 都抽象为一个或多个 Task 组成的 TaskSet,批量提交给 TaskScheduler 来进行进一步的任务调度。
  • TaskScheduler:负责按照调度算法对每个具体的 Task 进行批量调度执行,协调物理资源,跟踪并获取状态结果。

主要的调度算法有 FIFO、FAIR

  • FIFO 调度:先进先出,Spark 默认的调度模式。
  • FAIR 调度:支持将作业分组到池中,并为每个池设置不同的调度权重,任务可以按照权重来决定执行顺序。

Spark 计算引擎

Spark 计算引擎主要由内存管理器、TaskSet 管理器、Task 管理器、Shuffle 管理器等组成。


核心组件

Spark 基于 Spark Core 扩展了四个核心组件,分别用于满足不同领域的计算需求。
在这里插入图片描述

Spark SQL

Spark SQL 主要用于结构化数据的处理。其具有以下特点:

  • 能够将 SQL 查询与 Spark 程序无缝混合,允许您使用 SQL 或 DataFrame API 对结构化数据进行查询;
  • 支持多种数据源,包括 Hive,Avro,Parquet,ORC,JSON 和 JDBC;
  • 支持 HiveQL 语法以及用户自定义函数 (UDF),允许你访问现有的 Hive 仓库;
  • 支持标准的 JDBC 和 ODBC 连接;
  • 支持优化器,列式存储和代码生成等特性,以提高查询效率。

Spark Streaming

在这里插入图片描述
Spark Streaming 主要用于快速构建可扩展,高吞吐量,高容错的流处理程序。支持从 HDFS,Flume,Kafka,Twitter 和 ZeroMQ 读取数据,并进行处理。
Spark Streaming 的本质是微批处理,它将数据流进行极小粒度的拆分,拆分为多个批处理,从而达到接近于流处理的效果。
在这里插入图片描述

MLlib

MLlib 是 Spark 的机器学习库。其设计目标是使得机器学习变得简单且可扩展。它提供了以下工具:

  • ML Algorithms: 如分类,回归,聚类和协同过滤;
  • Featurization: 特征提取,转换,降维和选择;
  • Pipelines: 用于构建,评估和调整 ML 管道的工具;
  • Persistence: 保存和加载算法,模型,管道数据;
  • Utilities: 线性代数,统计,数据处理等。

Graphx

GraphX 是 Spark 中用于图形计算和图形并行计算的新组件。在高层次上,GraphX 通过引入一个新的图形抽象来扩展 RDD(一种具有附加到每个顶点和边缘的属性的定向多重图形)。为了支持图计算,GraphX 提供了一组基本运算符(如: subgraph,joinVertices 和 aggregateMessages)以及优化后的 Pregel API。此外,GraphX 还包括越来越多的图形算法和构建器,以简化图形分析任务。