Spark简介
简介
概览
- Apache Spark是一个用于大规模数据处理的快速通用计算引擎
- 特点:
- 快速:基于内存的MapReduce计算比Hadoop快100倍
- 易用:支持Scala、Java、Python和R语言开发
- 功能强:SparkSQL、SparkStreaming、SparkGraphX、SparkMLlib
- 通用:适用于多种不同的集群管理框架(Hadoop YARN、EC2);适用于多种不同的数据存储方式(HDFS、Hbase、MongoDB、Cassendra)
功能
- Spark SQL:专门用于处理结构化数据
- Spark Streaming:实时对大量数据进行快速处理,处理周期短
- Spark GraphX:以图为基础数据结构的算法实现和相关应用
- Spark MLlib:为解决机器学习开发的库,包括分类、回归、聚类和协同过滤等
集群管理框架
- Standalone mode:原生集群管理功能,有任务调度、资源分配等
- Hadoop Yarn:Hadoop MapReduce的第二个版本架构,把资源管理和任务管理剥离开;实现了静态资源分配和动态资源分配功能
- Apache Mesos:从分布式计算节点上抽象CPU,内存,硬盘和其他计算资源给其他框架使用,实现了静态资源分配功能
- EC2:Amazon EC2云平台,提供一个安装了Spark、Shark和HDFS的集群,可直接登录到集群,把它当作你实验室的集群使用
存储方式
- HDFS:Hadoop分布式文件系统
- Hbase:基于HDFS的非关系型数据库(NoSQL数据库)
- MongoDB:基于分布式存储的数据库,介于关系型和非关系型数据库之间;是NoSQL数据库中最像关系型数据库的一个;功能非常强大:支持多种开发语言、支持完全索引、支持查询等
- Cassendra:基于列的分布式数据库,易扩展、模式灵活、按照范围查询等
Spark生态系统
Spark原理
相关名词
- Driver程序:Spark应用的入口程序,在集群模式下用户开发的Spark程序称为Driver
- SparkContext对象
- 使得应用程序能够和集群进行沟通,实现CPU、内存等资源的分配
- 每个Driver程序都有一个SC对象,如果是交互式编程,则Spark Shell会自动创建一个SC对象
- 程序启动后,SC会告诉集群管理器在Worker Node上创建执行器,执行器是每一个Spark程序在计算节点上专属的进程
- 程序代码会发送到对应的Worker Node上
- SC分发任务(Task)到各个执行器
- Application:独立的Spark程序
- Master(Cluster Manager),Worker
- 执行器(Executor):Spark程序在对应计算节点上启动的专属线程,负责执行Task
- Job:一次RDD Action称为一个Job,是一个概念
- Stage:介于Job和Task之间,是一个Task集合
- Task:在执行器上执行的最小单元,例如在某个计算节点对一个RDD的分区进行的Transformation操作
具体执行过程
- 分为两部分:
- Driver程序,客户端模式下,Driver在本地,不会把Driver提交给Master,而直接提交任务;集群模式下,首先Driver被提交给Master,Master首先找一个Worker运行Driver
- 集群节点
RDD(Resilient Distributed Dataset 弹性分布式数据集)
- RDD是Spark的核心数据结构,RDD是一个数据集,就像Array、List和Set等一样的数据结构,内容是平铺的,可以顺序遍历,像Array和List一样
特征
- RDD是分布式存储的,支持并行计算
- RDD的分布是弹性的,某些操作使不同的数据块重新汇聚和分布
- RDD是只读的
- RDD可以缓存在内存中
- RDD可以通过重复计算获得(实现高可靠性)
属性
- 分区列表,依赖列表,计算函数compute
来源
- 从外部数据读入并初始化为RDD;可以从文件读入或从Hadoop读入
- 从Driver数据集生成RDD,利用SparkContext的parallelized函数
- 对RDD的一些操作后产生新的RDD
操作
- Transformation:接收一个RDD作为输入,返回一个新的RDD,但是并不会真实执行计算,只是定义生成的新RDD并且设置其与前一个RDD的依赖关系,RDD依赖关系可以分为窄依赖和宽依赖,前者只依赖前一个RDD的确定的几个分区,后者依赖前一个RDD的所有分区
- Action:输入还是RDD,但是输出就不是RDD了,调用了Action之后,整个从输入RDD到输出值的Transformation链条会被执行
DAG Schedule
- 把一个Spark Job转换成Stage的DAG
- 根据RDD和Stage之间的关系找出开销最小的调度方法,然后把Stage以TaskSet的形式提交给TaskScheduler
- 一次Action的所有工作就是一个Job,一个Stage包括一个或多个Transformation,一个Transformation在一个RDD分区上执行是一个Task
- 如何划分Stage?以宽依赖为分界,宽依赖之前的所有Transformation,为一个Stage,即根据数据是否需要重组划分
TaskScheduler
- DAG Scheduler最后一步:计算Task最佳执行位置;为每一个RDD分区创建Task;将一个Stage的Task封装成TaskSet交给TaskScheduler
- TaskScheduler为每个Stage的TaskSet创建一个TaskSetManager,负责跟踪task set中所有task,包括失败重启等
#期末复习/云计算