参考链接:
- https://zhuanlan.zhihu.com/p/86059939
- https://www.cnblogs.com/starwater/p/6841807.html
引言
基本概念:
集中式计算:移动数据、统一计算
分布式计算:移动计算而不移动数据
一个简单例子:
从服务器的日志信息中统计访问量前10的IP与其对应的访问次数(PV)?
两个核心问题:
- 如何拆分计算逻辑?
如何将一个巨大的问题拆分成相对独立的子问题分发到各个机器上求解:
- 能够分发到各个节点上并行执行的
- 需要经过一定量的结果合并之后才能继续执行的
- 如何分发计算逻辑?
对于需要经过一定量的结果合并之后才能够继续执行的任务来说,有一系列问题需要解决:
- 聚合任务的个数和执行位置如何决定?
- 聚合结果中,各个节点的中间结果往哪存、怎么存?
- 聚合节点什么时间通过什么方式获取所需要的数据?
- 网络延迟、中断这种情况如何处理?
MapReduce
一个分布式任务定义为两种类型的Job组成:
1.Map Job对应的就是可以在各个节点上一起执行互不影响的逻辑,即能够分发到各个节点上并行执行的 的任务
2.Reduce Job处理的则是Map产生的中间结果(如果有),即需要经过一定量的结果合并之后才能够继续执行 的任务
Map和Reduce之间通过一个Shuffle过程来链接。 组成一个完整的分布式计算流程所有的细节问题都将在这个过程中得到有效的处理。
在先前的例子中,从日志中解析出IP 为Map Job,根据IP进行分组统计 为Reduce Job。
一个MapReduce任务会经理以下阶段:
- 将Map任务分发到数据块所在的各个节点上执行
- Map任务读取数据块,并执行相关的计算逻辑
- 对于Map类型任务的分发其实可以归为分布式存储系统的问题
- 基本上所有分布式计算框架都是基于优先数据本地化进行的
- 也就是说数据存在哪,计算就分发到哪
- Map任务的结果将会写入内存的环形缓冲区中
- 根据key和对应的partition算法对数据进行分区,相同key的数据位于同一个分区中
- 经过分组、排序等流程操作之后,不同内存块中相同分区的数据写入磁盘中
- 启动Reduce任务,连接各个Map任务节点,从磁盘中读取自己需要处理的分区数据
- Reduce任务的个数可手动设置也可根据分区个数来
- 相同分区的数据必定在一个Reduce中,一个Reduce任务可能处理多个分区的数据
- 执行Reduce中的业务逻辑并输出
Spark
基于内存进行数据交换的计算框架==
什么是弹性分布式数据集?
- RDD、DataFrame、DataSet全都是Spark平台下的分布式弹性数据集,为超大型数据提供便利;
- RDD一般和Spark mlib同时使用。RDD不支持SparkSQL操作;
- Dataset和DataFrame拥有完全相同的成员函数,区别是每一行的数据类型不同;
- RDD 和 DataFrame/DataSet 可以相互转换;
如何理解RDD?
1.RDD两种产生方式:一是从外部数据源中创建;二是从一个RDD转换而来
2.你可以把它当做一个List,但是这个List里面的元素是分布在不同机器上的,对List的所有操作都讲被分发到不同的机器上执行。
3.RDD就是我们需要操作的数据集,并解决了数据在哪儿的问题。