1.Spark概述
Spark(基于内存的计算框架)(来自加州大学AMP实验室)
特性:
计算速度快:内存计算、DAG设计机制
容易使用:Java、R语言、Scala(基于Java)、Python、可通过Spark Shell进行交互式编程
通用性:完整的软件栈(SQL查询-SparkSQL、流计算-Spark Streaming、机器学习-Spark 、
MLlib、图计算-Spark的GraphX)
运行模式多样:支持独立的集群模式
Spark与Hadoop对比:
hadoop表达能力有限:复杂业务逻辑(Map、Reduce函数)
hadoop磁盘IO开销大:基于磁盘计算
hadoop延迟高(完成map之后才能进入ruduce阶段)
Spark继承mapreuce优点,补全了缺点:
Spark表达能力强:
Spark基于内存计算:不落磁盘尽量不落磁盘
Spark是DAG任务调度执行机制
执行流程对比:
2.Spark生态系统
以前执行多个任务使用多个框架:
批处理->hadoop(map reduce)、流处理->STORM、交互查询->Impala
它们之间需要进行数据格式转换、维护困难、资源利用不充分
Spark一个软件栈满足不同的应用场景需求(一站式大数据处理解决方案)
伯克利数据分析软件栈(BDAS)
提供了构建大数据处理框架
Spark最底层的组件为Spark Core
3.Spark运行架构
基本概念:
运行架构:
各概念之间的关系:
完整的执行流程:
执行应用时,主节点向资源管理器申请资源,启动Executor进程,并且向Executor发送应用的代码和文件,应用程序在Excutor进程上派发出线程去执行我们的任务,最后把执行结果返回给主节点提交给用户或者写入到HDFS或其他数据库。
Spark运行基本流程:
首先为应用构建基本的与性能环境,找到主节点,在主节点上生成指挥官(SparkContext),它负责整个任务的执行,恢复,结果汇总等,SparkContext申请资源进行任务的分派和监控,资源管理器分配好资源之后,WorkNode上的Executor进程启动,派生很多线程执行任务。
任务来源:SparkContext根据应用程序生成DAG图,然后调用DAGScheduler将DAG图分解成Stage,每个stage包含很多任务。将任务集合提交给Task Scheduler
Exceutor上的线程主动向Task Scheduler申请分配任务,Task Scheduler把生成的每个阶段的任务分发给不同的节点去处理。Task Scheduler根据计算向数据靠拢原则,将任务分发给对应数据存储的节点上。线程执行完之后将结果反馈给Task Scheduler,然后Task Scheduler将结果反馈给DAG Scheduler,运行结束后,写入数据,释放资源。
RDD运行原理
- RDD提供了抽象数据结构。RDD是一个分布式对象的集合,而且是一个只读的分区记录集合。RDD本身不能修改,只能在转换的过程中修改。
- 操作类型(粗粒度的修改,只能对RDD全集进行修改)
动作类型操作(Action)
转换类型操作(Transformation)只记录转换的轨迹,不会真的进行转换。直到遇到第一个动作类型的操作才从头到尾执行。
不支持细粒度修改---->Spark不适合网络爬虫
Spark提供了RDD的API,程序员可以通过调用API实现对RDD的各种操作。
RDD典型的执行过程:
高效的容错性
Spark具有天然的容错机制
Spark是基于内存的,避免了磁盘IO,同时也避免了数据的序列化和反序列化 - RDD之间的依赖关系
宽依赖:发生Shuffle操作(shuffle一定会写磁盘)。一个父RDD对多个儿子RDD
窄依赖:不发生Shuffle操作。多个或一个父RDD对一个儿子RDD - 划分阶段
宽依赖:划分多个阶段
窄依赖:不变(可优化)
窄依赖优化多个fork/join,可以进行流水线优化
宽依赖进行Shuffle操作一定会写磁盘,无法进行流水线优化
RDD整个执行过程:
4.Spark的部署方式
支持单机部署和集群部署
集群部署:
Standalone:使用Spark自带的资源管理器(效率不高)
YARN:使用最多的
Mesos:性能最高,性能匹配好