大数据组件之Spark

Spark

Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。

特点

  1. Spark 是一种由 Scala 语言开发的快速、通用、可扩展的大数据分析引擎

  2. Spark Core 中提供了 Spark 最基础与最核心的功能

  3. Spark SQL 是 Spark 用来操作结构化数据的组件。通过 Spark SQL,用户可以使用 SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据。

  4. Spark Streaming 是 Spark 平台上针对实时数据进行流式计算的组件,提供了丰富的 处理数据流的 API。

由上面的信息可以获知,Spark 出现的时间相对较晚,并且主要功能主要是用于数据计算, 所以其实 Spark 一直被认为是 Hadoop 框架的升级版。

组成

  1. Driver 执行main函数(主要流程),辅助计算

    Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。

    Driver 在 Spark 作业执行时主要负责:

    1. 将用户程序转化为作业(job)

    2. 在 Executor 之间调度任务(task)

    3. 跟踪 Executor 的执行情况

    4. 通过 UI 展示查询运行情况

    实际上,我们无法准确地描述 Driver 的定义,因为在整个的编程过程中没有看到任何有关Driver 的字眼。所以简单理解,所谓的 Driver 就是驱使整个应用运行起来的程序,也称之为Driver 类

  2. Executor 负责main函数中的复杂计算

    Spark Executor 是集群中工作节点(Worker)中的一个 JVM 进程,负责在 Spark 作业中运行具体任务(Task),任务彼此之间相互独立。Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行。

    Executor 有两个核心功能:

    1. 负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程

    2. 它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

  3. Master & Worker(独立部署脱离Yarn)

    Spark 集群的独立部署环境中,不需要依赖其他的资源调度框架,自身就实现了资源调度的功能,所以环境中还有其他两个核心组件:Master 和 Worker,这里的 Master 是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责,类似于 Yarn 环境中的 RM, 而Worker 呢,也是进程,一个 Worker 运行在集群中的一台服务器上,由 Master 分配资源对数据进行并行的处理和计算,类似于 Yarn 环境中 NM。

  4. Application Master(独立部署脱离Yarn)

    Hadoop 用户向 YARN 集群提交应用程序时,提交程序中应该包含 Application Master,用于向资源调度器申请执行任务的资源容器 Container,运行用户自己的程序任务 job,监控整个任务的执行,跟踪整个任务的状态,处理任务失败等异常情况。说的简单点就是,Resource Manager(资源)和 Driver(计算)之间的解耦合靠的就是Application Master。

image

Spark core

Spark Core 中提供了 Spark 最基础与最核心的功能,Spark 其他的功能如:Spark SQL, Spark Streaming,GraphX, MLlib 都是在 Spark Core 的基础上进行扩展的

三大数据结构

Spark 计算框架为了能够进行高并发和高吞吐的数据处理,封装了三大数据结构,用于 处理不同的应用场景。三大数据结构分别是:

RDD

RDD(Resilient Distributed Dataset) : 弹性分布式数据集

Spark 中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。

计算模式类似于stream流/IO流,多个map,flat map,只是提供逻辑,知道collect才正式开始执行(看似循环很多次,实际循环一次)

不同的是,stream流在一台机上,RDD会分散到多台机去处理

image

注意:RDD只是数据计算逻辑

  1. 弹性 存储的弹性:内存与磁盘的自动切换; 容错的弹性:数据丢失可以自动恢复; 计算的弹性:计算出错重试机制; 分片的弹性:可根据需要重新分片。

  2. 分布式:数据存储在大数据集群不同节点上

  3. 数据集:RDD 封装了计算逻辑,并不保存数据

  4. 数据抽象:RDD 是一个抽象类,需要子类具体实现

  5. 不可变:RDD 封装了计算逻辑,是不可以改变的,想要改变,只能产生新的 RDD,在新的 RDD 里面封装计算逻辑

  6. 可分区、并行计算

代码说明

/**
 *
 * Internally, each RDD is characterized by five main properties:
 *
 *  - A list of partitions //多分区 多台机分布式并行执行计算
 *  - A function for computing each split //每个分区的计算函数(计算函数相同)
 *  - A list of dependencies on other RDDs //RDD之间的依赖关系,上一个RDD的结果成为这一次的入参
 *  - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) //自定义分区器
 *  - Optionally, a list of preferred locations to compute each split on (e.g. block locations for
 *    an HDFS file)//首选位置
 *
 * All of the scheduling and execution in Spark is done based on these methods
 */
abstract class RDD[T: ClassTag]( @transient private var _sc: SparkContext,@transient private var deps: Seq[Dependency[_]]) extends Serializable with Logging {}
  1. 分区列表
  /**
   * Implemented by subclasses to return the set of partitions in this RDD. This method will only
   * be called once, so it is safe to implement a time-consuming computation in it.
   *
   * The partitions in this array must satisfy the following property:
   *   `rdd.partitions.zipWithIndex.forall { case (partition, index) => partition.index == index }`
   *
   * ##### Driver在切分任务的时候 会生成多个小队列 ,每个队列的任务发往不同的机器的Executor
   * ##### 也支持根据partion对任务做部分调整 exp:mapPartitionsWithIndex
   */
  protected def getPartitions: Array[Partition]
  1. 分区计算函数
  /**
   * :: DeveloperApi ::
   * Implemented by subclasses to compute a given partition.
   *
   * ##### 每个分区都有自己的计算函数 但如RDD的结构图所示 其实计算函数都是相同的
   */
  @DeveloperApi
  def compute(split: Partition, context: TaskContext): Iterator[T]
  1. RDD之间的依赖关系
  /**
   * Implemented by subclasses to return how this RDD depends on parent RDDs. This method will only
   * be called once, so it is safe to implement a time-consuming computation in it.
   *
   * ##### 因为需要接收到的入参由上一个计算的结果决定 所以需要存储RDD之间的依赖关系(类似于java Stream流中的函数入参)
   * ##### 依赖关系也可以是一个依赖多个
   */
  protected def getDependencies: Seq[Dependency[_]] = deps
  1. 分区器
  /** 
   *
   * Optionally overridden by subclasses to specify how they are partitioned. 
   *
   * ##### 自定义分区器
   */
  @transient val partitioner: Option[Partitioner] = None
  1. 首选位置
  /**
   * Optionally overridden by subclasses to specify placement preferences.
   *
   * ##### 可以根据特殊要求选择计算任务执行的节点 
   * ##### 如:类似于hadoop中,选择MapReduce的计算的节点最好是,计算需要的数据(HDFS在该台机上有副本)和计算任务都在同一个机器上。减少网络IO
   */
  protected def getPreferredLocations(split: Partition): Seq[String] = Nil
累加器

累加器:分布式共享只写变量

广播变量

广播变量:分布式共享只读变量

Spark Streaming

Spark Streaming 是 Spark 平台上针对实时数据进行流式计算的组件,提供了丰富的处理 数据流的 API。

Spark SQL

Spark SQL 是 Spark 用来操作结构化数据的组件。通过 Spark SQL,用户可以使用 SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容