Spark总结

34 篇文章 5 订阅
21 篇文章 3 订阅

Spark的内置模块

  • Spark Core:Spark Core包含Spark的基本功能,如内存计算、任务调度、部署模式故障恢复、存储管理等。Spark建立在统一的抽象RDD之上,使其可以以基本一致的方式应对不同的大数据处理场景;通常所说的Apache Spark,就是指Spark Core;

  • Spark SQL: Spark SQL允许开发人员直接处理RDD,同时也可查询Hive、HBase等外部数据源。Spark SQL的一个重要特点是其能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行查询,并进行更复杂的数据分析;

  • Spark Streaming: Spark Streaming支持高吞吐量、可容错处理的实时流数据处理,其核心思路是将流式计算分解成一系列短小的批处理作业。Spark Streaming支持多种数据输入源,如Kafka、Flume和TCP套接字等;

  • Spark MLlib:提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据 导入等额外的支持功能。

  • 集群管理器:Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。为了实现这样的要求,同时获得最大灵活性,Spark支持在各种集群管理器(Cluster Manager)上运行,包括Hadoop YARN、Apache Mesos,以及Spark自带的一个简易调度器,叫作独立调度器。 如果是Spark节点单独使用一台机器的话,那么就用它的独立调度器负责资源的调度;如果是混搭的集群,那么还是统一用Yarn比较合适,以防出现争夺资源的情况。

  • image-20210510190612101

Spark的特点 和 hadoop的区别

  • Hadoop最主要的缺陷是其MapReduce计算模型延迟过高,无法胜任实时、快速计算的需求,因而只适用于离线批处理的应用场景。

    • 适合处理单次数据量很大的情况
    • 表达能力有限。计算都必须要转化成Map和Reduce两个操作,但这并不适合所有的情况,难以描述复杂的数据处理过程;
    • 磁盘I/O开销大。MapReduce的计算是基于磁盘的,每次执行时都需要从磁盘读取数据,并且在计算完成后需要将中间结果写入到磁盘中,I/O开销较大
    • 延迟高。一次计算可能需要分解成一系列按顺序执行的MapReduce任务,任务之间的衔接由于涉及到I/O开销,会产生较高延迟。而且,在前一个任务执行完成之前,其他任务无法开始,难以胜任复杂、多阶段的计算任务。
    • 只有等到所有的map task执行完毕后才能执行reduce task
  • Spark主要具有如下优点:

    • Spark最大的特点就是将计算数据、中间结果都存储在内存中,大大减少了I/O开销,能够进行流式处理,迭代式计算模型
    • Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操作类型,包括map、reduce、filter、flatmap、groupbykey、recudcebykey、union、join
    • Spark提供了RDD计算模型,内存计算,中间结果直接放到内存中,带来了更高的迭代运算效率
    • Spark基于DAG的任务调度执行机制,要优于MapReduce的迭代执行机制。
    • 能够流式处理数据,更适用于机器学习之类的“迭代式”应用,可以分为n个阶段,根据用户编写的RDD算子和程序,在处理完一个阶段后可以继续往下处理很多个阶段,而不只是两个阶段
    • 在没有调优的情况下,可能内存溢出
    • Spark中分区相同的转换构成流水线在一个task中执行,分区不同的需要进行shuffle操作,被划分成不同的stage需要等待前面的stage执行完才能执行
    • 它可以借助于YARN实现资源调度管理,借助于HDFS实现分布式存储。

Spark的重要角色

  • Master,它是Spark特有资源调度系统的Leader,掌管着整个集群的资源信息,类似于Yarn中的ResourceManager,它的主要功能是:

    • 监听Worker是否正常工作;
    • Master对Worker、Application等的管理,具体包括接收Worker的注册,并且管理所有 的Worker;接收client提交的Application,调度等待的Application并向Worker提交。
  • Worker,它是Spark特有资源调度系统的slave,有多个。每个salve掌管着各自所在节点的资源信息,类似于Yarn框架中的NodeManager,它的主要功能是:

    • 通过RegisterWorker注册到Master
    • 定时发送心跳信息给Master,告诉它 “我还活着”;
    • 根据Master发送的Application配置进程环境,并启动ExcutorBackend(这是一个执行Task的临时进程)
  • Driver(驱动器),Spark的驱动器是执行开发程序中的main方法的进程,创建spark context对象。它负责开发人员编写的用来创建SparkContext、创建RDD,以及进行RDD的转化操作和行动操作代码的执行。如果驱动器程序终止,那么Spark应用也就结束了。相当于ApplicationMaster,当前任务的老大。它主要负责:

    • 把用户程序转为作业(JOB)
    • 跟踪Executor的运行状况
    • 为执行器节点调度任务
    • UI展示应用运行状况
  • Executor(执行器),Spark Executor是一个工作节点,负责在 Spark 作业中运行任务,任务间相互独立。Spark 应用启动时,Executor节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有Executor节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他Executor节点上继续运行。主要负责:

    • 负责运行组成 Spark 应用的任务,并将状态信息返回给驱动器进程;
    • 通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
  • spark context控制整个application的生命周期,包括dagsheduler和task scheduler等组件。

  • 总结:Master和Worker是Spark的守护进程,也就是说Spark正常运行所必须的进程。Driver和Executor是临时程序,当有具体任务提交到Spark集群的时候才会开启的程序。

RDD持久化原理

  • 将RDD持久化在内存中。调用cache()和persist()方法即可
    • cache()和persist()的区别在于,cache()是persist()的一种简化方式,cache()的底层就是调用persist()的无参版本persist(MEMORY_ONLY),将数据持久化到内存中。
  • 如果需要从内存中清除缓存,可以使用unpersist()方法。RDD持久化是可以手动选择不同的策略的。在调用persist()时传入对应的StorageLevel即可。

checkpoint检查点机制

  • 应用场景:当spark应用程序特别复杂,从初始的RDD开始到最后整个应用程序完成有很多的步骤,而且整个应用运行时间特别长,这种情况下就比较适合使用checkpoint功能。

  • 原因:对于特别复杂的Spark应用,会出现某个反复使用的RDD,即使之前持久化过但由于节点的故障导致数据丢失了,没有容错机制,所以需要重新计算一次数据

  • Checkpoint首先会调用SparkContext的setCheckPointDIR()方法,设置一个容错的文件系统的目录,比如说HDFS;然后对RDD调用checkpoint()方法。之后在RDD所处的job运行结束之后,会启动一个单独的job,来将checkpoint过的RDD数据写入之前设置的文件系统,进行高可用、容错的类持久化操作

  • 检查点机制是我们在spark streaming中用来保障容错性的主要机制,它可以使spark streaming阶段性的把应用数据存储到诸如HDFS等可靠存储系统中,以供恢复时使用。具体来说基于以下两个目的服务:

    • 控制发生失败时需要重算的状态数。Spark streaming可以通过转化图的谱系图来重算状态,检查点机制则可以控制需要在转化图中回溯多远。
    • 提供驱动器程序容错。如果流计算应用中的驱动器程序崩溃了,你可以重启驱动器程序并让驱动器程序从检查点恢复,这样spark streaming就可以读取之前运行的程序处理数据的进度,并从那里继续。

checkpoint和持久化机制的区别

  • 最主要的区别在于持久化只是将数据保存在BlockManager中,但是RDD的lineage(血缘关系,依赖关系)是不变的。但是checkpoint执行完之后,rdd已经没有之前所谓的依赖rdd了,而只有一个强行为其设置的checkpointRDD,checkpoint之后rdd的lineage就改变了

  • 持久化的数据丢失的可能性更大,因为节点的故障会导致磁盘、内存的数据丢失。但是checkpoint的数据通常是保存在高可用的文件系统中,比如HDFS中,所以数据丢失可能性比较低

RDD机制理解吗

  • RDD全称为弹性分布式数据集。RDD在逻辑上是一个hdfs文件,在抽象上是一种元素集合,包含了数据。它是被分区的,分为多个分区,每个分区分布在集群中的不同结点上,从而让RDD中的数据可以被并行操作(分布式数据集),比如有个RDD有90W数据,3个partition,则每个分区上有30W数据。RDD通常通过Hadoop上的文件,即HDFS或者HIVE表来创建,还可以通过应用程序中的集合来创建;

  • 所有算子都是基于rdd来执行的,不同的场景会有不同的rdd实现类,但是都可以进行互相转换。rdd执行过程中会形成dag图,然后形成lineage保证容错性等。从物理的角度来看rdd存储的是block和node之间的映射

  • RDD最重要的特性就是容错性,可以自动从节点失败中恢复过来。即如果某个结点上的RDD partition因为节点故障,导致数据丢失,那么RDD可以通过自己的数据来源重新计算该partition。这一切对使用者都是透明的。

  • RDD的弹性体现在于RDD上自动进行内存和磁盘之间权衡和切换的机制。

Spark streaming以及基本工作原理

  • 可以用于进行大规模、高吞吐量、容错的实时数据流的处理它支持从多种数据源读取数据,比如Kafka、Flume、Twitter和TCP Socket,并且能够使用算子比如map、reduce、join和window等来处理数据,处理后的数据可以保存到文件系统、数据库等存储中。

  • Spark streaming内部的基本工作原理是:接受实时输入数据流,然后将数据拆分成batch,比如每收集一秒的数据封装成一个batch,然后将每个batch交给spark的计算引擎进行处理,最后会生产处一个结果数据流,其中的数据也是一个一个的batch组成的。

  • DStream代表了一个持续不断的数据流,内部不断产生RDD,每个RDD包含了一个时间段的数据

Spark工作机制

  • 用户在client端提交作业后,会由Driver运行main方法并创建spark context上下文

  • 执行rdd算子,形成DAG图输入DAGscheduler

  • 按照rdd之间的依赖关系划分stage输入task scheduler

  • task scheduler会将stage划分为task set分发到各个节点的executor中执行

宽依赖和窄依赖

  • 宽依赖,本质就是shuffle。父RDD的每一个partition中的数据,都可能会传输一部分到下一个子RDD的每一个partition中,此时会出现父RDD和子RDD的partition之间具有交互错综复杂的关系,这种情况就叫做两个RDD之间是宽依赖。
  • 窄依赖,父RDD和子RDD的partition之间的对应关系是一对一的。

Spark主备切换机制原理

Spark Master主备切换可以基于两种机制,一种是基于文件系统的,一种是基于ZooKeeper的。

  • 基于文件系统的主备切换机制,需要在Active Master挂掉之后手动切换到Standby Master上
  • 而基于Zookeeper的主备切换机制,可以实现自动切换Master。

Spark数据倾斜的产生和解决方法

  • 在spark中同一个应用程序划分成多个stage,这些stage之间是串行执行的,而一个stage里面的多个task是可以并行执行task数目由partition数目决定,如果一个partition的数目特别大,那么导致这个task执行时间很长,导致接下来的stage无法执行,从而导致整个job执行变慢。
  • 避免数据倾斜,一般是要选用合适的key,或者自己定义相关的partitioner,通过加盐或者哈希值来拆分这些key,从而将这些数据分散到不同的partition去执行。
  • 如下算子会导致shuffle操作,是导致数据倾斜可能发生的关键点所在:groupByKey;reduceByKey;aggregaByKey;join;cogroup;

Spark Sql 和 DataFrame

RDD中reduceBykey与groupByKey哪个性能好

  • reduceByKey:reduceByKey会在结果发送至reducer之前会对每个mapper在本地进行merge,有点类似于在MapReduce中的combiner。这样做的好处在于,在map端进行一次reduce之后,数据量会大幅度减小,从而减小传输,保证reduce端能够更快的进行结果计算。

  • groupByKey:groupByKey会对每一个RDD中的value值进行聚合形成一个序列(Iterator)此操作发生在reduce端,所以势必会将所有的数据通过网络进行传输,造成不必要的浪费。同时如果数据量十分大,可能还会造成OutOfMemoryError。

  • 大量数据的reduce操作时候建议使用reduceByKey。不仅可以提高速度,还可以防止使用groupByKey造成的内存溢出问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值