1.Spark概述
对Hadoop MapReduce的优点继承、缺点改进;基于内存的计算框架,大型,低延迟。
三大分布式计算系统开源项目:hadoop、spark、storm。
运行速度快:内存计算、循环数据流、有向无环图设计机制。对所有数据集构造DAG,执行引擎基于DAG拆分为不同阶段和任务,进行流水线优化。
容易使用:Scala★、Java、Python、R语言。
通用型:Spark SQL、Spark Streaming、Spark MLlib、Spark GraphX。
运行模式多样:独立的集群模式、可访问多种数据源
Spark解决计算问题+Hadoop HDFS、HBase解决存储问题。
Scala是一种多范式编程语言,支持函数式编程和面向对象编程。
特性:
- 强大的并发性——支持函数式编程、分布式系统
- 语法简洁——提供优雅的API
- 兼容Java运行速度快——与Hadoop生态圈能融合
Spark与Hadoop对比
- MapReduce表达能力有限
- 磁盘IO开销大
- 延迟高
- 衔接IO开销大
Spark的优点
- 除了map、reduce还提供filter、join、groupby
- 内存计算
- 迭代计算:DAG,MR:迭代时反复读写磁盘
- 流水线优化
2.Spark生态系统
应用类型 | 时间跨度 |
---|---|
复杂的批量数据处理 | 数十分钟到数小时 |
基于历史数据的交互式查询 | 数十秒到数分钟 |
基于实时数据流的数据处理 | 数百毫秒到数秒 |
Hadoop MapReduce、Storm等产品之间无法无缝共享,需要进行数据格式转换、资源利用不充分。
BDAS(Berkeley Data Analytics Stack)
流计算:Spark Streaming(RDD数据抽象)、Structured Streaming(DataFrame数据抽象)2.2以后正式版,2.3以后支持毫秒级实时流计算。
3. Spark运行架构
3.1基本概念
最核心的概念(数据抽象):RDD
RDD:Resillient Distributed Dataset简写,即弹性分布式数据集。
DAG:反映RDD之间的依赖关系。
Executor:工作节点上运行一个Executor进程,执行具体任务
应用:词频统计代码文件=Spark应用程序
任务:运行在Executor进程上的工作单元
作业(job):
阶段:作业的基本调度单位,每个阶段包含若干个任务。
3.2 架构设计
Driver——“指挥所”
Cluster Manager——集群资源管理器,包括CPU、内存、带宽,可以用自带、YARN或者Mesos。
Worker Node——Executor进程->线程->任务
作业->阶段->任务
3.3 Spark运行基本流程
pass,回头来填。
3.4 RDD的设计与运行原理
** 设计背景**
MapReduce:无法处理迭代场景。反复读写工作子集、磁盘IO开销
、序列化和反序列化。
RDD:提供了一种抽象的数据架构,避免数据落地。
RDD概念、操作和特性
RDD本质上是一个只读的分区记录集合。
RDD加载高度受限的共享内存模型。(不能修改)
RDD在转化过程可以修改。(通过生成新的RDD来完成一个数据修改的目的)
操作类型:动作类型操作、转换类型操作。
转换类型操作只记录转换轨迹,不会真正计算。如map、filter、groupBy、join。
粗粒度:一次只能针对RDD全集进行转换。
不支持细粒度修改、如网页爬虫。
惰性调用机制——转换只记录轨迹,执行动作才会触发计算。
流水线优化:
天然高效的容错性
避免不必要的磁盘读写开销
数据在内存的多个RDD之间进行传递的操作。RDD.cache()
避免了序列化和反序列化的开销
RDD之间的依赖关系
宽依赖(shuffle操作)
窄依赖(父子RDD一对一,多对一)
阶段的划分和RDD运行过程
一个作业(DAG图)划分为多个阶段,划分的依据就是宽依赖和窄依赖。窄依赖可以进行流水线优化;宽依赖不能进行流水线优化。
fork/join机制
只要发生Shuffle一定会写磁盘。
对DAG图反向解析
发现窄依赖,不断加入阶段;遇到宽依赖,生成不同阶段。
RDD运行过程
从RDD->执行任务
任务结果返回
4.Spark的部署和应用方式
单机和集群
集群调度方式:自带、YARN、Mesos。