大纲

  • 基本知识
  • 架构
  • RDD

基本知识

什么是spark

UC Berkeley AMP Lab开发的一种计算框架,分布式资源工作交由集群管理软件(Mesos,YARN)(Mesos 类似于yarn的一个资源调度框架)

特点

先进架构

  1. spark采用scala语言编写,底层采用了actor model的akka作为通讯框架(spark2之后使用netty改写)
  2. 基于DAG图(有向无环图)的执行引擎,减少多次计算之间中间结果写到HDFS的开销
  3. 建立在统一抽象的RDD(分布式内存抽象)之上,使得它可以以基本一致的方式应对不同的大数据处理场景

高效

  1. 提供cache机制来支持需要反复迭代的计算或者多次数据共享,减少数据读取的IO开销
  2. 与Hadoop的mapreduce相比,spark基于内存的计算比MR快100倍

易用

  1. spark提供的广泛数据集操作类型(20+种),不像Hadoop只支持map和reduce两种操作
  2. spark支持Java,python和scala API,支持交互性的python和Scala的shell

提供整体解决方案

  1. 以其RDD模型的强大表现能力。逐渐形成了一套自己的生态圈,提供了full-stack的解决方案
  2. 主要包括spark内存中的批处理,spark sql交互式查询,spark streaming流式计算,Graphx和MLlib提供的常用图计算和机器学习算法

与Hadoop无缝连接

  1. spark可以使用YARN作为他的集群管理器
  2. 读取HDFS,Hbase等一切Hadoop的数据

架构

img

1.spark提供了多种高级工具:spark sql即席查询(Ad-hoc query用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表),spark streaming应用于流式计算,MLlib机器学习,GraphX图形处理

2.spark基于自带的standlone集群管理器单独运行,也可以部署在Mesos和YARN等集群管理器上进行

3.spark可以访问存储在HDFS,Hbase,Cassandra,Amazon S3,本地文件系统等等上的数据,spark支持文本文件,序列文件,以及任何Hadoop的InputFormat

spark核心概念

spark提供多层分解的概念,spark组件将用户的应用程序分解为内部执行任务并提供执行容器,资源管理器为spark组件提供资源管理和调度

spark的核心组件包括RDD,Scheduler,Storage,shuffle四部分

1.RDD是spark中最精髓的部分,spark将所有数据抽象成PDD

2.Scheduler是spark的调度机制,分为DAGScheduler和TaskScheduler

3.storage模块主要管理缓存后的RDD,shuffle中间结果数据和broadcast数据

4.shuffle分为Hash和sort两种方式,两种方式的shuffle中间数据都写本磁盘

RDD

Spark的核心是RDD,那么RDD是什么

Resilent Distributed Datasets弹性分布式数据集,是spark底层的分布式存储的数据结构,可以说是spark的核心,spark API的所有操作都是基于RDD的,数据不只存储在一台机器上,而是分布在多台机器上,实现数据计算的并行化,弹性辨明数据丢失时,可以进行重建。在spark1.5版本之后新增了数据结构Spark-DataFrame,仿造的R和python的类SQL结构-DataFrame,底层为RDD,能够让数据从业人员更好的操作RDD

在Spark的设计思想中,为了减少网络磁盘及磁盘I/O开销,需要设计出一种新的容错方式,于是才诞生了新的数据结构RDD。RDD是一种只读的数据块,可以从外部数据转换而来,你可以对RDD进行函数操作包括 Transformation 和 Action

img

RDD的特点

  1. 它是集群节点上不可变的,已分区的集合对象
  2. 通过并行转换的方式来创建
  3. 失败自动创建
  4. 可以控制存储级别(内存,磁盘)来进行重用
  5. 必须是可序列化的
  6. 是静态类型的(只读)

RDD的创建方式主要有两种

  1. 并行化一个已经存在驱动程序中的集合如set,list
  2. 读取外部存储系统上的一个数据集,比如HDFS,Hive,Hbase或者提供了HadoopInputFormat的数据源,也可以从本地读取txt,scv等数据集

img

Transformation 操作不是马上提交 Spark 集群执行的,Spark 在遇到 Transformation 操作时只会记录需要这样的操作,并不会去执行,需要等到有 Action 操作的时候才会真正启动计算过程进行计算.针对每个 Action,Spark 会生成一个 Job, 从数据的创建开始,经过 Transformation, 结尾是 Action 操作.这些操作对应形成一个有向无环图(DAG),形成 DAG 的先决条件是最后的函数操作是一个Action

窄依赖跟宽依赖的区别是是否发生 shuffle(洗牌) 操作