Spark简介
spark特点
Spark具有如下几个主要特点:
• 运行速度快:Spark使用先进的DAG(Directed Acyclic Graph,有向无环图)执行引擎,以支持循环数据流与内存计算,基于内存的执行速度可比Hadoop MapReduce快上百倍,基于磁盘的执行速度也能快十倍;
• 易于使用:支持使用Scala、Java、python和R语言进行编程,也可以通过spark shell进行交互式编程
• 通用性:Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件,这些组件可以无缝整合在同一个应用中,足以应对复杂的计算;
• 运行模式多样:Spark可运行于独立的集群模式中,或者运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源。
Spark与hadoop
spark的优势
-
spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操作类型,编程模型比MapReduce更灵活;
-
数据格式与内存布局:
-
spark提供内存计算,中间结果直接放到内存,提高迭代运算的效率,减少IO开销。
spark与hadoop的区别与联系
- 解决问题的方式不同:hadoop 是分布式数据设施,由普通计算机组成,能完成大规模数据的存储和计算;Spark则是专门的工具,不会进行分布式数据的存储
- 两者可分可合:hadoop可以用自身的MapReduce取代spark;spark也可以依赖其他基于云的数据系统平台
Spark生态与框架
Spark生态
Spark的生态系统主要包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX 等组件
-
Spark Core:Spark Core包含Spark的基本功能,如内存计算、任务调度、部署模式、故障恢复、存储管理等。
-
Spark SQL:结构化的数据处理模块
可以直接处理RDD和使用外部数据源,处理复杂的数据分析;
支持开发者将SQL语句融入到Spark应用程序开发中
提供DataFrame的编程抽象
-
Spark Streaming:Spark Streaming支持高吞吐量、可容错处理的实时流数据处理,其核心思路是将流式计算分解成一系列短小的批处理作业
-
MLlib(机器学习):MLlib提供了常用机器学习算法的实现
-
GraphX(图计算):GraphX是Spark中用于图计算的API,可认为是Pregel在Spark上的重写及优化
Spark运行架构
基本概念
-
RDD:弹性分布式数据集
-
DAG:Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依赖关系;
-
DAGScheduler:根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler
-
Application:用户编写的Spark应用程序;
-
Spark Context:Spark应用程序的入口,负责调度运算资源,协调各个work node上的executor
-
Driver Program:执行Application中的main()函数,并创建SparkContext
-
Executor:是运行在工作节点(Worker Node)上的一个进程,负责运行任务,并为应用程序存储数据;
-
Task任务:运行在Executor上的工作单元;
-
Job作业:一个作业包含多个RDD及作用于相应RDD上的各种操作;
-
Stage阶段:是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为“阶段”,或者也被称为“任务集”。
架构设计
如图,Spark运行架构包括
-
集群资源管理器(Cluster Manager):可以说spark自带的资源管理器,也可以是yarn或者mesos等资源管理框架
-
运行作业任务的工作节点(Worker Node)
-
每个应用的任务控制节点(Driver)
-
每个工作节点上负责具体任务的执行进程(Executor):
利用短线承来执行具体的任务,减少任务启动开销;有一个BlockManager存储模块,会讲内存和磁盘共同作为存储设备,迭代计算时,中间结果存储到这个模块,减少IO开销
总体而言,在Spark中,一个Application 由一个任务控制节点Driver 和若干个作业Job 构成,一个作业由多个阶段(Stage) 构成,一个阶段由多个任务(Task) 组成。当执行一个应用时,任务控制节点会向集群管理器(Cluster Manager) 申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行任务,运行结束后,执行结果会返回给任务控制节点,或者写到HDFS或者其他数据库中。
Spark运行基本流程:
-
当一个spark应用被提交时,先为这个application构建运行环境:由任务控制节点(Driver)创建一个SparkContext,由SparkContext负责和资源管理器(Cluster Manager)的通信以及进行资源的申请、任务的分配和监控等。SparkContext会向资源管理器注册并申请运行Executor的资源;
-
资源管理器为Executor分配资源,并启动Executor进程,Executor运行情况将随着“心跳”发送到资源管理器上;
-
SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG调度器(DAGScheduler)进行解析,将DAG图分解成多个“阶段”(每个阶段都是一个任务集),并且计算出各个阶段之间的依赖关系,然后把一个个“任务集”提交给底层的任务调度器(TaskScheduler)进行处理;Executor向SparkContext申请任务,任务调度器将任务分发给Executor运行,同时,SparkContext将应用程序代码发放给Executor;
-
任务在Executor上运行,把执行结果反馈给任务调度器,然后反馈给DAG调度器,运行完毕后写入数据并释放所有资源。
作业运行流程: