Spark 论文笔记
MapReduce 非常成功,然而这些围绕无环图建立的系统大多不通用,这时候 Spark 横空出世,通过一种名叫 RDD 的分布式数据结构,提出了一种可以支持:
those that reuse a working set of data across multiple parallel operations.
的分布式计算框架。
RDD (Resilient Distributed Dataset) 是一种可以在丢失后通过 DAG 中前置节点被重建的只读数据结构。
Spark 通过 Scala 实现,Scala 的特性:
- 在 JVM 上实现的语言
- 支持 functional programming
- 面向对象
编程模型
RDD介绍
RDD 可以通过四种方式被创建
- 从文件系统中创建,例如 HDFS
- 从 Scala collection 中被创建
- 从一个已有的 RDD 变换而来,(通过 flatMap,map,filter 等)
- 通过更改一个已有 RDD 的持久化方式(RDD 是只读的,一旦有更改操作就会逻辑上新创建一个 RDD)
此外 RDD 是一种 lazy 并且 ephemeral 的数据结构,用户可以通过两种方式持久化 RDD:
- 通过 cache,cache 后的 RDD 依然是 lazy 的,但不是 ephemeral 的,意思是在第一次求值之后会被存起来等待复用
- 通过 save,写入到分布式文件系统中
用户需要在访问速度和存储空间两者中做 trade-off
并行操作
- reduce - 结合律
- collect
- foreach - side effect
例子
- log statistics
- logistic regression
- ALS
在 lazy 和 ephermal 两个特性的加持下 Spark 表现就像 MapReduce一样,然而只要在其中加入 cache 的步骤就可以显著加速运算
实现
- (论文写就时的版本)构建于 Mesos 之上
- 实现的核心在于 RDD interface,充分利用了 Scala 的面向对象和函数式特性
- getPartitions
- getIterator(partition)
- getPreferredLoacations(partition) 为了本地性考虑
- task (clousures) 在 Scala 中是 Java Object,因此可以序列化并发送,在实现的过程中甚至还发现了一个 Scala 的bug
- 还搞了解释器集成
- 截至论文写就的时候,还没有实现 shuffle
实验结果
- 吊打 Hadoop,10x 快
- 数据集小
相关工作
- Distributed Shared Memory
- MapReduce
- Scala 类似 DryadLINQ
感想
- 还很早期的工作,作者很激动地拿出来分享,10x 于 Hadoop 的效果有点炸
- 本篇文章较为笼统
- functional,immutable,因此可以 lazy evaluate
- 无论是 Hadoop,还是那个时候的 Spark,都打不过 MapReduce