- Spark和Hadoop的比较
MapReduce | Spark |
数据存储结构:磁盘HDFS文件系统的split | 使用内存构建弹性分布式数据集RDD,对数据进行运算和cache |
编程范式:Map+Reduce | DAG:Transformation+Action |
计算中间结果写入磁盘,IO及序列化、反序列化代价大 | 计算中间结果在内存中维护,存取速度比磁盘高几个数量级 |
Task以进程方式维护 需要数秒时间才能够启动任务 | Task以线程方式 对于小数据集读取能够达到亚秒级的延迟 |
在实际应用中,大数据处理主要包括以下三个类型:
- 复杂的批量数据处理(通常时间跨度在数十分钟到数小时之间)[MapReduce]
- 基于历史数据的交互式查询(通常时间在数十秒到数分钟之间)[Cloudera Impala]
- 基于实时数据流的数据处理(通常时间在数百毫秒到数秒之间)[Storm]
Spark组件及其功能:
- Spark Core提供内存计算
- Spark SQL提供交互式查询分析
- Spark Streaming提供流计算功能
- Mllib提供机器学习算法库的组件
- GraphX提供图计算
- Spark运行基本流程
1. 为应用构建起基本的运行环境,即由Drive创建一个SparkContext进行资源的申请,任务的分配和监控。
2. 资源管理器为Executor分配资源,并启动Executor进程。
3. SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAGScheduler解析成Stage,然后把一个个TaskSet提交给底层调度器TaskScheduler处理;
Executor向SparkContext申请Task,TaskScheduler将Task发放给Executor运行并提供应用程序代码。
4. Task在Executor上运行把执行结果反馈给TaskScheduler,然后反馈给DAGScheduler,运行完毕后写入数据并释放所有资源。
- Spark运行架构特点
01 每个Application都有自己专属的Executor进程,并且该进程在Application运行期间一直驻留。Executor进程以多线程的方式运行Task
02 Spark运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可
03 Task采用了数据本地性和推测执行等优化机制
- RDD概念
一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算。
RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,不能直接修改,只能基于稳定的物理存储中的数据集创建RDD,或者通过在其他RDD上执行确定的转换操作(map、join和group by)而创建得到新的RDD。
- RDD的执行过程
具有“惰性求值”机制,根据代码的执行逻辑生成DAG(有向无环图),进行的一系列转换操作都不会产生实际的运算,等到最后的动作操作时,才会进行真正的计算。
优点:惰性调用、管道化、避免同步等待、不需要保存中间结果、每次操作变得简单。
- RDD特性
现有容错机制:数据复制或者记录日志
RDD:血缘关系、重新计算丢失分区、无需回滚系统、重算过程在不同节点之间并行、只记录粗粒度的操作。
01.高效的容错性。
02.中间结果持久化到内存中,数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销。
03.存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化。
- RDD依赖关系和运行过程
宽依赖:一个父分区对应多个子分区。
窄依赖:一个父分区对应一个子分区。
关于Stage的划分
具体划分方式:1.在DAG中进行反向解析,遇到宽依赖就断开;2.遇到窄依赖就把当前的RDD加入到Stage中;3.将窄依赖尽量划分在同一个Stage中,可以实现流水线计算。(Stage划分的方式就是从反向解析对应的DAG图,然后将窄依赖形成的关系作为一个Stage)
关于RDD运行过程
01.创建RDD对象
02.SparkContext负责计算RDD之间的依赖关系,构建DAG
03.DAGScheduler负责把DAG图分解成多个Stage每个Stage中包含了多个Task,每个Task会被TaskScheduler分发给多个WorkerNode上的Executor去执行。
需要进行说明的是:Spark Streaming无法实现毫秒级的流计算,因此,对于需要毫秒级实时响应的企业应用而言,仍然需要采用流计算框架(Storm)