1、本文背景:
本文由UCB发表于2010年,10年也是MR还处盛行的时候,因此文中会频繁将Spark与MR对比。关注两个框架对比的也可以看博主的另一篇博文:Spark学习笔记之(一):MR与Spark的区别:
https://blog.csdn.net/u010737756/article/details/118406700?spm=1001.2014.3001.5501
从计算速度、资源、容错、功能适用、生态、运行环境六个角度简述了二者的区别。
回到论文,该文章介绍了基于RDD的分布式计算模型以及早期Spark的实现。文中通过与MR对比,提到了Spark与MR类似,提供了较强的可扩展性与高容错。此外,Spark提出框架优于MR的场景,例如:在同一数据处于反复迭代计算的场景下,MR需要重复从磁盘读取数据,而Spark可通过多级别的持久化机制,将数据存在内存或分布式文件系统中,进行RDD的重用等等。
这篇论文阅读笔记会从文中描述的Spark适用场景例子入手,简要介绍一下2010年设计之初的Spark的设计目的,以及这十年来,令Spark一直保持分布式计算框架核心竞争力的部分特性。
2、内容概述
在Abstract中,作者提出Spark这个新框架是针对数据集在并行计算操作场景下,更适用于需要迭代计算的机器学习场景,以及交互式查询、分析场景这两种使用场景。于此同时,Spark框架也保持了MR的可扩展性与高容错。
而Spark在这两个用途的高性能、可扩展性、高容错,也正是Spark贯穿本文的,设计之初的最大目的。
2.1 迭代计算的机器学习算法:
文中举例了两种,一种是逻辑回归、一种是交替最小二乘法。
2.1.1 逻辑回归的实现:
背景:给定一组点集,通过迭代分类算法,试图找到一个超平面w把两个点集合分隔开。
该算法采用梯度下降法,开始给w赋一个随机值。
在每次迭代中对w的结果进行修正,移动w的方向对结果进行优化。
首先创建一个名为points的RDD节点,我们通过运行一个循环来处理它。
for关键字是Scala里面用于表示调用循环的语法,里面的循环体类似于foreach方法。
代码"for(p <- points){body}“等同于"points.foreach(p =>{body})”,在此调用了Spark的并行foreach操作。
其次定义了一个名为grad的梯度累加器(类型为Vector)。需要注意的是,循环体中的累加是并行执行的。
2.1.2 逻辑回归的性能提升
处理29GB的数据。采用20个"m1.xlarge” EC2节点,每个节点有4个处理器核,进行逻辑回归计算。