本来这篇是准备5.15更的,但是上周一直在忙签证和工作的事,没时间就推迟了,现在终于有时间来写写Learning Spark最后一部分内容了。

  第10-11 章主要讲的是Spark Streaming 和MLlib方面的内容。我们知道Spark在离线处理数据上的性能很好,那么它在实时数据上的表现怎么样呢?在实际生产中,我们经常需要即使处理收到的数据,比如实时机器学习模型的应用,自动异常的检测,实时追踪页面访问统计的应用等。Spark Streaming可以很好的解决上述类似的问题。

了解Spark Streaming ,只需要掌握以下几点即可:

  • DStream

    • 概念:离散化流(discretized stream),是随时间推移的数据。由每个时间区间的RDD组成的序列。DStream可以从Flume、Kafka或者HDFS等多个输入源创建。
    • 操作:转换和输出,支持RDD相关的操作,增加了“滑动窗口”等于时间相关的操作。

下面以一张图来说明Spark Streaming的工作流程

  从上图中也可以看到,Spark Streaming把流式计算当做一系列连续的小规模批处理来对待。它从各种输入源读取数据,并把数据分组为小的批次,新的批次按均匀的时间间隔创建出来。在每个时间区间开始的时候,一个新的批次就创建出来,在该区间内收到的数据都会被添加到这个批次中去。在时间区间结束时,批次停止增长。

  转化操作

  • 无状态转化操作:把简单的RDDtransformation分别应用到每个批次上,每个批次的处理不依赖于之前的批次的数据。包括map()、filter()、reduceBykey()等。
  • 有状态转化操作:需要使用之前批次的数据或者中间结果来计算当前批次的数据。包括基于滑动窗口的转化操作,和追踪状态变化的转化操作(updateStateByKey())

  无状态转化操作

  有状态转化操作

  Windows机制(一图盛千言)

上图应该很容易看懂,下面举个实例(JAVA写的):

  

  UpdateStateByKey()转化操作

  主要用于访问状态变量,用于键值对形式的DStream。首先会给定一个由(键,事件)对构成的DStream,并传递一个指定如何个人剧新的事件更新每个键对应状态的函数,它可以构建出一个新的DStream,为(键,状态)。通俗点说,加入我们想知道一个用户最近访问的10个页面是什么,可以把键设置为用户ID,然后UpdateStateByKey()就可以跟踪每个用户最近访问的10个页面,这个列表就是“状态”对象。具体的要怎么操作呢,UpdateStateByKey()提供了一个update(events,oldState)函数,用于接收与某键相关的时间以及该键之前对应的状态,然后返回这个键对应的新状态。

  • events:是在当前批次中收到的时间列表()可能为空。
  • oldState:是一个可选的状态对象,存放在Option内;如果一个键没有之前的状态,可以为空。
  • newState:由函数返回,也以Option形式存在。如果返回一个空的Option,表示想要删除该状态。

  UpdateStateByKey()的结果是一个新的DStream,内部的RDD序列由每个时间区间对应的(键,状态)对组成。

  接下来讲一下输入源

  • 核心数据源:文件流,包括文本格式和任意hadoop的输入格式
  • 附加数据源:kafka和flume比较常用,下面会讲一下kafka的输入
  • 多数据源与集群规模

Kafka的具体操作如下:

基于MLlib的机器学习

  一般我们常用的算法都是单机跑的,但是想要在集群上运行,不能把这些算法直接拿过来用。一是数据格式不同,单机上我们一般是离散型或者连续型的数据,数据类型一般为array、list、dataframe比较多,以txt、csv等格式存储,但是在spark上,数据是以RDD的形式存在的,如何把ndarray等转化为RDD是一个问题;此外,就算我们把数据转化成RDD格式,算法也会不一样。举个例子,你现在有一堆数据,存储为RDD格式,然后设置了分区,每个分区存储一些数据准备来跑算法,可以把每个分区看做是一个单机跑的程序,但是所有分区跑完以后呢?怎么把结果综合起来?直接求平均值?还是别的方式?所以说,在集群上跑的算法必须是专门写的分布式算法。而且有些算法是不能分布式的跑。Mllib中也只包含能够在集群上运行良好的并行算法。

MLlib的数据类型

  • Vector:向量(mllib.linalg.Vectors)支持dense和sparse(稠密向量和稀疏向量)。区别在与前者的没一个数值都会存储下来,后者只存储非零数值以节约空间。
  • LabeledPoint:(mllib.regression)表示带标签的数据点,包含一个特征向量与一个标签,注意,标签要转化成浮点型的,通过StringIndexer转化。
  • Rating:(mllib.recommendation),用户对一个产品的评分,用于产品推荐
  • 各种Model类:每个Model都是训练算法的结果,一般都有一个predict()方法可以用来对新的数据点或者数据点组成的RDD应用该模型进行预测

  

  一般来说,大多数算法直接操作由Vector、LabledPoint或Rating组成的RDD,通常我们从外部数据读取数据后需要进行转化操作构建RDD。具体的聚类和分类算法原理不多讲了,可以自己去看MLlib的在线文档里去看。下面举个实例----垃圾邮件分类的运行过程:

步骤:

1.将数据转化为字符串RDD

2.特征提取,把文本数据转化为数值特征,返回一个向量RDD

3.在训练集上跑模型,用分类算法

4.在测试系上评估效果

具体代码:

 from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.feature import HashingTF
from pyspark.mllib.calssification import LogisticRegressionWithSGD spam = sc.textFile("spam.txt")
normal = sc.textFile("normal.txt") #创建一个HashingTF实例来把邮件文本映射为包含10000个特征的向量
tf = HashingTF(numFeatures = 10000)
#各邮件都被切分为单词,每个单词背映射为一个特征
spamFeatures = spam.map(lambda email: tf.transform(email.split(" ")))
normalFeatures = normal.map(lambda email: tf.transform(email.split(" "))) #创建LabeledPoint数据集分别存放阳性(垃圾邮件)和阴性(正常邮件)的例子
positiveExamples = spamFeatures.map(lambda features: LabeledPoint(1,features))
negativeExamples = normalFeatures.map(lambda features: LabeledPoint(0,features))
trainingData = positiveExamples.union(negativeExamples)
trainingData.cache#因为逻辑回归是迭代算法,所以缓存数据RDD #使用SGD算法运行逻辑回归
model = LogisticRegressionWithSGD.train(trainingData) #以阳性(垃圾邮件)和阴性(正常邮件)的例子分别进行测试
posTest = tf.transform("O M G GET cheap stuff by sending money to...".split(" "))
negTest = tf.transform("Hi Dad, I stared studying Spark the other ...".split(" "))
print "Prediction for positive test examples: %g" %model.predict(posTest)
print "Prediction for negative test examples: %g" %model.predict(negTest)

  

  这个例子很简单,讲的也很有限,建议大家根据自己的需求,直接看MLlib的官方文档,关于聚类,分类讲的都很详细。

注:图片参考同事的PPT讲义^_^,已授权哈哈

【原】Learning Spark (Python版) 学习笔记(四)----Spark Sreaming与MLlib机器学习的更多相关文章

  1. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  2. 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性

    本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...

  3. 【原】Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令

    <Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...

  4. Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令

    <Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...

  5. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  6. python cookbook第三版学习笔记四:文本以及字符串令牌解析

    文本处理: 假设你存在一个目录,下面存在各种形式的文件,有txt,csv等等.如果你只想找到其中一种或多种格式的文件并打开该如何办呢.首先肯定是要找到满足条件的文件,然后进行路径合并在一一打开. pa ...

  7. Python——追加学习笔记(四)

    函数 1.python里的函数可以返回一个值或者对象,知识在返回一个容器对象的时候有点不同,看起来像是能返回多个对象. >>> def bar(): ... return 'abc' ...

  8. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  9. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

随机推荐

  1. 代码的坏味道(5)——数据泥团(Data Clumps)

    坏味道--数据泥团(Data Clumps) 特征 有时,代码的不同部分包含相同的变量组(例如用于连接到数据库的参数).这些绑在一起出现的数据应该拥有自己的对象. 问题原因 通常,数据泥团的出现时因为 ...

  2. FFmpeg滤镜实现区域视频增强 及 D3D实现视频播放区的拉大缩小

    1.区域视频增强 FFmpeg滤镜功能十分强大,用滤镜可以实现视频的区域增强功能. 用eq滤镜就可以实现亮度.对比度.饱和度等的常用视频增强功能. 推荐两篇写得不错的博文: (1)ffmpeg综合应用 ...

  3. Aix/Linux下自动备份oracle数据库

    曾经有个同事,来回操作开发和生产的数据库,结果误删了生产的数据库,那种心情我想不是一般人能理解的,虽然说oracle可以有方法还原,但并不是彻底的. 所以,在工作中,不管是开发还是维护,备份数据库是非 ...

  4. php实现设计模式之代理模式

    <?php /* * 代理模式 * 为其他对象提供一种代理以控制对这个对象的访问. * 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...

  5. 分布式文件系统 - FastDFS 简单了解一下

    别问我在哪里 也许我早已不是我自己,别问我在哪里,我一直在这里. 突然不知道说些什么了... 初识 FastDFS 记得那是我刚毕业后进入的第一家公司,一个技术小白进入到当时的项目组后,在开发中上传用 ...

  6. Scoped CSS规范草案

    原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/Scoped-CSS 写在前面 问:什么是Scoped CSS规范? Scoped CSS规范是We ...

  7. HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本 ,请添加处理程序。如果下载文件,请添加 MIME 映射。 IIS站点中添加WCF项目后浏览网站报错解决方法。

    vs2013 wcf服务 windows10 家庭中文版 上图中的红色没有出现就按照下面的方法做: 按照上图所示勾选. 刷新上图中你的网站,查看上图右边的内容是否出现,如果出现,再次重新浏览网站,看一 ...

  8. Images.xcassets不能获取图片路径

    原文地址:http://www.jianshu.com/p/5358f587af38 Images.xcassets在app打包后,以Assets.car文件的形式出现在bundle中.其作用在于: ...

  9. Json生成与解析

    JSON常用与服务器进行数据交互,JSON中"{}"表示JSONObject,"[]"表示JSONArray 如下json数据: {"singers& ...

  10. 了解npm的文件结构(npm-folders)和配置文件(npm-mrc)

    一.npm的文件结构 npm的安装: 本地安装 1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm ...