第92讲 SparkStreming中的Transformations和状态管理

本期内容:

1.SparkStreaming中的Transforamtions

2.SparkStreaming中的状态管理

一.DStream就是一个RDD之上的一个抽象,DStream和时间结合起来就不断的触发产生RDD的实例,可以说我们对Dstream的操作就初步定义了对RDD的操作,只不过需要时间的间隔也就是internalbatch去激活这个模板,生成具体的RDD的实例和具体的job.

二.我们鼓励Repartition,更多的是把更多的partition变成更少的partition,进行流的碎片的整理,我们不太鼓励把更少的partition变成更多的partion,因为会牵扯shuffle。

三.DStream是离散流,离散流就没状态,除了计算每个时间间隔产生一个job,我们还有必要计算过去十分钟或者半个小时,所以这个时候我们需要维护这个状态。后台spark提供了专门维护这个状态的函数updateStateByKey(func),即基于key,我们可以进行多个状态的维护。因为你可以把每一个时间间隔都做为一个状态,例如每一秒钟做为一个状态,我算下过去十分钟或者半个小时。值的更新就是通过传进来的func函数。

四.Transform


transform(func)


Return a new DStream by applying a RDD-to-RDD function to every RDD of the source DStream. This can be used to do arbitrary RDD operations on the DStream.

编程的逻辑是作用于RDD

Transform操作,允许任意的RDD和RDD的操作被应用在DStream上。他可以使这些RDD不容易暴露在DstreamAPI中。比如让两个batch产生join操作而不暴露在DstreamAPi中,然后你可以很容易的使用transform来做这。这将是非常有作用的,例如,能够将实时数据清理通过将输入的数据流和预先计算的垃圾信息过滤掉。

五.UpdateByKey


updateStateByKey(func)


Return a new "state" DStream where the state for each key is updated by applying the given function on the previous state of the key and the new values for the key. This can be used to maintain arbitrary state data for each key.

UpdaeStateByKey的操作,允许你维护任意的不断通过新的信息来更新的状态。使用这个函数你必须遵守两个步骤

1.定义一个状态:这个状态可以是任意的数据类型

2.定义一个状态更新函数:怎么样去使用从一个数据流中产生的旧的状态和新的状态来更新出一个状态。

六.forecachRDD(func)


foreachRDD(func)


The most generic output operator that applies a function, func, to each RDD generated from the stream. This function should push the data in each RDD to an external system, such as saving the RDD to files, or writing it over the network
to a database. Note that the function func is executed in the driver process running the streaming application, and will usually have RDD actions in it that will force the computation of the streaming RDDs.

mapWithState将流式的状态管理性能提高10倍以上

foreachRDD(func)中的函数func是作用于最后一个RDD,也就是结果RDD,如果RDD没有数据,就不需要进行操作,foreachRDD()可以将数据写在Redis/Hbase/数据库/具体文件中,foreachRDD是在Driver程序中执行的,func就是action。

七.updateStateByKey

val cogroupedRDD = parentRDD.cogroup(prevStateRDD, partitioner)
val stateRDD = cogroupedRDD.mapPartitions(finalFunc, preservePartitioning)
Some(stateRDD)

cogroup是性能的瓶颈,所有的老数据,过去的数据都要进行cogroup操作,即使新的数据pairedRDD只有一条记录,也要把所有的老记录都要进行cogroup操作。这时相当耗时的。理论上讲,只应对这条记录对应的key和历史的一批数据中对应的这个key进行更新操作就行了,而它更新全部的,99%的时间都是浪费和消耗。性能非常低。也会产生shuffle。而下面的MapWithState则只更新你必须要更新的,所以极大提升了性能。

MapWithState只需要更新你必须更新的,没有必要更新所有的记录,官方宣传这个api会把流式的状态管理性能提升10倍以上。

时间: 2024-11-05 14:53:16

第92讲 SparkStreming中的Transformations和状态管理的相关文章

处理文件,用户指定要查找的文件和内容,讲文件中包含要查找内容的每一行都要输出到屏幕

处理文件,用户指定要查找的文件和内容,讲文件中包含要查找内容的每一行都要输出到屏幕: 预先有一个名为 cars.py 的文件,其内容为: cars = ['honda','yamaha','suzuki'] print(cars) cars[0] = 'ducati' print(cars) cars.append('马大哈') print(sorted(cars)) print(cars) 接下来写生成代码: def check_file(): # 创建一个名为 check_file 的生成器

Spring中实现多数据源事务管理

Spring中实现多数据源事务管理 前言 由于项目中引入了多个数据源,并且需要对多个数据源进行写操作,那么多数据源的事务管理自然成了不可避免的问题,这也让我对@Transactional注解有了进一步的理解(但实际上也并不是非常深入) 然而这是一个演进的过程,刚开始项目中并没有使用@Transactional指定具体的TransactionManager,所以新增一个数据源后,对原有的事务产生了影响了,这也是偶尔在一次测试报错而结果没有回滚之后才发现的,遂对于@Transactional注解的一

android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中没有数据. 如下面的代码: 这就是在initData中异步获取服务器的数据,然后实例化adatper,再将adapter赋给listView. 2.initData()中的代码是: 这里线程要睡眠5秒钟,是为了模仿网络的耗时操作 3.Handler: 在Handler中接收到数据后给list赋值后,

供多处理器系统中的高速缓存同步中使用的转发状态

这里所述的是一种具有五种状态的高速缓存同步协议,该五种状态为:修改.排它.共享.无效和转发(MESIF).所述MESIF高速缓存同步协议包括转发(F)状态,该状态指明单个数据副本,从所述数据副本中能够产生另一个副本.利用F状态下的超高速缓冲存储器行来响应对超高速缓冲存储器行的副本的请求.在一个实施例中,将新创建的副本置于F状态下并将先前处于F状态下的超高速缓冲存储器行置成共享(S)状态或无效(I)状态.由此,如果共享超高速缓冲存储器行,则一个共享的副本就处于F状态下并且剩余的超高速缓冲存储器行副

Atitit.css 规范 bem  项目中 CSS 的组织和管理

Atitit.css 规范 bem  项目中 CSS 的组织和管理 1. 什么是BEM?1 1.1. 块(Block)2 1.2. 元素(Element)2 1.3. BEM树(和DOM树类似).3 1.4. 修饰符(modifier)的3 2. 块的独立性4 3. 独立的CSS4 3.1. 为独立的CSS类命名5 4. BEM争议最大的就是它的命名风格 6 5. OOCSS6 6. ACSS6 7. CSS 组织和管理 结论attilax总结7 8. Atibem7 8.1. Modifier

BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第10章节--SP2013中OAuth概览 创建和管理应用程序身份

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第10章节--SP2013中OAuth概览  创建和管理应用程序身份 在之前的部分,你看到应用程序如何像用户一样拥有一个身份.当一个App依据用户执行某操作时,SP记录这个信息.

(转)JavaMail中的Flag(邮件状态)

本文转载自:http://blog.csdn.net/chjttony/article/details/6005594 标记邮件就是把邮件标记为已读,删除等操作,需要使用Flags类,它mail.jar包中的Flags类代表以组邮件标记的集合,邮件标记用于标示邮件的使用情况,例如邮件的删除标记.已读标记等.JavaMail中的邮件标记分为系统标记和用户标记,系统标记指Flags.Flag这个内部类中表示的邮件标记,用户标记指用户自定义的标记. Flags.Flag类:是Flags的内部类,以定义

Java学习中,常用的命令管理(Java 学习中的小记录)

Java学习中,常用的命令管理      作者:王可利(Star·星星) 一.Window中常见的dos命令 在哪里操作dos命令: Win7 ---> 开始  ---->所有程序--->附件---->命令提示符 Win7-->  开始  --->运行  ---->输入cmd 1.1 盘符的切换: 盘符眀+冒号  格式: 盘符: 例子: 想从C盘到D盘 C:/User/xxxx  D: 1.2 文件夹的操作 dir :显示当前文件夹中的所有文件和文件夹. cd 路

十九、android中判断sim卡状态和读取联系人资料的方法

在写程序中,有时候可能需要获取sim卡中的一些联系人资料.在获取sim卡联系人前,我们一般会先判断sim卡状态,找到sim卡后再获取它的资料,如下代码我们可以读取sim卡中的联系人的一些信息. PhoneTest.java package com.android.test; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.datab