大数据处理链路从数据采集、数据处理,再到数据应用
Spark 于 2009 年诞生于加州大学伯克利分校 AMPLab,2013 年被捐赠给 Apache 软件基金会,2014 年 2 月成为 Apache 的顶级项目。相对于 MapReduce 的批处理计算,Spark 可以带来上百倍的性能提升,因此它成为继 MapReduce 之后,最为广泛使用的分布式计算框架。
执行过程:
RDD(Resilient Distributed Datasets弹性分布式数据集),可以简单的把RDD理解成一个提供了许多操作接口的数据集合,和一般数据集不同的是,其实际数据分布存储于一批机器中(内存或磁盘中)
RDD最重要的特性就是,提供了容错性,可以自动从节点失败中恢复过来。即如果某个节点上的RDD partition,因为节点故障,导致数据丢了,那么RDD会自动通过自己的数据来源重新计算该partition。
RDD的数据默认情况下存放在内存中的,但是在内存资源不足时,Spark会自动将RDD数据写入磁盘。(弹性)
RDD依赖就是描述父子RDD之间的依赖关系(Lineage)
窄依赖:父RDD的每个partition至多对应一个子RDD分区。表现为一个父RDD的分区对应于一个子RDD的分区或者多个父RDD的分区对应于一个子RDD的分区。
宽依赖:父RDD的每个partition都可能对应多个子RDD分区。表现为存在一个父RDD的一个分区对应一个子RDD的多个分区。
图中的每个小方格代表一个分区,而一个大方格(比如包含3个或2个小方格的大方格)代表一个RDD,竖线左边显示的是窄依赖,而右边是宽依赖。
区分宽窄依赖,要了解父RDD(Parent RDD)和子RDD(Child RDD)。在上图中,“map,filter”左上面的是父RDD,而右上面的是子RDD。“union”左上面的两个RDD都是其右上面的RDD的父RDD,所以它是有两个父RDD的。
Executor内存主要有两类: Storage、Execution。
UnifiedMemoryManager统一管理 Storage/Execution内存
Storage和Execution内存使用是动态调整,可以相互借用
UnifiedMemoryManager统一管理多 个并发Task的内存分配
每个Task获取的内存区间为1/(2*N) ~ 1/N,N为当前Executor中正在并发运行的task数量
Shuffle,翻译成中文就是洗牌。之所以需要Shuffle,还是因为具有某种共同特征的一类数据需要最终汇聚(aggregate)到一个计算节点上进行计算。这些数据分布在各个存储节点上并且由不同节点的计算单元处理。
Shuffle Write,即数据是如何持久化到文件中,以使得下游的Task可以获取到其需要处理的数据的(即Shuffle Read)。
每个MapTask生成一个Shuffle数据文件和一 个index文件
shuffle write 的文件被 NodeManage r中的 Shuffle Service托管,供后续 Reduce Task 进行 shuffle fetch , 如果Executor空闲, DRA可以进行回收
SparkSQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。
SELECT col FROM sales
,关于字段col
的类型,或者该字段是否是一个有效的字段,只有等到查看该sales
表时才会清楚。当不能确定一个属性字段的类型或者没能够与输入表进行匹配时,称之为未处理的
。Spark SQL使用Catalyst的规则以及Catalog对象(能够访问数据源的表信息)来处理这些属性。首先会构建一个Unresolved Logical Plan树,然后作用一系列的规则,最后生成Logical Plan。