您的位置:首页 > 运维架构 > 网站架构

spark:架构+运行机制的一些总结--50

2015-06-25 09:57 603 查看
Hadoop中包含计算框架MapReduce和分布式文件系统HDFS,spark是一个计算框架

//

中间结果:spark保存到内存、Hadoop保存到磁盘,spark将执行模型抽象为通用的有向无环图通用计划(DAG)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

数据格式和内存布局:

spark:分布式内存存储结构弹性分布式数据集RDD,进行数据的存储,RDD支持粗粒度写操作,RDD读取可精确到每条数据记录,RDD可用来做分布式索引

spark特性,能够控制数据在不同节点上的分区,用户可以自定义分区策略,如:HASH分区等

//

执行策略:

MapReduce花费大量时间在数据shuffle排序,spark调用任务执行计划图(DAG),每一轮次输出结果在内存缓存

//

任务调度开销:

spark采用事件驱动的类库AKKA来启动任务,通过线程池复用线程来避免进程或线程启动和切换开销

//

spark生态系统为“伯克利数据分析栈”(BDAS),Mesos是一个资源管理框架,spark自带的资源管理框架Standalone,Mesos会对资源和任务进行隔离,并实现高效的资源任务调度,YARN与其类似

spark框架:Master/Slave模型

//

spark中Driver和Worker是两个重要角色,Driver是程序应用的执行起点,负责作业调度,即Task任务的分发,Worker用来管理和创建Executer并行任务

Driver将Task和Task所依赖的file和jar序列化后传递给对应的worker机器

Executor:执行器,用于启动线程池运行任务

//

SparkEnv:线程级别的上下文,存储运行时的重要组件的引用,包括:

MapOutputTracker:负责shuffle元信息的存储

BroadcastManager:广播变量控制与元信息存储

BlockManager:存储管理、创建和查找块

//

SparkContext:整个应用的上下文,控制应用的分布周期

//

整体流程:

client提交应用,Master找到一个Worker启动Driver,Driver向Master资源管理器申请资源,之后将应用转化为RDD Graph,再由DAGScheduler将RDD Graph转化为Stage的有向无环图,提交给TaskScheduler,由TaskScheduler提交任务给Executer执行

HDFS->textFile->Tranformation->SaveAsSequenceFile->HDFS

//

Spark on YARN:让spark计算模型在云梯YARN集群上运行,直接读取云梯上的丰富计算资源

//

BlockManager:管理RDD物理分区,本质上一个RDD在代码中相当于数据的一个元数据结构

//

RDD:存储着数据分区及其逻辑结构映射关系,存储着RDD之前的依赖转换关系,通过对RDD的依赖转换关系形成spark的调度顺序

RDD两种创建方式:一是由父RDD的转换,二是由HDFS之类文件系统的创建

RDD两种操作算子:Transformation、Action

RDD内部属性:1.分区列表,2.计算每个分片的函数,3.对父RDD的依赖列表,4.对Key-Value数据类型RDD的分区、控制分区策略和分区数,5.每个分区的地址列表

一个RDD可以存储在几个分区上,一个分区可以存储几个RDD的一部分

RDD逻辑上按Partition分块,物理上以Block为存储单位

//

几个API:

saveAsTextFile:函数将数据输出,存储到HDFS的指定目录

saveAsObjectFile:将分区中每10个元素组成一个Array,将其序列化,写入HDFS为SequenceFile格式

collect:相当于toArray【过时】,将分布式RDD返回为单机的scalaArray数组

collectAsMap:对(k,v)型RDD返回一个单机HashMap

lookup:(k,v)返回指定key对应的元素形成Seq

count:RDD的元素个数

top:返回最大的元素

//

执行机制:

RDD的Action算子触发Job的提交,提交到spark中的Job生成RDD DAG,由DAGScheduler转化成Stage DAG,每个Stage中产生相应的Task集合,TaskScheduler将任务分发到Executor执行

其中TaskScheduler:将每个Stage中对应的任务进行提交和调度

TaskSetManager:通过Stage回溯到最源头缺失的Stage提交到调度池pool中(根据JobID排序)

//

序列化是将对象转换为字节流

//

压缩:1.Snappy:更高的压缩速度,2.LZF:更高的压缩比

在spark中使用压缩:1.在spark-env.sh文件中配置,2.在应用程序中···conf.set(----)

//

主、从节点通信:

从-->主:BlockManagerMasterActor(传递信息和状态)

主-->从:BlockManagerSlaveActor

BlockManagerMaster:对Actor通信进行管理

数据读写:DiskStore、memoryStore、ConnectionManager、BlockManagerWorker

//

通信框架AKKA:

1.AKKA采用异步通信和分布式架构,2.可靠性:有监控和恢复机制,3.高性能,4.去中心,5.可扩展性

client(提交作业)--->Master--->Worker, client<---Master<---Worker

(1)client to Master:

RegisterApplication:注册应用

(2)Master to client:

RegisteredApplication:注册后回复给client

ExecutorAdded:

ExecutorUpdated:

(3)Master to Worker:

LaunchExecutor:启动Executor

RegisteredWorker:worker注册的回复

RegisterWorkerFailed:注册worker失效的回复

killExecutor:停止Executor进程

(4)Worker to Master:

RegisterWorker:注册Worker

Heartbeat:

ExecuterStateChangel:

//

容错机制:

1.数据检查点,2.记录数据更新

Lineage(血统)类似重做日志(Redolog)

Checkpoint机制

下面的情况需要使用数据检查点:1.DAG的lineage过长,如果重算,开销太大

2.在shuffle Dependency上做Checkpoint收益比较大

//

shuffle机制:

洗牌(混洗),即把一组有一定规则的数据打散重新组合转换成一组无规则随机数据分区

shuffle将数据进行收集分配到指定的Reduce分区,Reduce阶段根据函数对相应的分区做Reduce所需的函数处理

shuffle writer:通过shuffleMapTask中的runTask方法进入

抽象的特征:Trait

shuffleBlockManager

最终在HashShuffleworker,将内存的Bucket写到磁盘,存储为文件,并将shuffle的各个Bucket及映射信息返回给主节点

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

******补充:

spark两个抽象:1.RDD,2.共享变量

1.RDD:(弹性分布式数据集)可并行数据容器,可以存储任意类型数据,如有丢失,可根据粗粒度的日志数据更新记录的信息(Lineage)重构

RDD在创建时可变指定切片个数,

RDD在转换时,有个惰性计算(lazy evaluation)过程,期间会不断的记录到元数据(DAG),但并没有发生真正计算

容错:当Lineage很长时,可主动用Checkpoint动作把数据写入存储系统

2.共享变量:各个节点都可以共享的变量(并行化的时候,函数的所有变量在每个节点都做了一个拷贝)

spark提供两种共享变量:1.广播变量,2.累加器

spark工作原理:

(1)。客户端启动,进入初始化过程,通过与Mesos等资源管理系统交互,运行环境

(粗粒度:一次性配置好所申请的所有资源,后面不在申请。细粒度:就是凑够一个任务能够执行的资源,就开始执行该任务)

(2)。转换过程:增量的方式构建DAG图(DAG:并行化执行,及故障恢复),执行时,spark利用贪心算法将程序分成几个Stage,每个Stage都有一定数量的任务做并行的处理(分宽依赖和窄依赖)

spark通过patitionBy操作划分,划分宽依赖和窄依赖的好处:1.通过DAG,遇到窄依赖,将对应操作划分到同一个Stage;遇到宽依赖,新建一个Stage、并把回溯到的操作改进新的Stage,实现流水线优化。2.窄依赖利用Lineage

(3)。执行过程:DAG调度器按依赖关系调度执行DAG图,先执行不依赖任何阶段的Stage,每个Stage会配备一定数量的Task并行的执行

(4)。释放过程:释放资源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: