一 :大数据生态体系
首先我们从整个大数据生态的宏观层面概述一下数据的处理流程,主要涉及到七个层次,分别是数据源(产生数据的一方)、数据收集、数据存储、资源管理、计算框架、数据分析、可视化,如下图所示:
那么其实大数据技术的产生正是为了处理更好的处理上面每一个层面的问题。从而演化出对应的大数据技术框架如下:
通过上面的两张图,可以大概了解到大数据技术体系中有那些技术,比如我们常用的mapreduce/spark/storm 是处于计算框架这一层,也就是它们的产生就是为了更高效的进行数据分析计算,再比如常用的hdfs就是为了更好高效稳定的进行数据的存储,kafka、flume、sqoop就是为了数据的收集应运而生。
下面我们介绍一下Spark生态体系
关于spark的介绍前面篇章已经讲过,在这里就不在赘述,可以参考查阅之前的spark概述这一篇章
刚开始学习spark的同学,会搞不明白,spark和hadoop的关系是什么呢?
其实从上面的两张图我们也能看出来,Spark是属于计算框架这一层,Hadoop是一种大数据的解决方案,里面包括了存储,计算,资源调度等。而Spark仅仅是一种计算引擎。
Spark组件图:
关于Spark的产生背景和介绍请参阅Spark概述这一篇章。
二 :Spark核心概念
1 :RDD 介绍
- RDD 全称为Resilient Distributed Datasets ,是一个容错的、并行的数据结构
- RDD 提供了丰富的API来操作数据,比如:filter,map,reduceByKey,Count….
- RDD作为一种数据结构,其本质上是一个只读的分区记录集合,有多个Partition组成
- RDD具有很好的容错性 ,这也是它高效的一种原因
2 :RDD的组成
一个RDD可以分布在多个partition中,每个partition作为一个数据块分布式的存储在不同的节点中,并且每个partition既可以存储在磁盘介质中也可以存储在内存中,并且可以一部分存储在磁盘中一部分存储在磁盘中。
3 :RDD容错
在分布式系统中常用的容错机制有两种 : 数据检查点(checkpoint)和记录数据的更新,而Spark的容错机制主要采用的是记录数据更新 , 也有个别的情况下会使用checkpoint
RDD实现了基于Lineage(血缘关系)的容错机制
RDD的转换关系,构成了计算链(compute chain),可以把这个compute chain认为是RDD之间演化的Lineage在部分计算结果丢失时,只需要根据这个Lineage重算即可
4 :RDD容错 - 依赖关系
依赖分类:
宽依赖(Wide Dependencise)
宽依赖又叫做全依赖,子RDD的分区依赖于父RDD的多个分区或所有分区,即存在一个父RDD的一个分区对应一个子RDD的多个分区
窄依赖(Narrow Dependencies)
窄依赖又叫做部分依赖,父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区
根据父RDD分区是对应1个还是多个子RDD分区来区分窄依赖(父分区对应一个子分区)和宽依赖(父分区对应多个子分区)
如果对应多个,则当容错重算分区时,因为父分区数据只有一部分是需要重算子分区的,其余数据重算就造成了冗余计算。
对于宽依赖,Stage计算的输入和输出在不同的节点上 , 对于输入节点完好 , 而输出节点死机的情况 , 通过重新计算恢复数据这种情况下,
这种方法容错是有效的,否则无效,因为无法重试 , 需要向上追溯其祖先看是否可以重试(这就是lineage ,血统的意思)
窄依赖对于数据的重算开销要远小于宽依赖的数据重算开销。
“Stage”解释:能够产生中间结果的计算
5 :RDD基本操作
1 、 Transformation 一个RDD通过操作函数转换为另外一个RDD
比如: map,filter,groupBy…..
可以通过Scala集合或者Hadoop数据集构造一个新RDD
通过已有的RDD生成新的RDD
2 、 Action 执行计算的算子
通过RDD计算得到的一个或者一组值
比如: Count,saveAsTextFile…..
Transformation 与 Action 区分
- 接口定义不同
Transformation : RDD[X] -> RDD[Y]
Action : RDD[X] -> Z ( Z 不在是一个RDD,而是一个结果集 )
- 惰性执行
Transformation 只会记录RDD转化关系, 而不会执行
Action 是触发程序执行的算子
Spark算子是惰性执行的,在Scala语言中有一个lazy修饰符,lazy修饰的变量将不会立即执行,只有在调用它的时候,在会执行内部操作。同理,Spark中在进行transfermation算子操作时,其实并没有真正的执行计算操作,而是在内部构建DAG有项无环图,只有在进行action算子时,才会执行这张图进行计算。