Apache spark 的一些浅见。

1、搬砖 vs. 分布式计算

一我的搬砖很累,几我的一块儿搬就会轻松不少,也会快不少:算法

分布并行计算和几我的一块儿搬砖的意思是一致的,一个资源密集型的任务(搬砖或计算),须要 一组资源(小伙伴或计算节点),并行地完成:数据库

  • 计算任务 => 搬砖数组

  • 计算节点 => 小伙伴分布式

当计算任务太重时,咱们就把计算任务拆分,而后放到多个计算节点上同时执行,这就是分布并行计算。函数

2、求文件中包含"包租婆"的行数

从一个总计100行的文件中找出全部包含“包租婆”的行数,咱们不用太动脑筋就有一个算法:spa

  1. 读一行,判断这一行有“包租婆”吗?若是有,全局变量count加1。code

  2. 文件到末尾了吗?若是没有,跳转到第1步继续执行。orm

  3. 打印count。对象

 

这几步程序,我打赌在你的计算机上能够一眨眼的功夫就执行完。可是若是这个文件有100万行呢? 若是还用刚才不动脑筋的笨算法,可能就很差交差了......ip

并行分布计算采用了一个大智若愚的办法,经过将笨算法丢给一群机器同时去算,实现规定时间内规定 任务的完成。你要知道,现在流行的Map/Reduce就是这么干的,这听起来不够高端,也确实引发了一些数据库专 家(聪明人)的非议。不过,无论黑猫白猫,能抓住老鼠的都是好猫。

3、Spark简化了分布式计算的开发

若是要把刚才的任务进行分布计算(假设有10台机器能够用),须要对原始的笨算法作一些调整:

 

  1. 把100万条数据分红10份,每份10万条。

  2. 在10台机器上分别执行笨办法计算包含“包租婆”的行数。

  3. 汇总合并10台机器的计算结果,即count,打印出来。

Oh...NO.....太...累...了...

好在有Spark的存在!咱们只要把数据和计算程序交给Spark,它会机智地进行数据切分、算法复制、分布执行、结果合并。

4、Spark的计算范式:数据集上的计算

Spark用起来的确简单,但有一点特别要注意,你得按照Spark的范式写算法。

Spark是在数据集的层次上进行分布并行计算,是的,它只认成堆的数据:

咱们提交给Spark的计算任务,必须知足两个条件:

  1. 数据是能够分块的,每块构成一个集合。

  2. 算法只能在集合级别执行操做。

好比,对于文本文件,在Spark中,一行就是一条记录,若干条记录组成一个集合。咱们 原来的算法直接在每一行上进行计算,就不行了。须要先构建数据集,而后经过数据集的操做, 实现咱们的目的。

5、SQL中的数据集

若是你熟悉SQL,能够用SQL的思惟考虑下什么是集合操做:

  1. UPDATE USER SET GENDER='FEMALE'

上面的SQL语句就是一个集合操做,对一个数据集合,执行一条UPDATE操做,整个数据集都被修改了。

UPDATE语句有两个特色,这也是集合操做的要素:

1.对集合的每一个记录执行相同的操做

UPDATE更新了集合中的全部记录,这些记录的 GENDER 字段值都被更新为 FEMALE 。

2.这个操做的具体行为是用户指定的

UPDATE经过SET子句,指定更新那些字段,怎么更新。

6、JavaScript中的数据集

JavaScript中数组对象的map方法也是一种集合操做。map方法将一个数组的每个成员变换为新的成员, 并返回变换后新的集合。

  1. var a=[1,2,3,4];
    a.map(function(d){return d*2;});
    console.log(a);

上面的JavaScript代码对一个数组执行map方法,将每个成员进行倍乘。结果是得到一个新的 数组,好比在这里,将获得[2,4,6,8]。

这个例子也说明了集合操做的两个要素:

1.对集合的每一个记录执行相同的操做

在map方法执行中,每一个数组成员都被转换为原始值的2倍。

2.这个操做的具体行为是用户指定的

map方法使用一个匿名函数,指定如何对每个原始数据进行变换。

7、将算法移植到Spark上

如今咱们修改原始的笨算法,使之适用于Spark:

  1. 将数据载入并构造数据集
    在Spark中,这个数据集被称为`RDD` :弹性分布数据集。

  2. 对数据集进行map操做
    指定行为:若是一行原始记录包含“包租婆”,该行记录映射为新值1,不然映射为新值0 。

  3. 对map后的数据集进行collect操做,得到合并的结果。

上面的map操做,和前面JavaScript数组的map方法相似,将原始记录映射为新的记录,并返回一个新的RDD。 collect操做提取RDD中的所有数据到本地。

魔术发生在RDD上。Spark的RDD自动进行数据的切分和结果的整合。咱们伪装不知道就行了, 就像这一切只发生在本地的一台机器上。

8、Spark操做符

Spark提供了80多种操做符对集合进行操做。咱们列举经常使用的一些供你创建一点基本概念, 以便了解Spark能够支持什么:

变换

变换操做老是得到一个新的RDD:

  • map(func) : 将原始数据集的每个记录使用传入的函数func ,映射为一个新的记录,并返回新的RDD。

  • filter(func) : 返回一个新的RDD,仅包含那些符合条件的记录,即func返回true 。

  • flatMap(func) : 和map相似,只是原始记录的一条可能被映射为新的RDD中的多条。

  • union(otherDataset) : 合并两个RDD,返回一个新的RDD 。

  • intersection(otherDataset):返回一个新的RDD,仅包含两个RDD共有的记录。

动做

动做操做老是得到一个本地数据,这意味着控制权回到你的程序了:

  • reduce(func) : 使用func对RDD的记录进行聚合。

  • collect() : 返回RDD中的全部记录

  • count() : 返回RDD中的记录总数


对spark中Scala语言快速扫盲、交互分析、RDD动做、RDD变换的介绍以下:
http://www.hubwiz.com/course/5449c691e564e50960f1b7a9/

相关文章
相关标签/搜索