01 Spark的定义

  • Spark:一个通用的快速分析引擎。
  • 分布式计算框架
  • 简言之,Spark 为我们常见的批处理、流处理、数据分析、数据探索、机器学习等场景都提供了很好的解决方案,任何有数据处理需求的人,都可以用它来完成自己的研究与日常工作。

02 MapReduce: 计算框架和编程模型

内容主要有以下几点:

  • Google 的三驾马车;
  • MapReduce 编程模型与 MapReduce 计算框架;
  • 并发与并行;
  • 如何理解分布式计算框架的编程接口与背后的工程实现。

Google 的三驾马车

USNew 把计算机科学分为 4 个领域:人工智能、编程语言、系统以及理论。其中的系统领域有两大顶级会议,一个是 ODSI(USENIX conference on Operating Systems Design and Implementation),另一个是 SOSP(ACM Symposium on Operating Systems Principles),这两个会议在业界的分量非常重,如果把近几十年关于这两个会议的重要论文收录到一本书,就可以看作是操作系统和分布式系统的一本教科书。

从 2003 年到 2006 年,Google 分别在 ODSI 与 SOSP 发表了 3 篇论文,引起了业界对于分布式系统的广泛讨论,这三篇论文分别是:

  • SOSP2003:The Google File System;
  • ODSI2004:MapReduce: Simplifed Data Processing on Large Clusters;
  • ODSI2006:Bigtable: A Distributed Storage System for Structured Data。

MapReduce 编程模型与 MapReduce 计算框架

MapReduce 模型将数据处理方式抽象为 map 和 reduce,其中 map 也叫映射,顾名思义,它表现的是数据的一对一映射,通常完成数据转换的工作,如下图所示:

学习笔记 | Spark简介、MapReduce

reduce 被称为归约,它表示另外一种映射方式,通常完成聚合的工作,如下图所示:

学习笔记 | Spark简介、MapReduce

圆角框可以看成是一个集合,里面的方框可以看成某条要处理的数据,箭头表示映射的方式和要执行的自定义函数,运用 MapReduce 编程思想,我们可以实现以下内容:

  • 将数据集(输入数据)抽象成集合;
  • 将数据处理过程用 map 与 reduce 进行表示;
  • 在自定义函数中实现自己的逻辑。
  • 这样就可以实现从输入数据到结果数据的处理流程(映射)了。

并发与并行

这里举一个分组聚合的例子,如下图所示:
学习笔记 | Spark简介、MapReduce
map 端的用户自定义函数与 map 算子对原始数据人名进行了转换,生成了组标签:性别,reduce 端的自定义函数与 reduce 算子对数据按照标签进行了聚合(汇总)。

MapReduce 认为,再复杂的数据处理流程也无非是这两种映射方式的组合,例如 map + map + reduce,或者 reduce 后面接 map,等等,下面这张图里你可以看到相对复杂的一种组合形式:
学习笔记 | Spark简介、MapReduce
很多支持函数式编程的语言,对于语言本身自带的集合数据结构,都会提供 map、reduce 算子。现在,我们可以很容易的将第一个圆角方框想象成一个数十条数据的集合,它是内存中的集合变量,那么要实现上图中的变换,对于计算机来说,难度并不大,就算数据量再大些,我们也可以考虑将不同方框和计算流程交给同一台计算机的 CPU 不同的核心进行计算,这就是我们说的并行和并发

如何理解分布式计算框架的编程接口与背后的工程实现

  • 比如计算过程涉及到硬盘和内存之前的数据交换等等之类的工程实现的问题
  • 把图中方框所代表的数据集分别交给不同的计算机来完成,那么如何调度计算机,如何实现 reduce 过程中不同计算机之间的数据传输等问题,就是 Spark 基于 MapReduce 编程模型的分布式实现,这也是我们常常所说的分布式计算。

学习笔记 | Spark简介、MapReduce

  • 1、2 行是函数式编程语言 Scala 对于集合的处理,3、4 行是 Spark 对集合的处理,逻辑同样是对集合元素都加 1 再过滤掉小于等于 1 的元素并求和。对于 Spark 来说,处理几十 GB到几十 TB 的数据集,第2行代码或者说第4行代码同样适用,只是 list 变得比较特殊,它不是只存在于一台计算机的内存里,而是存在于多台计算机的磁盘和内存上。

  • 我们可以把 Spark 看成是一种分布式计算编程语言,它的终极目标是希望达到这样一种体验:让用户处理海量数据集时与处理内存中的集合变量并没有什么不同。

相关文章: