Spark是Berkeley大学AMP(stands for Algorithms, Machines, and People)实验室开发的一个项目。它是一个基于RDD(Resilient Distributed Datasets)模型,能够支持计算MapReduce模式的作业,主要用于迭代计算和交互式数据计算等中间结果可重用的分布式计算框架。Spark 将数据缓存在内存中从而减少数据的访问延迟。
1. RDD
RDD,即可伸缩的分布式数据集合,管理数据缓存和数据重用,采用分析日志方式支持数据容错,提供了粗粒度的事务处理接口(map,filter,join)。RDD 对数据记录进行分区存储,本身是只读的。RDD 的数据来源:1) 稳定的存储介质;2) 其它的RDD存储的数据。RDD对程序员开发了两种操作:数据存储和分区。RDD本身不做物理储存,通过保存足够的信息去实际的储存中计算出RDD,可以将RDD视为松散的虚拟内存[1]。
2. RDD v.s. DSM
RDD相比于DSM(共享内存)有如下的不同
Aspect | RDDS | DSM |
Reads | Coarse- or fine-grained | Fine-grained |
Writes | Coarese-grained | Fine-grained |
Consistency | Trivial (immutable) | Up to app / runtime |
Fault recovery | Frine-grained and low-overhead using lineage | Requires checkpoints and program rollback |
Straggler mitigation | Possible using backup tasks | Difficult |
Work placement | Automatic based on data locality | Up to app |
Behavior if not enough RAM | Similar to existing data flow systems | Poor perfermance |
3. 共享变量[2]
当Spark并发运行一个函数时,它是以多个的task,在不同的结点上运行,它传递每一个变量的一个拷贝,到每一个独立task使用到的函数中,因此这些变量并非共享的。然而有时候,我们需要在任务中能够被共享的变量,或者在任务与驱动程序之间共享。Spark支持两种类型的共享变量:
广播变量: 可以在内存的所有结点中被访问,用于缓存变量(只读)
累加器: 只能用来做加法的变量,例如计数和求和
4. Spark编程模型
Spark 使用 Scala 语言编写,分布式事务管理使用Mesos,并支持HDFS文件系统,是一个轻量级的框架。其0.5版有1,4000行代码。
开发者编写 Driver 控制集群中的 worker。一个Driver定义了一个或多个RDD,并能够记录RDD之间的进化关系。worker是一个长进行,将存储了RDD分区存储在内存中执行操作。RDD数据集上定义了两种操作[3]:action 和 transformation。action,即在数据集上执行计算,并向driver返回一个值;transformation,即从已有数据集创建新的数据集。