Spark理论知识

Spark简介

2009年诞生于美国加州大学伯克利分校AMP实验室。Apache Spark是一种基于内存的快速、通用、可扩展的大数据计算引擎。Spark 是一站式解决方案,集批处理、实时流处理、交互式查询、图计算与机器学习于一体。

spark特点

  • 轻:Spark核心代码有3万行。
    Scala语言的简洁和丰富表达力。巧妙利用了Hadoop和Mesos的基础设施。
  • 快:Spark对小数据集可达到亚秒级的延迟。
    对大数据集的迭代机器学习即席查询、图计算等应用,Spark 版本比基于MapReduce、Hive和Pregel的实现快。内存计算、数据本地性和传输优化、调度优化。
  • 灵:Spark提供了不同层面的灵活性。
    Scala语言trait动态混入策略(如可更换的集群调度器、序列化库)。允许扩展新的数据算子、新的数据源、新的language bindings 。Spark支持内存计算、多迭代批量处理、即席查询、流处理和图计算等多种范式。
  • 巧:巧妙借力现有大数据组件。
    Spark借Hadoop之势,与Hadoop无缝结合。图计算借用Pregel和PowerGraph的API以及PowerGraph的点分割思想。

Spark与MapReduce

在这里插入图片描述

  • Spark计算过程数据部落盘,结果不落盘。Mapreduce数据存放本地,结果溢出时存放本地。性能上提升高于100倍(全内存计算)。
  • Spark的中间数据放在内存中,对于迭代运算、批处理计算的效率更高,延迟更低。
  • 提供更多的数据集操作类型,编程模型更灵活,开发效率更高。
  • 更高的容错能力(血统机制)。
  • Spark用十分之一的资源,获得3倍与Mapreduce的性能。

Spark体系

在这里插入图片描述

  • SparkCore:类似于MR的分布式内存计算框架,最大的特点是将中间计算结果直接放在内存中,提升计算性能。自带了Standalone模式的资源管理框架,同时,也支持YARN、MESOS的资源管理系统。FI集成的是Spark On Yarn的模式。其它模式暂不支持。
  • SparkSQL:Spark SQL是一个用于处理结构化数据的Spark组件,作为Apache Spark大数据框架的一部分,主要用于结构化数据处理和对数据执行类SQL查询。通过Spark SQL,可以针对不同数据格式(如:JSON,Parquet, ORC等)和数据源执行ETL操作(如:HDFS、数据库等),完成特定的查询操作。
  • SparkStreaming:微批处理的流处理引擎,将流数据分片以后用SparkCore的计算引擎中进行处理。相对于Storm,实时性稍差,优势体现在吞吐量上。
  • Mllib和GraphX主要一些算法库。

Spark核心概念RDD

在这里插入图片描述

  • RDD(Resilient Distributed Datasets) 即弹性分布式数据集,是一个只读的,可分区的分布式数据集。
  • RDD 默认存储在内存,当内存不足时,溢写到磁盘。
  • RDD 数据以分区的形式在集群中存储。
  • RDD 具有血统机制( Lineage ),发生数据丢失时,可快速进行数据恢复。
  • RDD是Spark对基础数据的抽象。
    • RDD的生成:从Hadoop文件系统(或与Hadoop兼容的其它存储系统)输入创建(如HDFS);从父RDD转换得到新的RDD。
    • RDD的存储:用户可以选择不同的存储级别存储RDD以便重用(11种);RDD默认存储于内存,但当内存不足时,RDD会溢出到磁盘中。
    • RDD的分区:为减少网络传输代价,和进行分布式计算,需对RDD进行分区。在需要进行分区时会根据每条记录Key进行分区,以此保证两个数据集能高效进行Join操作。
    • RDD的优点:RDD是只读的,静态的。因此可提供更高的容错能力;可以实现推测式执行。

RDD的依赖关系

在这里插入图片描述

  1. 窄依赖是指父RDD的每个分区最多被一个子RDD的一个分区所用。一个爸爸只有一个孩子。
  2. 宽依赖是指父RDD的每个分区对应一个子RDD的多个分区,是stage划分的依据。一个爸爸有多个孩子。
  3. Lineage(血统):依赖的链条
  4. RDD数据集通过Lineage记住了它是如何从其他RDD中演变过来的。

RDD的Stage划分

在这里插入图片描述
实际应用提交的Job中RDD依赖关系是十分复杂的,依据这些依赖关系来划分stage自然是十分困难的,Spark此时就利用了前文提到的依赖关系,调度器从DAG图末端出发,逆向遍历整个依赖关系链,遇到ShuffleDependency(宽依赖关系的一种叫法)就断开,遇到NarrowDependency就将其加入到当前stage。stage中task数目由stage末端的RDD分区个数来决定,RDD转换是基于分区的一种粗粒度计算,一个stage执行的结果就是这几个分区构成的RDD。

RDD的算子

  • Transformation
    Transformation是通过转换从一个或多个RDD生成新的RDD,该操作是lazy的,当调用action算子,才发起job。
    典型算子:map、flatMap、filter、reduceByKey等。
  • Action
    当代码调用该类型算子时,立即启动job。
    典型算子:take、count、saveAsTextFile等。

Spark的任务调度

在这里插入图片描述

  1. DAGSchedule将Job划分一个个stage。每个stage对应一个TaskSet,TaskSet由一组业务逻辑完全相同只是数据不同的Task组成。这些TaskSet最终被提交给TaskSchedule。
  2. 每个TaskSchedule都对应一个ScheduleBackend。TaskSchedule负责Application的不同Job之间的调度,在Task执行任务失败时启动重试机制,并且为执行速度慢的Task启动备份的任务。
  3. ScheduleBackend负责与Cluster Manger(如Resource Manager)交互,取得该Application分配到的资源,并将这些资源传给TaskSchedule,由TaskSchedule为Task最终分配计算资源。

Spark on Yarn-client

在这里插入图片描述

  1. 客户端向ResourceManager发送Spark应用提交请求,ResourceManager为其返回应答,该应答中包含多种信息(如ApplicationId、可用资源使用上限和下限等)。client端将启动ApplicationMaster所需的所有信息打包,提交给ResourceManager上。
  2. ResourceManager收到请求后,会为ApplicationMaster寻找合适的节点,并在该节点上启动它。ApplicationMaster是Yarn中的角色,在Spark中进程名字是ExecutorLauncher。
  3. 根据每个任务的资源需求,ApplicationMaster可向ResourceManager申请一系列用于运行任务的Container。
  4. 当ApplicationMaster(从ResourceManager端)收到新分配的Container列表后,会向对应的NodeManager发送信息以启动Container。ResourceManager分配Container给SparkContext,SparkContext和相关的NodeManager通讯,在获得的Container上启动 CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后,开始向SparkContext注册并申请Task。
  5. SparkContext分配Task给CoarseGrainedExecutorBackend执行。CoarseGrainedExecutorBackend执行Task并向SparkContext汇报运行状况。

Spark on Yarn-cluster

在这里插入图片描述

  1. client生成Application信息,提交给ResourceManager。
  2. ResourceManager为Spark Application分配第一个Container(ApplicationMaster),并在该Container上启动Driver。
  3. ApplicationMaster向ResourceManager申请资源以运行Container。ResourceManager分配Container给ApplicationMaster,ApplicationMaster和相关的NodeManager通讯,在获得的Container上启动
    Executor,Executor启动后,开始向Driver注册并申请Task。
  4. Driver分配Task给Executor执行。
  5. Executor执行Task并向Driver汇报运行状况。

Spark SQL概述

Spark SQL是Spark中用于结构化数据处理的模块。在Spark应用中,可以无缝的使用SQL语句亦或是DataFrame API对结构化数据进行查询。Spark SQL将SQL语言解析成RDD,再由Spark Core执行。

Dataset

DataSet是一个由特定域的对象组成的强类型集合,可通过功能或关系操作并行转换其中的对象。
DataSet以Catalyst逻辑执行计划表示,该计划描述了产生数据所需的计算,并且数据以编码的二进制形式存储,不需要反序列化就可以执行sort、filter、shuffle等操作。
Dataset是“懒惰”的,只在执行action操作时触发计算。当执行action操作时,Spark用查询优化程序来优化逻辑计划,并生成一个高效的并行分布式的物理计划。
Dataset是一个新的数据类型。Dataset与RDD高度类似,性能比较好。Dataset 与 RDD 相似, 然而, 并不是使用 Java 序列化或者 Kryo 编码器来序列化用于处理或者通过网络进行传输的对象。 虽然编码器和标准的序列化都负责将一个对象序列化成字节,编码器是动态生成的代码,并且使用了一种允许 Spark 去执行许多像 filtering, sorting 以及 hashing 这样的操作, 不需要将字节反序列化成对象的格式。
jvm中存储的java对象可以是序列化的,也可以是反序列化的。序列化的对象是将对象格式化成二进制流,可以节省内存。反序列化则与序列化相对,是没有进行二进制格式化,正常存储在jvm中的一般对象。RDD可以将序列化的二进制流存储在jvm中,也可以是反序列化的对象存储在JVM中。至于现实使用中是使用哪种方式,则需要视情况而定。例如如果是需要最终存储到磁盘的,就必须用序列化的对象。如果是中间计算的结果,后期还会继续使用这个结果,一般都是用反序列化的对象。

RDD与dataset

  • RDD:
    优点:类型安全,面向对象。
    缺点:序列化和反序列化的性能开销大;GC的性能开销,频繁的创建和销毁对象, 势必会增加GC。
  • Dataset的特点:
    快:大多数场景下,性能优于RDD;Encoders优于Kryo或者Java序列化;避免不必要的格式转化。
    类型安全:类似于RDD,函数尽可能编译时安全。
    和RDD互相转化。

Spark SQL vs Hive

  • 区别:
    Spark SQL的执行引擎为Spark core,Hive默认执行引擎为MapReduce。
    Spark SQL的执行速度是Hive的10-100倍。
    Spark SQL不支持buckets(桶表),Hive支持。
  • 联系:
    Spark SQL依赖Hive的元数据。
    Spark SQL兼容绝大部分Hive的语法和函数。
    Spark SQL可以使用Hive的自定义函数。

Spark Streaming

Spark Streaming是Spark核心API的一个扩展,一个实时计算框架。具有可扩展性、高吞吐量、可容错性等特点。Spark Streaming 计算基于DStream,将流式计算分解成一系列短小的批处理作业。把输入数据以秒(毫秒)为单位切分,再定时提交这些切分后的数据。

Spark Streaming vs Storm

在这里插入图片描述
事实上,Spark Streaming绝对谈不上比Storm优秀。这两个框架在实时计算领域中,都很优秀,只是擅长的细分场景并不相同。Spark Streaming仅仅在吞吐量上比Storm要优秀。

  • 对于Storm来说:
  1. 建议在那种需要纯实时,不能忍受1秒以上延迟的场景下使用,比如实时金融系统,要求纯实时进行金融交易和分析。
  2. 如果对于实时计算的功能中,要求可靠的事务机制和可靠性机制,即数据的处理完全精准,一条也不能多,一条也不能少,也可以考虑使用Storm。
  3. 如果还需要针对高峰低峰时间段,动态调整实时计算程序的并行度,以最大限度利用集群资源(通常是在小型公司,集群资源紧张的情况),也可以考虑用Storm。
  4. 如果一个大数据应用系统,它就是纯粹的实时计算,不需要在中间执行SQL交互式查询、复杂的transformation算子等,那么用Storm是比较好的选择。
  • 对于Spark Streaming来说:
  1. 如果对上述适用于Storm的三点,一条都不满足的实时场景,即,不要求纯实时,不要求强大可靠的事务机制,不要求动态调整并行度,那么可以考虑使用Spark Streaming。
  2. 位于Spark生态技术栈中,因此Spark Streaming可以和Spark Core、Spark SQL无缝整合,也就意味着,我们可以对实时处理出来的中间数据,立即在程序中无缝进行延迟批处理、交互式查询等操作。这个特点大大增强了Spark Streaming的优势和功能。

Structured Streaming

Structured Streaming是构建在Spark SQL引擎上的流式数据处理引擎。可以像使用静态RDD数据那样编写流式计算过程。当流数据连续不断的产生时,Spark SQL将会增量的、持续不断的处理这些数据,并将结果更新到结果集中。Structured Streaming的核心是将流式的数据看成一张数据不断增加的数据库表,这种流式的数据处理模型类似于数据块处理模型,可以把静态数据库表的一些查询操作应用在流式计算中,Spark执行标准的SQL查询,从无边界表中获取数据。

Spark扩展

  1. hdfs上的一个大数据文件,被分成3个分区(3个datanode),在mapreduce中会分成3个map运行,由于spark中的RDD是可分区的分布式数据集,所以运行1个RDD。
  2. RDD运行时尽可能避免分区大于节点数。
  3. RDD的血统机制:当某分区的RDD挂了之后,可以通过查找该RDD的父RDD,在父RDD上运行计算。
  4. 一个应用对应多个job,一个job对应一个executor,一个executor可以对应多个task,建议一个executor对应一个task。
  5. 父RDD存放读取文件的方法和分区信息,子RDD存放父RDD的引用和血统机制用到的逻辑运算。
  6. 所有RDD用血统机制,同时引进内存存放机制,一个是cache机制,结果存放在内存;另一个是checkpoint机制,结果存放在本地。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值