目录
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与其他组件
Apache Spark是一种基于内存的快速、通用、可扩展的大数据计算引擎。Spark是一站式解决方案,集合批处理、实时流处理、交互式查询、图处理与机器学习于一体。
Scala语言的简洁和丰富表达力。
巧妙利用了Hadoop和Mesos的基础设施。
对大数据集的迭代机器学习即席查询、图计算等应用,Spark 版本比基于MapReduce、Hive和Pregel的实现快。
内存计算、数据本地性和传输优化、调度优化。
Scala语言trait动态混入策略(如可更换的集群调度器、序列化库)。
允许扩展新的数据算子、新的数据源、新的language bindings 。
Spark支持内存计算、多迭代批量处理、即席查询、流处理和图计算等多种范式。
Spark借Hadoop之势,与Hadoop无缝结合。
图计算借用Pregel和PowerGraph的API以及PowerGraph的点分割思想。
Cores:集群总核数。
Rate:集群读取数据速度。
Rate/node:平均节点读取数据速度。
Daytona Gray:Sort Benchmark的一个通用排序竞赛项目。
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主要一些算法库。
FusionInsight Spark默认运行在YARN集群之上。
Structured Streaming为2.0版本之后的spark独有。
RDD(Resilient Distrbuted Datasets)即弹性分布式数据集,是一个只读的、可分区的分布式数据集。
窄依赖是指父RDD的每个分区最多被一个子RDD的一个分区所用。
宽依赖是指父RDD的每个分区对应一个子RDD的多个分区,是stage划分的依据
RDD数据集通过Lineage记住了它是如何从其他RDD中演变过来的。
实际应用提交的Job中RDD依赖关系是十分复杂的,依据这些依赖关系来划分stage自然是十分困难的,Spark此时就利用了前文提到的依赖关系,调度器从DAG图(有向无环图)末端出发,逆向遍历整个依赖关系链,遇到ShuffleDependency(宽依赖关系的一种叫法)就断开,遇到NarrowDependency就将其加入到当前stage。stage中task数目由stage末端的RDD分区个数来决定,RDD转换是基于分区的一种粗粒度计算,一个stage执行的结果就是这几个分区构成的RDD。
DAGSchedule将Job划分一个个stage。每个stage对应一个TaskSet,TaskSet由一组业务逻辑完全相同只是数据不同的Task组成。这些TaskSet最终被提交给TaskSchedule。
每个TaskSchedule都对应一个ScheduleBackend。TaskSchedule负责Application的不同Job之间的调度,在Task执行任务失败时启动重试机制,并且为执行速度慢的Task启动备份的任务。ScheduleBackend负责与Cluster Manger(如Resource Manager)交互,取得该Application分配到的资源,并将这些资源传给TaskSchedule,由TaskSchedule为Task最终分配计算资源。
lTransformation
Transformation是通过转换从一个或多个RDD生成新的RDD,该操作是lazy的,当调用action算子,才发起job。
典型算子:map、flatMap、filter、reduceByKey等。
Action
当代码调用该类型算子时,立即启动job。
典型算子:take、count、saveAsTextFile等。
Driver:负责应用的业务逻辑和运行规划(DAG)。
ApplicationMaster:负责应用的资源管理,根据应用的需要,向ResourceManager申请资源。
Client:需求提出方,负责提交需求(应用)。
lResourceManager:资源管理部门,负责整个集群的资源统一调度和分配。
Nodemanager:负责本节点的资源管理。
Executor:实际任务的执行者。一个应用会分拆给多个Executor来进行计算。
l1.客户端向ResourceManager发送Spark应用提交请求,ResourceManager为其返回应答,该应答中包含多种信息(如ApplicationId、可用资源使用上限和下限等)。client端将启动ApplicationMaster所需的所有信息打包,提交给ResourceManager上。
l2. ResourceManager收到请求后,会为ApplicationMaster寻找合适的节点,并在该节点上启动它。ApplicationMaster是Yarn中的角色,在Spark中进程名字是ExecutorLauncher。
l3. 根据每个任务的资源需求,ApplicationMaster可向ResourceManager申请一系列用于运行任务的Container。
l4. 当ApplicationMaster(从ResourceManager端)收到新分配的Container列表后,会向对应的NodeManager发送信息以启动Container。ResourceManager分配Container给SparkContext,SparkContext和相关的NodeManager通讯,在获得的Container上启动 CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后,开始向SparkContext注册并申请Task。
l5. SparkContext分配Task给CoarseGrainedExecutorBackend执行。CoarseGrainedExecutorBackend执行Task并向SparkContext汇报运行状况。
Yarn-cluster模式下,driver在appmaster中启动。此时,appMaster不但负责资源的申请,还负责与executor和resource的通信。
详细流程:
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部署在Linux服务器中。目前尚未实现在Windows环境下实现spark生产集群部署。
Yarn-cluster适合生产是因为可以更快的看到APP的输出。
yarn-cluster模式下,driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行。然而yarn-cluster模式不适合运行交互类型的作业。而yarn-client模式下,Application Master仅仅向YARN请求executor,client会和请求的container通信来调度他们工作,也就是说Client不能离开。
Spark SQL是Spark中用于结构化数据处理的模块。在Spark应用中,可以无缝的使用SQL语句亦或是DataFrame API对结构化数据进行查询。
DataSet是一个由特定域的对象组成的强类型集合,可通过功能或关系操作并行转换其中的对象。DataSet以Catalyst逻辑执行计划表示,并且数据以编码的二进制形式存储,不需要反序列化就可以执行sort、filter、shuffle等操作。Dataset是“懒惰”的,只在执行action操作时触发计算。当执行action操作时,Spark用查询优化程序来优化逻辑计划,并生成一个高效的并行分布式的物理计划。
Dataset是一个新的数据类型。Dataset与RDD高度类似,性能比较好。
Dataset不需要反序列化就可执行大部分操作。本质上,数据集表示一个逻辑计划,该计划描述了产生数据所需的计算。
Catalyst优化器。
Dataset 与 RDD 相似, 然而, 并不是使用 Java 序列化或者 Kryo 编码器来序列化用于处理或者通过网络进行传输的对象。 虽然编码器和标准的序列化都负责将一个对象序列化成字节,编码器是动态生成的代码,并且使用了一种允许 Spark 去执行许多像 filtering, sorting 以及 hashing 这样的操作, 不需要将字节反序列化成对象的格式。
jvm中存储的java对象可以是序列化的,也可以是反序列化的。序列化的对象是将对象格式化成二进制流,可以节省内存。反序列化则与序列化相对,是没有进行二进制格式化,正常存储在jvm中的一般对象。RDD可以将序列化的二进制流存储在jvm中,也可以是反序列化的对象存储在JVM中。至于现实使用中是使用哪种方式,则需要视情况而定。例如如果是需要最终存储到磁盘的,就必须用序列化的对象。如果是中间计算的结果,后期还会继续使用这个结果,一般都是用反序列化的对象。
DataFrame提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame多了数据的结构信息,即schema。这里主要对比Dataset和DataFrame,因为Dataset和DataFrame拥有完全相同的成员函数,区别只是每一行的数据类型不同DataFrame也可以叫Dataset[Row],每一行的类型是Row,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知,只能用getAS方法或者共性中的模式匹配拿出特定字段。而Dataset中,每一行是什么类型是不一定的,在自定义了case class之后可以很自由的获得每一行的信息,结合上图总结出,DataFrame列信息明确,行信息不明确。
由于DataFrame带有schema信息,因此,查询优化器可以进行有针对性的优化,以提高查询效率。
DataFrame在序列化与反序列化时,只需对数据进行序列化,不需要对数据结构进行序列化。
Row:代表关系型操作符的输出行;类似Mysql的行。
优点:类型安全,面向对象。
缺点:序列化和反序列化的性能开销大;GC的性能开销,频繁的创建和销毁对象, 势必会增加GC。
RDD无论是集群间的通信, 还是IO操作都需要对对象的结构和数据进行序列化和反序列化。
优点:自带scheme信息,降低序列化反序列化开销。
缺点:不是面向对象的;编译期不安全。
DataFrame另一个优点,off-heap : 意味着JVM堆以外的内存, 这些内存直接受操作系统管理(而不是JVM)。Spark能够以二进制的形式序列化数据(不包括结构)到off-heap中, 当要操作数据时, 就直接操作off-heap内存. 由于Spark理解schema, 所以知道该如何操作。
快:大多数场景下,性能优于RDD;Encoders优于Kryo或者Java序列化;避免不必要的格式转化。主要是降低了序列化和反序列化开销,及大量的GC开销。
类型安全:类似于RDD,函数尽可能编译时安全。
和DataFrame,RDD互相转化。
RDD是底层的数据结构。
区别:
联系:
Spark SQL和Hive的语法除了桶表操作外,基本一样。
Spark SQL完美兼容Hive的函数。
Structured Streaming是构建在Spark SQL引擎上的流式数据处理引擎。可以像使用静态RDD数据那样编写流式计算过程。当流数据连续不断的产生时,Spark SQL将会增量的、持续不断的处理这些数据,并将结果更新到结果集中。
Structured Streaming的核心是将流式的数据看成一张数据不断增加的数据库表,这种流式的数据处理模型类似于数据块处理模型,可以把静态数据库表的一些查询操作应用在流式计算中,Spark执行标准的SQL查询,从无边界表中获取数据。
无边界表:新数据不断到来,旧数据不断丢弃,实际上是一个连续不断的结构化数据流。
每一条查询的操作都会产生一个结果集Result Table。每一个触发间隔,当新的数据新增到表中,都会最终更新Result Table。无论何时结果集发生了更新,都能将变化的结果写入一个外部的存储系统。
Structured Streaming在OutPut阶段可以定义不同的数据写入方式,有如下3种:
Spark Streaming是Spark核心API的一个扩展,一个实时计算框架。具有可扩展性、高吞吐量、可容错性等特点。
Spark Streaming基本原理:把输入数据以秒(毫秒)为单位切分,再定时提交这些切分后的数据。
Spark Streaming本质仍是基于RDD计算,当RDD的某些partition丢失,可以通过RDD的血统机制重新恢复丢失的RDD。
基于RDD的血统机制,RDD中任意的Partition出错,都可以根据其父RDD重新计算生成。
l如果父RDD丢失,可继续向上寻找父RDD的父RDD,依次类推,直至去磁盘中查找原始数据。
FusionInsight平台为Spark服务提供了管理监控的可视化界面,通过Web UI界面,可完成以下操作:
实际上是一个长驻的spark应用,对外提供JDBC的服务。
用户可以通过执行beeline或者JDBC脚本,连接JDBCServer,执行sql语句。
主备部署,无单点故障。
该进程用于提供HistoryServer页面,展示历史Spark应用的执行信息。
双节点负荷分担,无单点故障。
还有一个SparkResource的角色,此角色没有常驻进程,仅在Spark应用提交的时候会用到这个角色下的配置和Jar文件。