Spark2x基于内存的分布式计算

目录

1.Spark概述

Spark应用场景:

Spark的特点:

Spark  VS  MapReduce:

2.Spark原理与架构

Spark Core

Spark核心概念RDD:

RDD的依赖关系

RDD的Stage划分

Spark重要角色

Spark on Yarn-client的运行流程

Spark on Yarn-cluster的运行流程 

Yarn-client与Yarn-cluster的区别

Spark SQL和Dataset

Datarame介绍

RDD、DataFrame与Dataset 

Spark SQL vs Hive

Spark Structured Streaming

Structured Streaming计算模型

Spark Streaming

Spark Streaming容错机制

3.Spark在FusionInsight中的集成情况

Spark常驻进程

Spark与其他组件


1.Spark概述

Apache Spark是一种基于内存的快速、通用、可扩展的大数据计算引擎。Spark是一站式解决方案,集合批处理、实时流处理、交互式查询、图处理与机器学习于一体。

 

Spark应用场景:

  • 批处理:可用于ETL(抽取、转换、加载)。
  • 机器学:习可用于自动判断淘宝的买家评论是好评还是差评。
  • 交互式分析:可用于查询Hive数据仓库。
  • 流处理:可用于页面点击流分析,推荐系统,舆情分析等实时业务。

 

Spark的特点:

  • 轻:Spark核心代码有3万行。

Scala语言的简洁和丰富表达力。

巧妙利用了HadoopMesos的基础设施。

  • 快:Spark对小数据集可达到亚秒级的延迟。

对大数据集的迭代机器学习即席查询、图计算等应用,Spark 版本比基于MapReduceHivePregel的实现快。

内存计算、数据本地性和传输优化、调度优化。

  • 灵:Spark提供了不同层面的灵活性。

Scala语言trait动态混入策略(如可更换的集群调度器、序列化库)

允许扩展新的数据算子、新的数据源、新的language bindings

Spark支持内存计算、多迭代批量处理、即席查询、流处理和图计算等多种范式。

  • 巧:巧妙借力现有大数据组件。

SparkHadoop之势,与Hadoop无缝结合。

图计算借用PregelPowerGraphAPI以及PowerGraph的点分割思想。

Spark  VS  MapReduce:

  • 性能上提升了100倍(全内存计算)。
  • Spark的中间数据放在内存中,对于迭代运算、批处理计算的效率更高、延迟更低。
  • 提供更多的数据集操作类型,编程模型更加灵活,开发效率更高。
  • 更高的容错能力(血统机制)。

Spark2x基于内存的分布式计算_第1张图片

  • Spark用十分之一的资源,获得#倍与MapReduce的性能。

 

Cores:集群总核数。

Rate:集群读取数据速度。

Rate/node:平均节点读取数据速度。

Daytona Gray:Sort Benchmark的一个通用排序竞赛项目。

 

2.Spark原理与架构

Spark2x基于内存的分布式计算_第2张图片

 

SparkCore:类似于MR的分布式内存计算框架,最大的特点是将中间计算结果直接放在内存中,提升计算性能。自带了Standalone模式的资源管理框架,同时,也支持YARNMESOS的资源管理系统。FI集成的是Spark On Yarn的模式。其它模式暂不支持。

SparkSQLSpark SQL是一个用于处理结构化数据的Spark组件,作为Apache Spark大数据框架的一部分,主要用于结构化数据处理和对数据执行类SQL查询。通过Spark SQL,可以针对不同数据格式(如:JSONParquetORC等)和数据源执行ETL操作(如:HDFS、数据库等),完成特定的查询操作。

SparkStreaming:微批处理的流处理引擎,将流数据分片以后用SparkCore的计算引擎中进行处理。相对于Storm,实时性稍差,优势体现在吞吐量上。

MllibGraphX主要一些算法库。

FusionInsight Spark默认运行在YARN集群之上。

Structured Streaming2.0版本之后的spark独有。

 

Spark Core

Spark核心概念RDD:

RDD(Resilient Distrbuted Datasets)即弹性分布式数据集,是一个只读的、可分区的分布式数据集。

 

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

Spark2x基于内存的分布式计算_第3张图片

RDD的依赖关系

 

窄依赖是指父RDD的每个分区最多被一个子RDD的一个分区所用

宽依赖是指父RDD的每个分区对应一个子RDD的多个分区,是stage划分的依据

Spark2x基于内存的分布式计算_第4张图片

RDD数据集通过Lineage记住了它是如何从其他RDD中演变过来的。

RDD的Stage划分

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

Spark2x基于内存的分布式计算_第5张图片

Spark2x基于内存的分布式计算_第6张图片

DAGScheduleJob划分一个个stage。每个stage对应一个TaskSetTaskSet由一组业务逻辑完全相同只是数据不同的Task组成。这些TaskSet最终被提交给TaskSchedule

每个TaskSchedule都对应一个ScheduleBackendTaskSchedule负责Application的不同Job之间的调度,在Task执行任务失败时启动重试机制,并且为执行速度慢的Task启动备份的任务。ScheduleBackend负责与Cluster Manger(如Resource Manager)交互,取得该Application分配到的资源,并将这些资源传给TaskSchedule,由TaskScheduleTask最终分配计算资源。

 

lTransformation

Transformation是通过转换从一个或多个RDD生成新的RDD,该操作是lazy的,当调用action算子,才发起job

典型算子:mapflatMapfilterreduceByKey等。

Action

当代码调用该类型算子时,立即启动job

典型算子:takecountsaveAsTextFile等。

 

Spark重要角色

Driver:负责应用的业务逻辑和运行规划(DAG)。

ApplicationMaster:负责应用的资源管理,根据应用的需要,向ResourceManager申请资源。

Client:需求提出方,负责提交需求(应用)。

lResourceManager:资源管理部门,负责整个集群的资源统一调度和分配。

Nodemanager:负责本节点的资源管理。

Executor:实际任务的执行者。一个应用会分拆给多个Executor来进行计算。

 

Spark on Yarn-client的运行流程

Spark2x基于内存的分布式计算_第7张图片

l1.客户端向ResourceManager发送Spark应用提交请求,ResourceManager为其返回应答,该应答中包含多种信息(ApplicationId、可用资源使用上限和下限等)client端将启动ApplicationMaster所需的所有信息打包,提交给ResourceManager上。

l2. ResourceManager收到请求后,会为ApplicationMaster寻找合适的节点,并在该节点上启动它。ApplicationMasterYarn中的角色,在Spark中进程名字是ExecutorLauncher

l3. 根据每个任务的资源需求,ApplicationMaster可向ResourceManager申请一系列用于运行任务的Container

l4. ApplicationMaster(从ResourceManager端)收到新分配的Container列表后,会向对应的NodeManager发送信息以启动ContainerResourceManager分配ContainerSparkContextSparkContext和相关的NodeManager通讯,在获得的Container上启动 CoarseGrainedExecutorBackendCoarseGrainedExecutorBackend启动后,开始向SparkContext注册并申请Task

l5. SparkContext分配TaskCoarseGrainedExecutorBackend执行。CoarseGrainedExecutorBackend执行Task并向SparkContext汇报运行状况。

Spark on Yarn-cluster的运行流程 

Spark2x基于内存的分布式计算_第8张图片

Yarn-cluster模式下,driverappmaster中启动。此时,appMaster不但负责资源的申请,还负责与executorresource的通信。

详细流程:

1. client生成Application信息,提交给ResourceManager

2. ResourceManagerSpark Application分配第一个Container(ApplicationMaster),并在该Container上启动Driver

3. ApplicationMasterResourceManager申请资源以运行ContainerResourceManager分配ContainerApplicationMasterApplicationMaster和相关的NodeManager通讯,在获得的Container上启动Executor,Executor启动后,开始向Driver注册并申请Task

4. Driver分配TaskExecutor执行。

5. Executor执行Task并向Driver汇报运行状况。

 

Yarn-clientYarn-cluster的区别

  • Yarn-clientYarn-cluster主要区别是Application Master进程的区别。
  • Yarn-client适合测试,Yarn-cluster适合生产。
  • Yarn-client任务提交节点宕机,整个任务会失败。Yarn-cluster不会。

 

生产环境中,spark部署在Linux服务器中。目前尚未实现在Windows环境下实现spark生产集群部署。

Yarn-cluster适合生产是因为可以更快的看到APP的输出。

yarn-cluster模式下,driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行。然而yarn-cluster模式不适合运行交互类型的作业。而yarn-client模式下,Application Master仅仅向YARN请求executorclient会和请求的container通信来调度他们工作,也就是说Client不能离开。

 

Spark SQL和Dataset

Spark SQLSpark中用于结构化数据处理的模块。在Spark应用中,可以无缝的使用SQL语句亦或是DataFrame API对结构化数据进行查询。

  • park SQLSQL语言解析成RDD,再由Spark Core执行。
  • API: Application Programming Interface,应用程序编程接口。
  • DataFrame是一个分布式集合,其中数据被组织为命名的列。
  • DataFrame的前身是SchemaRDD,从Spark 1.3.0开始SchemaRDD更名为DataFrameRDD可看作是分布式的对象的集合,Spark并不知道对象的详细模式信息,DataFrame可看作是分布式的Row对象的集合,其提供了由列组成的详细模式信息,使得Spark SQL可以进行某些形式的执行优化。

DataSet是一个由特定域的对象组成的强类型集合,可通过功能或关系操作并行转换其中的对象。DataSet以Catalyst逻辑执行计划表示,并且数据以编码的二进制形式存储,不需要反序列化就可以执行sortfiltershuffle等操作。Dataset是“懒惰”的,只在执行action操作时触发计算。当执行action操作时,Spark用查询优化程序来优化逻辑计划,并生成一个高效的并行分布式的物理计划。

Dataset是一个新的数据类型。DatasetRDD高度类似,性能比较好。

Dataset不需要反序列化就可执行大部分操作。本质上,数据集表示一个逻辑计划,该计划描述了产生数据所需的计算。

Catalyst优化器。

Dataset RDD 相似, 然而, 并不是使用 Java 序列化或者 Kryo 编码器来序列化用于处理或者通过网络进行传输的对象。 虽然编码器和标准的序列化都负责将一个对象序列化成字节,编码器是动态生成的代码,并且使用了一种允许 Spark 去执行许多像 filtering, sorting 以及 hashing 这样的操作, 不需要将字节反序列化成对象的格式。

jvm中存储的java对象可以是序列化的,也可以是反序列化的。序列化的对象是将对象格式化成二进制流,可以节省内存。反序列化则与序列化相对,是没有进行二进制格式化,正常存储在jvm中的一般对象。RDD可以将序列化的二进制流存储在jvm中,也可以是反序列化的对象存储在JVM中。至于现实使用中是使用哪种方式,则需要视情况而定。例如如果是需要最终存储到磁盘的,就必须用序列化的对象。如果是中间计算的结果,后期还会继续使用这个结果,一般都是用反序列化的对象。

Datarame介绍

Spark2x基于内存的分布式计算_第9张图片

DataFrame提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame多了数据的结构信息,即schema。这里主要对比DatasetDataFrame,因为DatasetDataFrame拥有完全相同的成员函数,区别只是每一行的数据类型不同DataFrame也可以叫Dataset[Row],每一行的类型是Row,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知,只能用getAS方法或者共性中的模式匹配拿出特定字段。而Dataset中,每一行是什么类型是不一定的,在自定义了case class之后可以很自由的获得每一行的信息,结合上图总结出,DataFrame列信息明确,行信息不明确。

由于DataFrame带有schema信息,因此,查询优化器可以进行有针对性的优化,以提高查询效率。

DataFrame在序列化与反序列化时,只需对数据进行序列化,不需要对数据结构进行序列化。

Row:代表关系型操作符的输出行;类似Mysql的行。

 

RDDDataFrameDataset 

  • RDD

优点:类型安全,面向对象。

缺点:序列化和反序列化的性能开销大;GC的性能开销,频繁的创建和销毁对象, 势必会增加GC

RDD无论是集群间的通信, 还是IO操作都需要对对象的结构和数据进行序列化和反序列化。

  • DataFrame

优点:自带scheme信息,降低序列化反序列化开销。

缺点:不是面向对象的;编译期不安全。

DataFrame另一个优点,off-heap : 意味着JVM堆以外的内存, 这些内存直接受操作系统管理(而不是JVM)。Spark能够以二进制的形式序列化数据(不包括结构)off-heap, 当要操作数据时, 就直接操作off-heap内存. 由于Spark理解schema, 所以知道该如何操作。

  • Dataset:

快:大多数场景下,性能优于RDDEncoders优于Kryo或者Java序列化;避免不必要的格式转化。主要是降低了序列化和反序列化开销,及大量的GC开销。

类型安全:类似于RDD,函数尽可能编译时安全

DataFrame,RDD互相转化

RDD是底层的数据结构。

Spark SQL vs Hive

区别:

  • Spark SQL的执行引擎为Spark coreHive默认执行引擎为MapReduce
  • Spark SQL的执行速度是Hive10-100倍。
  • Spark SQL不支持bucketsHive支持。

联系:

  • Spark SQL依赖Hive的元数据。
  • Spark SQL兼容绝大部分Hive的语法和函数。
  • Spark SQL可以使用Hive的自定义函数。

Spark SQLHive的语法除了桶表操作外,基本一样。

Spark SQL完美兼容Hive的函数。

 

Spark Structured Streaming

Structured Streaming是构建在Spark SQL引擎上的流式数据处理引擎。可以像使用静态RDD数据那样编写流式计算过程。当流数据连续不断的产生时,Spark SQL将会增量的、持续不断的处理这些数据,并将结果更新到结果集中。

 

Structured Streaming的核心是将流式的数据看成一张数据不断增加的数据库表,这种流式的数据处理模型类似于数据块处理模型,可以把静态数据库表的一些查询操作应用在流式计算中,Spark执行标准的SQL查询,从无边界表中获取数据。

无边界表:新数据不断到来,旧数据不断丢弃,实际上是一个连续不断的结构化数据流。

Structured Streaming计算模型

Spark2x基于内存的分布式计算_第10张图片

每一条查询的操作都会产生一个结果集Result Table。每一个触发间隔,当新的数据新增到表中,都会最终更新Result Table。无论何时结果集发生了更新,都能将变化的结果写入一个外部的存储系统。

Structured StreamingOutPut阶段可以定义不同的数据写入方式,有如下3种:

  • Complete Mode:整个更新的结果集都会写入外部存储。整张表的写入操作将由外部存储系统的连接器完成。
  • Append Mode:当时间间隔触发时,只有在Result Table中新增加的数据行会被写入外部存储。这种方式只适用于结果集中已经存在的内容不希望发生改变的情况下,如果已经存在的数据会被更新,不适合适用此种方式。
  • Update Mode:当时间间隔触发时,只有在Result Table中被更新的数据才会被写入外部存储系统。注意,和Complete Mode方式的不同之处是不更新的结果集不会写入外部存储。

Spark2x基于内存的分布式计算_第11张图片

 

Spark Streaming

Spark StreamingSpark核心API的一个扩展,一个实时计算框架。具有可扩展性、高吞吐量、可容错性等特点。

Spark2x基于内存的分布式计算_第12张图片

Spark Streaming基本原理:把输入数据以秒(毫秒)为单位切分,再定时提交这些切分后的数据。

Spark Streaming容错机制

Spark Streaming本质仍是基于RDD计算,当RDD的某些partition丢失,可以通过RDD的血统机制重新恢复丢失的RDD

Spark2x基于内存的分布式计算_第13张图片

基于RDD的血统机制,RDD中任意的Partition出错,都可以根据其父RDD重新计算生成。

l如果父RDD丢失,可继续向上寻找父RDD的父RDD,依次类推,直至去磁盘中查找原始数据。

 

 

3.Spark在FusionInsight中的集成情况

FusionInsight平台为Spark服务提供了管理监控的可视化界面,通过Web UI界面,可完成以下操作:

  1. 获取服务状态信息、角色信息以及开放的配置项。
  2. 管理操作:启停spark、下载spark客户端、同步配置。
  3. 查看运行实例的健康状态和服务总体概况。

Spark常驻进程

  • JDBCServer

实际上是一个长驻的spark应用,对外提供JDBC的服务。

用户可以通过执行beeline或者JDBC脚本,连接JDBCServer,执行sql语句。

主备部署,无单点故障。

  • JobHistory

该进程用于提供HistoryServer页面,展示历史Spark应用的执行信息。

双节点负荷分担,无单点故障。

还有一个SparkResource的角色,此角色没有常驻进程,仅在Spark应用提交的时候会用到这个角色下的配置和Jar文件。

Spark与其他组件

Spark2x基于内存的分布式计算_第14张图片

 

 

你可能感兴趣的:(大数据基本)