和MR的对比
Spark相对于MapReduce在2类场景下会显著增强:
- 交互式的场景
- 内存迭代计算型的场景。
原因比较简单:比如在1TB日志中,查找Error日志,找到Error日志后再查找早上10点到12点的日志,再找10点00到10点05的日志,类似于单机时候问题排查。
如果用MR实现,可能就是一次次类似grep的操作,如果通过Spark实现就可以在找到Error日志时把数据缓存在内存。避免反复从文件系统加载数据。因为RAM比硬盘或者网络快很多。
粗颗粒度转换 vs 细颗粒度更新
一张表100万数据,数据是用户名,年龄,粗颗粒度就是分成若干个分区,比如每1万条数据一个分区作为维度,共100个分区。细颗粒度就是每条数据作为维度。如果年龄要统一加一岁,粗颗粒转换就是用一个map函数存储age += 1这样的信息,不管原来的年龄是18,30还是54。细颗粒度更新就是每条数据单独存储,18的变为19,30的变为31,54的变为55。
High Performance Spark上对于粗颗粒度的解释:
functions that are applied to the entire dataset
函数作用于整个数据集,相应的就是作用于单条数据,比如数据库的某行记录的更新。
细颗粒度的优势是更新可以针对单条数据,缺点是如果要保证容错性,要把每个阶段的数据都存下来,比如18和19这2个年龄。
粗颗粒度就可以针对异常的分区,根据血缘关系,直接从上层数据计算而来。等于用时间换空间。
粗颗粒度的另一个优势是可以惰性求值。
惰性求值
transform算子如map、filter不会立即执行,而是在action算子时才触发执行。action算子会触发调度器,基于RDD之间的转换关系,构建一个DAG(有向无环图)。也就是说在求值时,它会构建出如何通过一系列步骤到达要求值的点,比如先filer再map,就是2个步骤。这些步骤被称为执行计划。然后调度器依据这些执行计划计算出缺失的分区。
把算子想象成编程的指令。整个过程就是指令编译为可执行代码并惰性求值的故事!
针对pipeline类型的情况,可以进行指令合并。
网友评论