《spark内核 架构设计与实现原理》 读书笔记1-----架构综述

1RDD:弹性数据集,如果把RDD对应到单机程序中的变量,类似于一个数组,他是相同类型变量的一个线性集合,但是RDD是分布在不同worker上的,一个sparkJob中的变量,除了RDD都是存储在本地也就是master机器driver进程的空间内存里的,而RDD是存在很多worker机器的executer进程的内存空间里的。本地变量可以通过parallize方法创建为RDD,RDD变量可以通过action collection方法收集回master,但是一般创建RDD都是从分布式的介质(Hbase 或者 hdfs)读取的,所以collection很容易引起OOM(out of memory) 。在spark2.0 引入了dataframe, dataframe有点类似于一个数据库中的table,也就是spark本身了解每个元素内部的结构,所以dataframe会快一点,但是dataframe的底层也是用RDD实现的。

2DAG:每一个spark job都会被解析成为一个DAG,为一个有向无环图,图中的每一个节点为一个rdd,每一条边为两个rdd之间的依赖关系,这个依赖关系是由 tranformation决定的,tranformation与action的概念比较简单就不再赘述了,rdd之间依赖关系的分为 宽依赖和窄依赖,后面笔记会仔细分析

3容错机制: lineage 也就是血统,直观这个词会让人想起回溯,后面仔细介绍这个原理

4优点: 1)内存计算快,这个快应该是相对概念,对于经常迭代的计算如kmeans pagerank, 用mapreduce计算每一轮都要写到hdfs然后在读取进来计算下一轮,这样IO开销严重, spark全都存在内存里,一次迭代后产生一个rdd,这样必然就快了。在这里我个人认为,如果是建立倒排索引这种计算,mapreduce不一定慢,理论上这种一次性的计算应该是等价的

            2) API 易用,mapreduce 编程一般就是写map reduce 最多再写一个combiner,有时写一下partioner用来优化shuffle(利用对数据的先验知识把数据分的更均衡),但是大部分的逻辑都要自己写然后套用这个框 架,而spark的api就丰富多了,而且主要使用函数式编程,把lambda填写到api里就可以了

            3)体系完整:spark 有4个主要的扩展支持,(1)sparkSQL支持处理结构化数据,(2)stream支持流式处理特别适合kafka那样的应用, (3)graphX支持图相关的计算 对于社交网络分析 反作弊都有很好的帮助,内部集成了triangleCount,pagerank,connectedComponent这些模块 (4)ML 不用多说了,各种分类聚类的算法都集成了,唯一的弱点是对深度学习的支持不是那么好,当然神经网络类的算法本身就很难并行化,其实是和TensorFlow形成了竞争关系

5内核重点:spark的外围模块如上所述,内核中的重要模块也有4个, 分别是:1)RDD 不用多说 2) executer 执行在计算节点的进程 3) Shuffle 性能的核心瓶颈 4)scheduler 调度整个job的处理模块

后续会对核心的4个模块进行分析,每节一个模块,纯当自己备忘

猜你喜欢

转载自www.cnblogs.com/jiasenhuo/p/9363869.html