Spark
一、Spark概述
1、什么是Spark
Spark是一种快速、通用、可扩展的大数据分析引擎。它集批处理、实时流处理、交互式查询和图计算于一体,避免了多种运算场景下需要部署不同集群带来的资源浪费。
2、Spark的优点
速度。与hadoop的MR相比,Spark的运算要快100倍以上;而基于硬盘的计算也要快10倍以上。
易用。Spark支持java、python、scala的API,还支持超过80种高级算法,使用户可以快速构建不同的应用.而且Spark支持交互式的python和scala的shell。
通用性。Spark提供了统一的解决方案,可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(MLlib)和图计算(GraphX).作为统一的解决方案,Spark不仅没有牺牲性能作为代价,相反,在性能方面具有很大的优势。
可融合性。Spark可以非常方便的与其他开源产品进行融合,比如Hadoop的YARN和Apache Mesos,并且可以处理所有Hadoop支持的数据,包括HDFS、Hbase和Cassandra。
3、Spark的架构综述
(1)Spark的整体架构如下图所示。
其中,Driver是用户编写的数据处理逻辑,这个逻辑中包含用户创建的SparkContext。SparkContext是用户逻辑与Spark集群主要的交互接口,它会和ClusterManager交互,包括向它申请计算资源等。ClusterManager负责集群的资源管理和调度,现在支持Standalone、Apache Mesos和Hadoop的YARN。WorkerNode是集群中可以执行计算任务的节点。Executor是在一个WorkerNode上为某应用启动的一个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上。Task是被送到某个Executor上的计算单元。每个应用都有各自独立的Executor,计算最终在计算节点的Executor中执行。
(2)Spark运行流程图如下:
构建Spark Application的运行环境,启动SparkContext
SparkContext向资源管理器(可以是Standalone,Mesos,Yarn)申请运行Executor资源,并启动StandaloneExecutorbackend
Executor向SparkContext申请Task
SparkContext将应用程序分发给Executor
SparkContext构建成DAG图,将DAG图分解成Stage、将Taskset发送给Task Scheduler,最后由Task Scheduler将Task发送给Executor运行
Task在Executor上运行,运行完释放所有资源
(3)常见术语:
Application:Appliction都是指用户编写的Spark应用程序,包括一个Driver功能的代码和分布在集群中多个节点上运行的Executor代码
Application jar:一个包含用户 Spark 应用的 Jar。有时候用户会想要去创建一个包含他们应用以及它的依赖的 “uber jar”。用户的 Jar 应该没有包括 Hadoop 或者 Spark 库,然而,它们将会在运行时被添加。
Cluster manager:一个外部的用于获取集群上资源的服务。(例如,Standlone Manager,Mesos,YARN)
Deploy mode:根据 driver 程序运行的地方区别。在 “Cluster” 模式中,框架在群集内部启动 driver。在 “Client” 模式中,submitter(提交者)在 Custer 外部启动 driver。
Driver program:Spark中的Driver即运行上述Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭,通常用SparkContext代表Driver
Executor:某个Application运行在worker节点上的一个进程, 该进程负责运行某些Task, 并且负责将数据存到内存或磁盘上,每个Application都有各自独立的一批Executor, 在Spark on Yarn模式下,其进程名称为CoarseGrainedExecutor Backend。一个CoarseGrainedExecutor Backend有且仅有一个Executor对象, 负责将Task包装成taskRunner,并从线程池中抽取一个空闲线程运行Task, 这个每一个oarseGrainedExecutor Backend能并行运行Task的数量取决与分配给它的cpu个数
Job:包含多个Task组成的并行计算,往往由Spark Action触发生成, 一个Application中往往会产生多个Job
Stage:每个Job会被拆分成多组Task, 作为一个TaskSet, 其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage)两种,Stage的边界就是发生shuffle的地方
Task:被送到某个Executor上的工作单元,但hadoopMR中的MapTask和ReduceTask概念一样,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责
Worker node:集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slave文件配置的Worker节点,在Spark on Yarn模式下就是NoteManager节点
DAGScheduler:根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TASkScheduler。 其划分Stage的依据是RDD之间的依赖的关系找出开销最小的调度方法
TASKSedulter:将TaskSET提交给worker运行,每个Executor运行什么Task就是在此处分配的. TaskScheduler维护所有TaskSet,当Executor向Driver发生心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。另外TaskScheduler还维护着所有Task的运行标签,重试失败的Task。
将这些术语串起来的运行层次图如下:
以上内容均为作者个人笔记,如有错误欢迎指正...
关注CSDN博客 Zonzereal,更多大数据笔记等你...
领取专属 10元无门槛券
私享最新 技术干货