###概述
Spark是一个基于内存的用于处理、分析大数据的集群计算框架。
###Spark组件
以上为Spark软件栈图
Spark项目包括多个紧密集成的组件,紧密集成的优点则体现在:
- 如果Spark底层优化了,基于Spark底层的组件也将得到相应优化
- 节省了各个组件组合使用时的部署、测试等时间
- 向Spark增加新组件时,其它组件都可立刻享用
Spark Core:
是Spark生态系统的基础,为其它的高级组件提供底层服务。
实现了任务调度、内存管理、容错机制等Spark项目中的基本功能,提供了创建和操作RDD的多个API
Saprk SQL:
是Spark处理结构化数据的库,就像Hive SQL,Mysql一样
应用场景:企业中用来做报表统计
Spark Streaming:
是实时数据流处理组件,类似Storm,Spark Streaming提供了API来操作实时流数据
应用场景:企业中用来从Kafka(或其他的消息队列中)接收数据做实时统计
MLlib:
一个包含通用机器学习功能的包,Machine learning lib包含分类,聚类,回归等,还包括模型评估,和数据导入
MLlib提供上面的这些方法,都支持集群上的横向扩展(在机器学习领域,较于Python的单机和处理数据量的有限性,MLlib能够集群处理 )
应用场景:机器学习
Graphx:
是处理图的库(例如,社交网络图),并进行图的并行计算
像Spark Streaming,Spark SQL一样,它也继承了RDD API
它提供了各种图的操作,和常用的图算法,例如PangeRank算法
应用场景:图计算
Cluster Managers:
就是集群管理,Spark自带一个集群管理是单独调度器
常见集群管理包括Hadoop YARN,Apache Mesos
###主要特点(与Hadoop比较)
- 使用方便
Spark提供了比MapReduce更简单的编程模型
Hadoop MapReduce只有两个操作符,map和reduce。要求任何问题都必须能够分解为一系列的map作业和reduce作业,但并有些算法难以只用这两个操作符来描述
Spark则提供了丰富的API,有80多个用于处理数据的操作符,处理复杂数据则更简单 - 快速
Spark比Hadoop处理数据更快速的原因主要在两方面:
1、Spark允许应用程序利用内存缓存数据,因此使用Spark实现的同样的应用程序只需要从硬盘读取一次数据即可;而Hadoop需要反复从硬盘读取、写入数据,当数据量巨大时,这样带来的I/O延迟是十分之大的
2、拥有更先进的作业执行引擎。例如Spark花在磁盘I/O和数据shuffle操作的时间更少(数据的shuffle操作通常会涉及网络间的数据传输,会增加应用程序的执行时间) - 通用
为各种类型的数据处理作业提供一个统一的集成平台。因此可以使用单一的Spark框架,创建一个包含多个不同类型任务的数据处理流水线,而不用学习不同的框架或者部署单独的集群。Spark自带了一系列的库,用于批处理、交互分析、流处理、机器学习、图计算等。越来越多流行的应用和库开始集成到Spark中或添加了对Spark的支持,这说明Spark在未来将更加强大。 - 可扩展
Spark集群的数据处理能力可以通过增加更多集群节点的方式得以提升,并且这个特性对于应用程序来说是透明的,往Spark集群扩展节点时,无须改动任何代码。 - 容错
Spark能自动处理集群中的节点故障,这样应用程序开发者无须在开发过程中处理这些异常。
###Spark总体架构
-
工作节点-worker:是一个进程,为Spark应用提供CPU、内存和存储资源,把Spark应用当成分布式进程在集群节点上执行
1.利用自身的内存资源对RDD的某个或某些partition进行存储; 2. 对RDD分配来的partition进行处理和计算 -
集群管理员-cluster manager(Master):是一个进程,控制整个集群,管理集群中worker节点的计算资源分配、调度,监控,不参与计算!
-
驱动程序-Driver Program:提交spark程序的机器
提供数据处理的代码,Spark将在worker节点上执行这些代码。包含程序的main()方法,RDD的定义和操作,管理Executor -
执行者-Executor:Spark应用程序运行在worker节点上的一个进程,可以利用多线程的放并发执行应用代码,并且负责将数据存到内存或磁盘上
-
任务-task:Excutor中的线程,是运行Spark应用程序的基本单位,Spark为每一个数据分区创建一个任务,一个执行者可以并发执行一个或多个任务。任务数量由分区数量决定。对函数进行各种具体的函数操作
执行的顺序:
- Driver进程启动后,做一些初始化操作发送请求给Master进行spark应用程序的注册(让Master知道有个新的spark程序要运行)
- Master接收到了spark应用程序的注册申请后,向work请求资源调度和分配(资源的分配就是Excutor的分配,因为master根据。。。)
###术语
-
shuffle操作
在集群节点上对数据进行重新分配,此分配并不是随机的,而是按照某些标准将数据分成不同的集合,每个集合就是一个新的分区。也就是把一组无规则的数据尽量转换成一组具有一定规则的数据(洗牌的逆操作)
举例:map与reduce操作之间的数据转移过程(key值相同的数据转移到同一个节点上,为reduce操作做准备) -
作业-Job
是一系列计算的集合,本质上就是在Spark集群上运行数据处理算法。一个应用程序可以发起多个Job -
阶段-Stage
每个Job会被拆分成多组Task, 一组Task称为一个Stage。Stage的边界就是发生shuffle的地方,将task规整到不同的阶段。
我们可以描述一个Spark应用在集群节点上并行处理数据的过程。当一个Spark应用开始运行的时候,Spark会连接Cluster Manager,获取在worker Node上的Executor资源。Spark把一个数据处理算法当成一个Job提交,然后把这个Job分解成由若干Stage构成的DAG。并在Executor上调度运行这些Stage,调度操作由Cluster Manager提供的底层调度器实现。Executor即可并行地运行Spark提交的任务
###数据源
Spark作为一个计算框架,并没有存储系统,但是它可以搭配外部存储系统使用,一般会选择搭配能够存储大量数据的分布式存储系统使用。任何Hadoop支持的数据源都可以被Spark Core使用,例如HDFS、HBase、Cassandra等。Spark应用程序也可以读写本地文件系统上的数据并在单机上处理,这个特性对于Spark的学习有着重大意义。
以上,为Mohammed Guller的《Big Data Analytics with Saprk》一书的学习笔记