内部运行机制
任务分配、IO模块、通信控制模块、容错模块、Shuffle模块。采用的算法:FIFO、FIAR算法,通信采用AKKA框架
1、spark执行机制:
spark应用提交后经历了一系列转换最后成为Task在每个节点上执行。
大体的执行流程:RDD的Actions操作除非Job的提交,提交到spark中的job生成RDD DAG,由DAG Scheduler转换为stage中的task集合,再由TaskScheduler将任务分发到Executor执行,会在Executor中创建线程池,并发执行。
1)spark Application
Application应用程序是用户提交的应用程序,spark的应用程序运行方式可分为cluster模式和client模式。Application包含的组件有:
Application:用户自定义的应用程序,执行后,spark为其分配资源,将程序转换并且执行。
Driver program:运行main()函数并创建SparkContext
RDD graph: 核心步骤。当碰到Action算子时,将前面所有的算子形成DAG图,转化为Job后提交到集群执行。
Job:RDD DAG触发的作业,一般由Action算子触发,通过runJob的方法向Spark提交job
Stage:每个Job根据Rdd的宽依赖关系被切分成多个Stage。每个Stage中包含一组相同的Task
Task:一个分区对应一个Task,Task执行RDD中对应stage中包含的算子。Task被封装好后放入Executor中的线程池中执行。
2)应用提交与执行方式
两种方式:1、Drive运行在客户端,管理监控应用的情况。2、主节点指定某个Worker节点启动Driver,负责整个应用的监控。
第一种方式:用户启动客户端后在客户端上运行程序,Driver进程启动,在Driver中启动或者实例化DAGScheduler,客户端的Driver向Master注册,Master命令Worker启动Executor。Executor通过创建线程启动相关的其他进程
第二种方式:需要通过org.apache.spark.deploy.Client类执行应用:流程:1用户启动客户端,客户端提交应用程序给Master。2Master调度应用,针对每个应用分发给指定的一个Worker启动Driver。3ExecutorBackend启动后,向Driver的SchedulerBackend注册,这样Driver获取了计算资源就可以调度和将任务分发到计算节点执行。
2、Spark调度与任务分配模块
调度级别:Application调度、Job的调度、Stage的调度、Task的调度
1)Spark应用程序调度:静态配置资源分配规则,配置每个应用可以使用的最大资源总量、优先级等。
根据不同的集群模式进行配置调度。
2)应用程序内Job的调度:用户通过不同线程提交的Job可以并行运行,spark的调度器是完全线程安全的,支持一个应用处理多请求的用例。默认情况下以FIFO方式调度Job的执行。
3)stage和TaskSetManager的调度
3、spark I/O机制
由传统IO演化而来
由来:spark数据分区都是分散在多个计算机系统中的,传统的数据是存在一个主机中。
spark数据量巨大,TB、PB级。不仅要考虑本地主机的IO开销,还要考虑数据在不同主机之间传输的IO开销,同时spark对数据的寻址方式也需要改变,以应对大数据挑战。
1)序列化,是将对象转换成字节流的操作。spark可以采用Java的序列化库,也可以采用Kyro序列化库。
2)压缩:当大片连续区域进行存储且存储区域中数据重复性高的状况下,数据适合进行压缩。序列化之后的数据可以进行压缩以减少空间开销。压缩采用两种方式Snappy和LZF.
在spark程序中使用压缩:两种方式配置压缩。spark-env.sh中配置压缩配置的参数;在应用程序sparkContext对象conf中配置参数。
3)spark块管理:
4、Spark通信模块
RPC
RMI
JMS
eJB
WebService
Spark中使用的通信框架是AKKA框架,基于scala开发,用于编写Actor应用。
5、容错机制
一般来说,分布式的容错性有两种方式:数据检查点和记录数据的更新。数据检查点操作成本很高,Spark采取记录数据更新的方式。
6、Shuffle机制
本质是洗牌、混洗,即把一组有一定规则的数据打散重新组合成一组无规则随机数据分区。