zoukankan      html  css  js  c++  java
  • Spark设计理念与基本架构

    1.基本概念

    Spark中的一些概念:

    • RDD(resillient distributed dataset):弹性分布式数据集。
    • Partition:数据分区。即一个RDD的数据可以划分为多少个分区。
    • NarrowDependency:窄依赖,即子RDD依赖于父RDD中固定的Partition。Narrow-Dependency分为OneToOneDependency和RangeDependency两种。
    • ShuffleDependency:shuffle依赖,也称为宽依赖,即子RDD对父RDD中的所有Partition都有依赖。
    • Task:是送到某个Executor上的工作单元,即具体执行任务。Task分为ShuffleMapTask和ResultTask两种。ShuffleMapTask和ResultTask分别类似于Hadoop中的Map和Reduce。Task是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责的。
    • Job:用户提交的作业。一个Job包含多个Task组成的并行计算,往往由Spark Action触发。
    • Stage:每个Job会被拆分成多组Task,作为一个TaskSet,其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage) 两种,Stage的边界就是发生shuffle的地方。一个Job可能被划分为一到多个Stage。
    • DAG(directed acycle graph):有向无环图。用于反映各RDD之间的依赖关系。
    • DAGScheduler:根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TaskScheduler。其划分Stage的依赖依据是根据RDD之间的依赖关系找出开销最小的调度方法。
    • TaskScheduler:将TaskSet(即Stage)提交给worker运行,每个Executor运行什么Task就是在此处分配的。TaskScheduler维护所有TaskSet,当Executor向Driver发送心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。另外TaskScheduler还维护所有Task的运行标签,重试失败的Task。
      • 在不同运行模式中任务调度器具体为:
      1. Spark on Standalone模式为TaskScheduler
      2. Yarn-Client模式为YarnClientClusterScheduler
      3. Yarn-Cluster模式为YarnClusterScheduler
    • 将这些术语串起来的运行层次图如下:

    注意:一个Job=多个Stage,一个Stage=多个同种Task

    2. Spark模块设计

    整个Spark主要由以下模块组成:

    • Spark Core:Spark的核心功能实现,包括:SparkContext的初始化(Driver Application通过SparkContext提交)、部署模式、存储体系、任务提交与执行、计算引擎等。
    • Spark SQL:提交SQL处理能力,便于熟悉关系型数据库操作的工程师进行交互查询。此外,还为熟悉Hadoop的用户提交Hive SQL处理能力。
    • Spark Streaming:提供流式计算处理能力,目前支持Kafka、Flume、Twitter、MQTT、ZeroMQ、Kinesis和简单的TCP套接字等数据源。此外,还提供窗口操作。
    • GraphX:提供图计算处理能力,支持分布式,Pregel提供的API可以解决图计算中的常见问题。
    • MLlib:提供机器学习相关的统计、分类、回归等领域的多种算法实现。其一致的API接口大大降低了用户的学习成本。

    Spark SQL、Spark Streaming、GraphX、MLlib的能力都是建立在核心引擎之上,如图:

     2.1 Spark核心功能

    Spark Core提供Spark最基础与最核心的功能,主要包括以下功能。

    • SparkContext:通常而言,DriverApplication的执行与输出都是通过SparkContext来完成的,在正式提交Application之前,首先需要初始化SparkContext。SparkContext隐藏了网络通信、分布式部署、消息通信、存储能力、计算能力、缓存、测量系统、文件服务、Web服务等内容,应用程序开发者只需要使用SparkContext提供的API完成功能开发。SparkContext内置的DAGScheduler负责创建Job,将DAG中的RDD划分到不同的Stage,提交Stage等功能。内置的TaskScheduler负责资源的申请、任务的提交及请求集群对任务的调度等工作。
    • 存储体系:Spark优先考虑使用各节点的内存作为存储,当内存不足时才会考虑使用磁盘,这极大地减少了磁盘I/O,提升了任务执行的效率,使得Spark适用于实时计算、流式计算等场景。此外,Spark还提供了以内存为中心的高容错的分布式文件系统Tachyou供用户进行选择。Tachyon能够为Spark提供可靠的内存级的文件共享服务。
    • 计算引擎:计算引擎由SparkContext中的DAGScheduler、RDD以及具体节点上的Executor负责执行的Map和Reduce任务组成。DAGScheduler和RDD虽然位于SparkContext内部,但是在任务正式提交与执行之前会将Job中的RDD组织成有向无环图(简称DAG),并对Stage进行划分,决定了任务执行阶段任务的数量、迭代计算、shuffle等过程。
    • 部署模式:由于单节点不足以提供足够的存储及计算能力,所以作为大数据处理的Spark在SparkContext的TaskScheduler组件中提供了对Standalone部署模式的实现和Yarn、Mesos、Kubernetes等分布式资源管理系统的支持。通过使用Standalone、Yarn、Mesos、Kubernetes等部署模式为Task分配计算资源,提高任务的并发执行效率。除了可用于实际生产环境的Standalone、Yarn、Mesos、Kubernetes等部署模式外,Spark还提供了Local模式和local-cluster模式便于开发和调试。

    2.2  Spark扩展功能

    为了扩大应用范围,Spark陆续增加了一些扩展功能,主要包括:

    • Spark SQL:SQL具有普及率高、学习成本低等特点,为了扩大Spark的应用面,增加了对SQL及Hive的支持。Spark SQL的过程可以总结为:首先使用SQL语句解析器(SqlParser)将SQL转换为语法树(Tree),并且使用规则执行器(RuleExecutor)将一系列规则(Rule)应用到语法树,最终生成物理执行计划并执行。其中,规则执行器包括语法分析器(Analyzer)和优化器(Optimizer)。Hive的执行过程与SQL类似。
    • Spark Streaming:Spark Streaming与Apache Storm类似,也用于流式计算。Spark Streaming支持Kafka、Flume、Twitter、MQTT、ZeroMQ、Kinesis和简单的TCP套接字等多种数据输入源。输入流接收器(Receiver)负责接入数据,是接入数据流的接口规范。Dstream是Spark Streaming中所有数据流的抽象, DStream可以被组织为DStream Graph。DStream本质上由一系列连续的RDD组成。
    • GraphX:Spark提供的分布式图计算框架。GraphX主要遵循整体同步并行(bulk synchronous parallell, BSP)计算模式下的Pregel模型实现。GraphX提供了对图的抽象Graph,Graph由顶点(Vertex)、边(Edge)及继承了Edge的EdgeTriplet(添加了srcAttr和dstAttr用来保存源顶点和目的顶点的属性)三种结构组成。GraphX目前已经封装了最短路径、网页排名、连接组件、三角关系统计等算法的实现,用户可以选择使用。
    • MLlib:Spark提供的机器学习框架。机器学习是一门涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多领域的交叉学科。MLlib目前已经提供了基础统计、分类、回归、决策树、随机森林、朴素贝叶斯、保序回归、协同过滤、聚类、维数缩减、特征提取与转型、频繁模式挖掘、预言模型标记语言、管道等多种数理统计、概率论、数据挖掘方面的数学算法。

    3. Spark 模型设计

    3.1 Spark编程模型

    Spark应用程序从编写到提交、执行、输出的整个过程如图所示,图中描述的步骤如下:

    1) 用户使用SparkContext提供的API(常用的有textFile、sequenceFile、runJob、stop等)编写Driver application程序。此外SQLContext、HiveContext及StreamingContext对SparkContext进行封装,并提供了SQL、Hive及流式计算相关的API。

    2) 使用SparkContext提交的用户应用程序,首先会使用BlockManager和BroadcaseManager将任务的Hadoop配置进行广播。然后由DAGScheduler将任务转换为RDD并组织成DAG,DAG还将被划分为不同的Stage,一个Stage会由多个Task组成,多个Task将会被存放在TaskSet集合里,TaskSet即为Stage。最后由TaskScheduler将Task借助Netty通信框架将任务提交给集群管理器(Cluster Manager)。

    3) 集群管理器(Cluster Manager)给任务分配资源,即将具体任务分配到Worker上,Worker创建Executor来处理任务的运行。Standalone、YARN、Mesos、Kubernetes、EC2等都可以作为Spark的集群管理器。

     

    3.2 RDD计算模型

    RDD可以看做是对各种数据计算模型的统一抽象,Spark的计算过程主要是RDD的迭代计算过程,如图所示。RDD的迭代计算过程非常类似与管道。分区数量取决于partition数量的设定,每个分区的数据只会在一个Task中计算。所有分区可以在多个机器节点的Executor上并行执行。

    4. Spark基本架构

    从集群部署的角度来看,Spark集群由以下部分组成:

    • Cluster Manager:Spark的集群管理器,主要负责资源的分配与管理。集群管理器分配的资源属于一级分配,它将各个Worker上的内存、CPU等资源分配给应用程序,但是并不负责对Execoutor的资源分配。目前,Standalone、YARN、Mesos、Kubernetes、EC2等都可以作为Spark的集群管理器。
    • Worker:Spark的工作节点、从节点。对Spark应用程序来说,由集群管理器分配得到资源的Worker节点主要负责以下工作:控制计算节点,创建并启动Executor,将资源和任务进一步分配给Executor,同步资源信息给Cluster Manager。
    • Executor:是为某个Appliation运行再Worker node上的一个进程,主要负责任务的执行以及与Worker、Driver App的信息同步。
    • Driver App:客户端驱动程序,也可以理解为客户端应用程序,运行Application的main()函数,用于将任务程序转换为RDD和DAG,并与Cluster Manager进行通信与调度。

    这些组成部分之间的整体关系如图所示:

    参考资料:

    《深入理解Spark核心思想与源码分析》

    https://blog.csdn.net/swing2008/article/details/60869183

  • 相关阅读:
    VScode 修改中文字体
    missing KW_END at ')' near '<EOF>'
    SQL inner join, join, left join, right join, full outer join
    SQL字符替换函数translater, replace
    SQL COOKBOOK SQL经典实例代码 笔记第一章代码
    sqlcook sql经典实例 emp dept 创建语句
    dateutil 2.5.0 is the minimum required version python
    安装postgresql后找不到服务 postgresql service
    Postgres psql: 致命错误: 角色 "postgres" 不存在
    【西北师大-2108Java】第十六次作业成绩汇总
  • 原文地址:https://www.cnblogs.com/swordfall/p/9280006.html
Copyright © 2011-2022 走看看