本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ 。

网站上有对应每一小节的在线练习大家可以去试试

一、搬砖 vs. 分布式计算

一个人搬砖很累,几个人一起搬就会轻松很多,也会快很多:

分布并行计算和几个人一起搬砖的意思是一致的,一个资源密集型的任务(搬砖或计算),需要 一组资源(小伙伴或计算节点),并行地完成:

  • 计算任务 => 搬砖
  • 计算节点 => 小伙伴

当计算任务过重时,我们就把计算任务拆分,然后放到多个计算节点上同时执行,这就是分布并行计算。

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

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

  1. 读一行,判断这一行有“包租婆”吗?如果有,全局变量count加1。
  2. 文件到末尾了吗?如果没有,跳转到第1步继续执行。
  3. 打印count。

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

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

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

如果要把刚才的任务进行分布计算(假设有10台机器可以用),需要对原始的笨算法做一些调整:

  1. 把100万条数据分成10份,每份10万条。
  2. 在10台机器上分别执行笨办法计算包含“包租婆”的行数。
  3. 汇总合并10台机器的计算结果,即count,打印出来。

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

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

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

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

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

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

  1. 数据是可以分块的,每块构成一个集合。
  2. 算法只能在集合级别执行操作。

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

五、SQL中的数据集

如果你熟悉SQL,可以用SQL的思维考虑下什么是集合操作:

  1. UPDATE USER SET GENDER='FEMALE'

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

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

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

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

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

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

六、JavaScript中的数据集

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

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

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

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

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

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

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

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

七、将算法移植到Spark上

现在我们修改原始的笨算法,使之适用于Spark:

  1. 将数据载入并构造数据集
    在Spark中,这个数据集被称为`RDD` :弹性分布数据集。
  2. 对数据集进行map操作
    指定行为:如果一行原始记录包含“包租婆”,该行记录映射为新值1,否则映射为新值0 。
  3. 对map后的数据集进行collect操作,获得合并的结果。

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

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

八、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的一些简单认识。的更多相关文章

  1. Spark的Streaming和Spark的SQL简单入门学习

    1.Spark Streaming是什么? a.Spark Streaming是什么? Spark Streaming类似于Apache Storm,用于流式数据的处理.根据其官方文档介绍,Spark ...

  2. Spark安装和简单示例

    spark的安装 先到官网下载安装包 注意第二项要选择和自己hadoop版本相匹配的spark版本,然后在第4项点击下载.若无图形界面,可用windows系统下载完成后传送到centos中. 本例中安 ...

  3. spark sql的简单操作

    测试数据 sparkStu.text zhangxs chenxy wangYr teacher wangx teacher sparksql { ,"job":"che ...

  4. Spark Streaming的简单介绍

    本文讲解Spark流数据处理之Spark Streaming.本文的写作时值Spark 1.6.2发布之际,Spark 2.0预览版也已发布,Spark发展如此迅速,请随时关注Spark Stream ...

  5. spark mllib lda 简单示例

    舆情系统每日热词用到了lda主题聚类 原先的版本是python项目,分词应用Jieba,LDA应用Gensim 项目工作良好 有以下几点问题 1 舆情产品基于elasticsearch大数据,es内应 ...

  6. spark单机模式简单搭建

    待安装列表hadoophivescalaspark一.环境变量配置:~/.bash_profilePATH=$PATH:$HOME/bin export PATH JAVA_HOME=/usr/loc ...

  7. Spark Streaming socketTextStream简单demo

    正文 SparkStreaming的入口是StreamingContext,通过scala实现 一个简单的实时获取数据.代码SparkStreaming官网也可以找到. object SocketDS ...

  8. Spark RDD Action 简单用例(二)

    foreach(f: T => Unit) 对RDD的所有元素应用f函数进行处理,f无返回值./** * Applies a function f to all elements of this ...

  9. Spark RDD Action 简单用例(一)

    collectAsMap(): Map[K, V] 返回key-value对,key是唯一的,如果rdd元素中同一个key对应多个value,则只会保留一个./** * Return the key- ...

随机推荐

  1. 使用BigDecimal进行精确运算以及格式化输出数字

    一.引言    借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供 ...

  2. 在线OJ实用技巧(转载)

    1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long long或__int64型(两个下 ...

  3. ps工具箱总结

    1.矩形工具 四个属性 1.选区2.重叠选区3.减去选区4.区域化缩小选区 样式:固定比例 固定大小 正常 //前两项可以设置宽高 3.快速选择工具.魔棒工具 快速选择工具: 三个属性 1.选区2.增 ...

  4. Android-简单拨号器案例

    Android [19]简单电话拨号器 @方法步骤 1.新建一个android程序,项目名设置为 phone  ,然后打开  phone->res->layout->activity ...

  5. redis批量删除key

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #fffff ...

  6. Oracle中日期时间的操作比较和加减-入门基础(转)

    Oracle关于时间/日期的操作     1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7' MINUTE from dual ...

  7. JQ first-child与:first的区别以及nth-child(index)与eq(index)的区别

    1.first-child和:first区别 first-child  是指选取每个父元素的第一个子元素 如$("div:first-child")指每个父级里的第一个div孩子 ...

  8. CSS之viewport 2

    在这个迷你系列的文章里边我将会解释viewport,以及许多重要元素的宽度是如何工作的,比如<html>元素,也包括窗口和屏幕. 这篇文章我们来聊聊关于移动浏览器的内容.如果你对移动开发完 ...

  9. 我理解的IOC技术在Java和C#中比较分析

    一直想用心写这个系列的文章,其实看得越多,也就越觉得自己在这方面的功力太浅,也就越不想班门弄斧啦,作为一个开篇,我想把这个技术深层次化,在之前的.net的一个MVC系列文章其实已经涉及到了,只是.ne ...

  10. vuejs里封装的和IOS,Android通信模块

    项目需要,在vuejs开发的web项目中与APP进行通信,实现原理和cordova一致.使用WebViewJavascriptBridge. 其实也是通过拦截url scheme,支持ios6往前的系 ...