参考 http://www.cnblogs.com/tsxylhs/p/7427874.html
https://www.cnblogs.com/qingyunzong/p/8886338.html
基本术语
- master
资源管理器的主节点 - cluster Manager
在集群上获取资源的外部服务 - workerNode
资源管理器的从节点或者说管理本机资源的进程 - Application
基于spark的用户程序,包含driver程序和运行在集群上的executorc程序 - Driver Program
运行Application 的main()函数并且创建sparkcontext
用来连接worker的程序 - Executor
是在一个worker进程管理节点上为某application 启动的一个进程,该进程负责运行任务,并负责将数据存在内存或磁盘上,每个应用拥有各自独立的executors - job
用户提交任务spark程序到driver端,程序根据spark的算子操作,将代码分为多个job,job串行执行 - stage
一个job,提交至DAGScheduler,回执DAG图,根据RDD的依赖关系。可以分为宽依赖和窄依赖,根据宽依赖将DAG图分为多个stage。一般宽依赖涉及shuffle操作,所有可以认为shuffle是stage的一个分割依据。 - task
被送到executor上的工作单元
stage 根据数据集的分区可以分为多个task,task可以并行执行,所以stage 又称为task set - 宽依赖
一个父RDD会对应多个RDD
特点
- Spark 特点
高效性
运行速度提高100倍。
Apache Spark使用最先进的DAG调度程序,查询优化程序和物理执行引擎,实现批量和流式数据的高性能。
易用性
Spark支持Java、Python和Scala的API,还支持超过80种高级算法,使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的shell,可以非常方便地在这些shell中使用Spark集群来验证解决问题的方法。
通用性
Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。Spark统一的解决方案非常具有吸引力,毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本
兼容性
Spark可以非常方便地与其他的开源产品进行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,器,并且可以处理所有Hadoop支持的数据,包括HDFS、HBase和Cassandra等。这对于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。Spark也可以不依赖于第三方的资源管理和调度器,它实现了Standalone作为其内置的资源管理和调度框架,这样进一步降低了Spark的使用门槛,使得所有人都可以非常容易地部署和使用Spark。此外,Spark还提供了在EC2上部署Standalone的Spark集群的工具 - 架构
Spark的体系结构不同于Hadoop的mapreduce 和HDFS ,Spark主要包括spark core和在spark core的基础上建立的应用框架sparkSql spark Streaming MLlib GraphX; Core库主要包括上下文(spark Context)抽象的数据集(RDD),调度器(Scheduler),洗牌(shuffle) 和序列化器(Seralizer)等。Spark系统中的计算,IO,调度和shuffle等系统的基本功能都在其中在Core库之上就根据业务需求分为用于交互式查询的SQL、实时流处理Streaming、机器学习Mllib和图计算GraphX四大框架hdfs迄今是不可替代的
- spark组成
Spark组成(BDAS):全称伯克利数据分析栈,通过大规模集成算法、机器、人之间展现大数据应用的一个平台。也是处理大数据、云计算、通信的技术解决方案。
它的主要组件有:
SparkCore:将分布式数据抽象为弹性分布式数据集(RDD),实现了应用任务调度、RPC、序列化和压缩,并为运行在其上的上层组件提供API。
SparkSQL:Spark Sql 是Spark来操作结构化数据的程序包,可以让我使用SQL语句的方式来查询数据,Spark支持 多种数据源,包含Hive表,parquest以及JSON等内容。
SparkStreaming: 是Spark提供的实时数据进行流式计算的组件。
MLlib:提供常用机器学习算法的实现库。
GraphX:提供一个分布式图计算框架,能高效进行图计算。
BlinkDB:用于在海量数据上进行交互式SQL的近似查询引擎。
Tachyon:以内存为中心高容错的的分布式文件系统。
- client、Master、和worker之间的通信
在standal模式下,存在三个角色
client提交作业
master 负责接收作业并启动driver管理worker和executor
worker周期性的通过beat heart向master发送状态信息。当master向他传来启动executor命令的时候,他就启动executor命令
Spark运行原理
1、通过ActorSystem创建MasterActor,启动定时器,定时检查与接收Worker节点的发送消息
2、Worker节点主动向Master发送注册消息
3、Master接收Worker的注册请求,然后将注册信息保存起来,并向Worker返回一个注册成功的消息
4、Worker接收到Master注册成功的消息后,启用定时器,定时向master发送心跳报活,Master接收到Worker发送来的心跳消息后,更新Worker上一次的心跳时间
5、DAGScheduler根据FinalRDD递归向上解析Lineager的依赖关系,并以宽依赖为切分一个新stage的依据,并将多个task任务封装到TaskSet,其中Task的数量由其父RDD的切片数量决定,最后使用递归优先提交父Stage(TaskSet)
6、先创建TaskScheduler即TaskSchedulerImpl接着又创建SparkDeploySchedulerBackend对资源参数创建AppClient与Master注册Application,并替每个TaskSet创建TaskManager负责监控此TaskSet中任务的执行情况
7、Master接收到ClientActor的任务描述之后,将任务描述信息保存起来,然后ClientActor返回消息,告知ClientActor任务注册成功,接下来Master(打散|负载均衡|尽量集中)进行资源调度
8、Master跟Worker通信,然后让Worker启动Executor
9、Executor向Driver发送注册消息,Driver接收到Executor注册消息后,响应注册成功的消息
10、Executor接收到Driver注册成功的消息后,本进程中创建Executor的引用对象
11、Driver中TaskSchedulerImp向Executor发送LaunchTask消息,Executor将创建一个线程池作为所提交的Task任务的容器
12、Task接收到launchTask消息后,准备运行文件初始化与反序列化,就绪后,调用Task的run方法,其中每个Task所执行的函数是应用在RDD中的一个独立分区上
13、Task运行完成,向TaskManager汇报情况,并且释放线程资源
14、所有Task运行结束之后,Executor向Worker注销自身,释放资源。
RDD特点
- 是在集群节点上的不可变,已分区的集合对象
- 通过并行转换的方式来创建(map filter join)
- 失败自动创建
- 可以控制存储级别进行重yong
- 必须是可序列化的
- 静态类型
Spark支持的3🀄️集群管理器
- standalone 模式:资源管理器是master节点,调度策略相对单一,只支持先进先出模式
- Yarn:资源管理器是yarn集群,主要用来管理资源。YARN支持动态资源的管理,还可以调度其他实现了yarn调度接口的集群计算,非常适用于多个集群同时部署的情况,是目前最流行的一种资源管理系统。
- Mesos:MEsos是专门用于分布式资管管理的开源系统用C++开发,对集群中的资源做弹性管理
为什么用yarn来部署spark
yarn支持动态分配资源。stanalone 模式只支持简单的固定资源匹配策略,每个任务固定数量的core,各job按顺序依此分配资源。资源不够的时候就排队。这种模式比较适合单用户情况,多用户情况可能得不到资源。
检查点的意义
将某个时机的中间数据写到存储中。
容错机制
- 数据检查点
- 记录更新
persist和cache 的异同
参考spark persist cache()以及StorageLevel
Spark提供的两种共享变量
1.广播变量,只一个只读对象,在所以节点上都有一份缓存,创建方法是SParkcontext.broadcast()
2. 计数器,只能增加。
transformation 和action 是什么?区别
RDD支持两种操作。
- 转换 transformation 即从现有的数据集创建一个新的数据集
- 动作 action 在数据集上进行计算后,返回一个值给driver 程序
RDD的转换操作会返回一个新的rdd 比如map 和filter 而action则是向驱动器程序返回结果或把结果写入外部系统的操作,会触发实际的计算,比如count 和first。
Transformation 是惰性的,也就是说不会直接计算结果。相反得分他们只是记住啦这些应用基础数据集上的转换动作。只有当发生一个要求返回结果给driver的action时 这些transformation才真正运行。
spark 端口
- 8088 yarn的web UI的端口号
- 8080 master UI的端口号
- 4040 application 的web UI 的端口号
- 18080 historyServer的web UI 的端口号
- 9092 Kafka broker的端口
- 60010 Hbase 的 web UI的端口
- 7007 spark基于standalone 的提交任务的端口
- 6379 red is 的端口号
spark调度模式 FIFO FAIR
- FIFO(默认),谁先提交谁先执行,后面的任务需要等待前面的任务
- FAIR(公平调度)支持在调度池中为任务进行分组,不同的调度池权重不同,任务可以按照权重来决定执行顺序