Spark思维导图

简介

Spark

  • Spark是分布式计算框架

  • Spark可以和多种存储系统结合使用,如Kafka、HBase、Hive、HDFS以及关系型数据库。

  • 与MapReduce的区别

      1. Spark是基于内存迭代处理数据;MapReduce是基于磁盘迭代处理数据
      1. Spark中有DAG(有向无环图)执行引擎,执行速度快
      1. Spark是粗粒度资源申请,MapReduce是细粒度的资源申请
      1. MapReduce中只有mapper和reducer,相当于spark中的map和reduceByKey两个算子
        在MapReduce中很多业务逻辑要自己实现,Spark中有各种算子对应各种业务逻辑
  • Spark的四大特性

      1. 高效性:运行速度提高100倍
      1. 易用性:支持Java,Scala,Python,R和SQL
      1. 通用性:Spark提供了统一的解决方案。可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)
      1. 兼容性:可以运行在Hadoop,Apache Mesos,Kubernetes,Standalone或者云环境上,可以连接不同的数据源。

Spark运行模式

    1. local,用于本地开发,多用于测试
    1. Standalone,Spark自带的资源调度框架
    1. Yarn,Hadoop生态圈中的资源调度框架
    1. Mesos,资源调度框架(国内不常用)

Spark Application

driver

  • driver驱动程序是Spark应用程序的核心,并在应用程序的生命周期内维护所有相关信息

  • driver职责

      1. 维护有关Spark应用程序的信息
      1. 响应用户的程序或输入
      1. 分析、分配和调度executor的工作

executor

  • executors进程实际执行driver分配给它们的工作

  • executors是一个worker进程所管理的节点上为某Application启动的一个进程,该进程负责运行任务,并且负责将数据存在内存或磁盘上。

  • 每个应用程序都有各自独立的executors。

  • executor职责

      1. 执行由驱动程序分配给它的代码
      1. 将执行器executor的计算状态报告给驱动节点

Task

  • 被发送到某个executor上的工作单元

Job

  • 包含很多任务(task)的并行计算
    (在一个SparkApplication中有几个action算子就有几个Spark job)

Stage

  • 一个Job会被拆分成很多任务,每组任务被称为Stage——stage由一组并行的task组成
    (类似于MapReduce分为map task和reduce task一样)
  • Job根据RDD的宽窄依赖来划分Stage
  • Stage的并行度由finalRDD的partition数量决定
  • Stage的计算模式:pipeline管道计算模式--一条条处理数据

任务提交(standalone)

  • client

      1. 在客户端提交Application,Driver在客户端启动
      1. 客户端向Master申请资源,Master返回Worker节点
      1. Driver向worker节点发送task,监控task执行,回收结果
    • 注:client模式提交任务适用于程序测试,不适用于生产。
      Driver是在客户端启动,当在客户端提交多个application时,会有网卡流量激增问题
  • cluster

      1. 在客户端提交application,首先客户端向Master申请启动Driver
      1. Master随机在一台Worker中启动Driver
      1. Driver启动之后向Master申请资源,Master返回资源
      1. Driver发送task,监控task,回收结果
    • 注:cluster模式提交任务适用于生产环境,Driver是在集群中某一个节点启动
      会将client模式的网卡流量激增问题分散到集群
  • driver的功能

      1. 发送task
      1. 监控task
      1. 申请资源
      1. 回收结果

名词

SparkSession

  • 任何Spark程序的第一步都是先创建SparkSession

DataFrames

  • 在Spark中,DataFrame是一种以RDD为基础的分布式数据集

  • DataFrame只是表示包含行和列的数据表

  • DataFrames特点

      1. 支持单机KB级到集群PB级的数据处理
      1. 支持多种数据格式和存储系统(Hive,MySQL,PostgreSQL,JSON等等)
      1. 通过Spark SQL Catalyst优化器可以进行高效的代码生成和优化
      1. 能够无缝集成所有的大数据处理工具
      1. 提供Python,Java,Scala,R语言API
  • 对于DataFrames,大多数情况下不会手动或单独操作分区。您只需在物理分区中指定数据的高级转换,Spark将确定该工作将如何在集群上执行。

  • Spark SQL可以将任何DataFrame注册为表或视图(临时表),并使用纯SQL查询它。
    在编写SQL查询和编写DataFrame代码之间没有性能差异。

DataSet

  • DataFrames和Dataset都是(分布式的)类似于表的集合,具有定义好的行和列
  • Dataset只适用于Java虚拟机(JVM)的语言(Scala和Java)并且指定带有case类和JavaBean的类型
  • 对于Spark在Python或R中没有Dataset这样的东西,所有的都是DataFrame

Schema

  • 定义了DataFrame的列名和数据类型

Partition

  • 分区是集群中的一个物理机器上的行集合;
    Partition是RDD的最小存储单元

  • 分区从不跨越多台计算机,即同一分区中的元组保证位于同一台计算机上;
    群集中的每台计算机都包含一个或多个分区

  • 两种类型的分区

    • Hash partitioning
      (通常,哈希分区将元组(k,v)分配给分区p,其中 p = k.hashCode() % numPartitions)
    • Range partitioning
    • 默认情况下,当使用sortByKey时,将使用RangePartitioner;
      使用groupByKey时的默认分区器是HashPartitioner。

RDD

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

  • RDD中是不存数据的,partition中也不存数据,存的是处理逻辑

  • 五大特性

      1. RDD是由一系列Partition组成的
        (在从HDFS读取文件时block的数量决定了partition的数量)
      1. 算子(函数)是作用在Partition上的
      1. RDD之间有依赖关系
        (容错性:在一个lifeage中只要其中一个RDD还在就可以生成其他RDD)
      1. 分区器是作用在(K,V)格式的RDD上的
        (K,V格式的RDD表示RDD中的每个元素都是一个二元组)
      1. RDD对外提供最佳的计算位置
        (利于数据处理的本地化)
  • Spark没有直接读取HDFS文件的方法,textFile方法的底层调用的是MapReduce读取
    (首先会split,每个split的默认大小为128M即block的大小,每个split对应一个partition)

算子

  • Transformations类型算子

    • Lazy Evaluation--它是懒加载的

    • 转换的类型

      • 窄依赖的转换:每个输入数据分区只对一个数据输出分区(或多对一)
      • 宽依赖的转换:一个输入数据分区对应多个输出分区
        (会产生shuffle的算子就是宽依赖的算子)
  • Action类型算子

    • 可以触发Lazy Evaluation算子执行

    • 类型

        1. 在控制台中查看数据的action
        1. 数据收集的action操作
        1. 输出到第三方存储系统的action
    • 在一个SparkApplication中有几个action算子就有几个Spark job

  • 持久化类型算子

    • cache

      • 默认将数据存在内存中
      • 缓存的最小单位是partition,是Lazy Evaluation类型的算子,需要action算子触发
      • application执行结束之后数据会被清除
    • persist

      • 可以手动指定数据的持久化级别
      • 缓存的最小单位是partition,是Lazy Evaluation类型的算子,需要action算子触发
      • application执行结束之后数据会被清除
    • checkpoint

      • 可以将数据持久化到磁盘,还可以切断RDD之间的依赖关系

      • 当lineage非常长并且计算又复杂时,可以使用checkpoint对RDD进行持久化

      • application执行结束之后数据不会被清除

      • checkpoint的执行流程

          1. 当application有action触发执行时,job执行之后会从后往前回溯
          1. 回溯去找有哪些RDD被checkpoint,被checkpoint的做标记
          1. 回溯完成之后,重新计算checkpointRDD的数据,将结果写入指定的checkpoint的目录中
          1. 切断RDD之间的依赖关系
        • 优化:在对RDD进行checkpoint之前,最好先cache下
  • SPARK是一个分布式编程模型,用户可以在其中指定TRANSFORMATION。
    多个TRANSFORMATION构建一个有向无环图(DAG)。一个ACTION开始执行DAG的过程,作为一个单一的JOB作业,将它分解成多个STAGES阶段和TASK任务,以便在整个集群中执行

Spark的资源调度与任务调度

资源调度

  • 1.启动集群,Worker向Master汇报资源,Master掌握集群资源
    1. 当new SparkContext时会创建两个对象:DAGScheduler和TaskScheduler
    1. TaskScheduler向Master申请资源
    1. Master收到请求,找到满足资源的worker,启动Executor
    1. Executor启动之后反向注册给TaskScheduler,Driver掌握了一批资源

任务调度

    1. 有一个action算子就有一个job,job中有RDD,RDD会形成有向无环图
    1. DAGScheduler负责将每个job中的DAG按照RDD的宽窄依赖切割job,划分stage,将stage以TaskSet形式提交给TaskScheduler
    1. TaskScheduler遍历TaskSet,拿到一个个task,将task发送到Executor中的ThreadPool去执行
    1. TaskScheduler监控task执行,回收结果

小结

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