Structured Streaming学习笔记

  • 一,编程模型
  • 二,创建streaming Dataset和Dataframe
  • 三,操作streaming Dataset和Dataframe
    • 3.1 普通Dataset和Dataframe 支持的操作streaming都支持,如下操作不支持:
    • 3.2 基于Event-time(事件时间)的window操作
    • 3.3, 流式数据去重
    • 3.4,多watermark处理策略
  • 四,查询
    • 4.1, 输出模式

Structured streaming是构建在SparkSQL引擎上的可伸缩且容错的流处理引擎。通过Structured streaming,用户可以将流数据当作静态数据来处理,比如执行SQL。SparkSQL引擎将负责以增量和连续的方式运行它,并在流数据不断到达时更新最终结果。Structured streaming使用 Continuous Processing(连续处理)来处理数据,延迟可达到1 millisecond,而不是和SparkStreaming一样使用micro-batch(微量批处理 延迟100millisecond )

一,编程模型

Structured streaming的关键思想是将实时数据流视为一个不断追加的表(无界输入表),流中的每个数据项都像一个新行被追加到输入表中。将流计算表示为静态表上的标准批处理查询,Spark将其作为无界输入表上的增量查询运行。

对无界输入表的查询将生成“结果表”。每一个触发间隔(比如说,每1秒),新行被追加到无界输入表后最终会更新结果表。每当更新结果表时,更改后的结果行写入外部sink。Structured streaming并没有具体化整个表。它从流数据源读取最新的可用数据,对其进行增量处理以更新结果,然后丢弃源数据。它只保留更新结果所需的最小中间状态数据。

二,创建streaming Dataset和Dataframe

 入口:SparkSession.readStream()

输入数据源
文件数据源:读取目录中的文件作为数据流。默认按文件最后被修改的顺序处理文件,支持的格式有text, CSV, JSON, ORC, Parquet.文件的数据模式应该显示指定模式,而不是依赖Spark自动推断模式。当名为/key=value/的子目录存在并且列表将自动递归到这些目录中时,就会发生分区发现。如果这些列出现在用户提供的模式中,则Spark将根据正在读取的文件的路径来填充它们。组成分区方案的目录必须在查询启动时出现,并且必须保持静态。例如,添加/data/year=2016/when/data/year=2015/是可以的,但是更改分区列是无效的(即通过创建目录/data/date=2016-04-17/)。
Kafka:支持Kafka_0.10.0及其以后的版本。
Socket:测试用
Rate:测试用

三,操作streaming Dataset和Dataframe

3.1 普通Dataset和Dataframe 支持的操作streaming都支持,如下操作不支持:

1,多聚合(聚合链)
2,limit ,take(n)
3,distinct 去重
4,排序操作只在输出模式是Complete且进行过聚合操作后才支持
5,部分outer join 不支持
6,count() 改用 ds.groupBy().count()
7,foreach()改用 ds.writeStream.foreach(…)
8,show() 改用console sink

3.2 基于Event-time(事件时间)的window操作

Event-time(事件时间):数据产生的时间,作为数据内的一个列存在,基于 Event-time,可以对数据进行窗口聚合操作。 由于spark是对结果表进行更新操作,所以根据Event-time spark可以很自然地处理延迟数据。spark2.1开始支持watermark(水印),可以指定处理一定阀值内的延迟数据,如10分钟(超出阀值范围的延迟数据丢弃)。

下图,每五分钟计算一次十分钟内的wordcount
如果数据有延迟,如下图,应用程序在12:11接收在12:04(event-time) 生成的数据。应用程序应该使用时间12:04而不是12:11来更新窗口12:00-12:10的旧计数,structured streaming会在内存中缓存一段时间内的中间状态,所以可以很自然的实现此功能。能允许多长时间的延迟或者说缓存多长时间,由watermark指定,缓存不可能长期存在(内存资源有限),到达watermark指定的时间后,缓存被清除,此后event-time在该时间区间的延迟数据会被丢弃,如果watermark指定的时间阀值是10分钟,且12:04的数据到达时间是12:14之后,那么该数据不会被计入。

3.3, 流式数据去重

和静态数据类似,流数据也可以使用唯一标识符列(guid,关系型数据库主键)来消除重复数据。

使用watermark: 如果对重复记录的到达时间有上限,则可以在事件时间列上定义水印,并使用guid和event-time进行重复数据消除。查询将使用watermark从过去的记录中删除旧的状态数据,这些记录将不会再获得任何重复。这限制了查询必须维护的状态量。(应该做不到全局去重,watermark指定时间区间内去重,内存使用量小)
不使用watermark: 由于没有重复记录何时到达的限制,查询将所有过去记录中的数据存储为状态。(可以保证全局唯一,新数据覆盖旧的同guid数据,内存使用量大)

3.4,多watermark处理策略

当两个带有不同阀值watermark的数据流进行union或者join操作时,默认情况下会选择最小值
(min(now-watermark1.threshold,now-watermark2.threshold),也就是阀值更大)当作全局watermark,以保证数据少丢失,spark2.4之后可以设置spark.sql.streaming.multipleWatermarkPolicy to max (default is min)。

四,查询

定义好DataFrame/Datase后,需要开启计算,开启方式为 Dataset.writeStream(),需要提供如下信息:
sink:数据格式,地址等
输出模式:append,complete,update
** 查询名字**:可选,表示计算任务
触发周期:可选,默认情况下,当前计算结束后立马开始下一次。
Checkpoint位置:应该是hdfs的一个目录

4.1, 输出模式

append:只输出最新的数据到sink 中,保证数据只输出一次,只适用于数据输出后不会再被update的场景,如:select, where, map, flatMap, filter, join
complete:每次都输出全部数据,适用于聚合操作。
update:只有更新的数据才会输出。

Structured Streaming学习笔记相关推荐

  1. Spark学习笔记(8)---Spark Streaming学习笔记

    Spark Streaming学习笔记 同Spark SQL一样,Spark Streaming学习也是放在了github https://github.com/yangtong123/RoadOfS ...

  2. Spark Streaming学习笔记

    特点: Spark Streaming能够实现对实时数据流的流式处理,并具有很好的可扩展性.高吞吐量和容错性. Spark Streaming支持从多种数据源提取数据,如:Kafka.Flume.Tw ...

  3. HDS相关(一)之 HTTP Dynamic Streaming 学习笔记[原理篇]

    一.什么是HTTP Dynamic Streaming 使用传统的HTTP协议进行在线播放叫做"渐进下载",所有的视频内容从头到尾必须从服务器传输到客户端,用户只能在传输完的视频长 ...

  4. 【Spark Summit EU 2016】在在线学习中使用Structured Streaming流数据处理引擎

    更多精彩内容参见云栖社区大数据频道https://yq.aliyun.com/big-data:此外,通过Maxcompute及其配套产品,低廉的大数据分析仅需几步,详情访问https://www.a ...

  5. Hadoop学习笔记(1) ——菜鸟入门

     Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...

  6. 笔记 | 吴恩达Coursera Deep Learning学习笔记

    向AI转型的程序员都关注了这个号☝☝☝ 作者:Lisa Song 微软总部云智能高级数据科学家,现居西雅图.具有多年机器学习和深度学习的应用经验,熟悉各种业务场景下机器学习和人工智能产品的需求分析.架 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...

    Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 原文:Introduction to 3 ...

  8. Hadoop学习笔记(1)

    原文:http://www.cnblogs.com/zjfstudio/p/3859704.html Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分 ...

  9. 黑马Python + 人工智能学习笔记

    想成为一名合格的Python工程师需要必备哪些技术点呢? 1.以慕课网日志分析为例 进入大数据 Spark SQL 的世界 2.10小时入门大数据hadoop 3.实战课程Spark Streamin ...

最新文章

  1. redis集群模式的工作原理
  2. mysql 应用程序优化
  3. 集合php,PHP问题集合
  4. 实现带header和footer功能的RecyclerView
  5. win7讲述人修复_揭秘:干掉了win7!为何win10屡被吐槽它却“永世留芳”
  6. knn k的选取_KNN - 初窥K近邻算法
  7. javascript专题汇总
  8. 普通地图的六大要素_地理知识点总结之地图基本要素
  9. centos7 kvm虚拟机安装黑屏
  10. SQLServer 延迟事务持久性
  11. nginx config的多个config配置
  12. PAIP.java程序调试的注意点及流程总结
  13. 设计类-Gliffy Diagram的安装使用
  14. springboot引入validation
  15. 吴恩达:22张图全解深度学习知识!
  16. 计算机日常英语句子,计算机英语句子
  17. Ericsson open-sources OpenWebRTC and Bowser for iOS; Intel releases IoT developer kit
  18. 技术之外——哀悼我的大学舍友
  19. 惊魂,我的23个密码被泄露,快看看你的有没有泄露
  20. Hive SQL操作与函数自定义(二)

热门文章

  1. React 图片预览插件 rc-viewer @hanyk/rc-viewer
  2. 矩阵期望 matlab,matlab中矩阵元素求和、求期望和均方差
  3. linux 项目监控,Zabbix 监控之项目类型-Calculated
  4. 利用ISO文件安装CentOS8
  5. Arduino Uno 实验1——LED(发光二极管)
  6. 计算几何_线段交点的快速排斥_跨立实验
  7. 国庆蓝牙耳机选购盘点,百元级别最值得入手的真无线蓝牙耳机
  8. cidr php,PHP 如何实现ip2cidr(生成多个cidr)
  9. HDFS中的Diff类——用来描述两个集合的不同
  10. JAVA版村庄哨塔种子_我的世界奇妙种子:掠夺者哨塔骑在沙漠神殿上,村民:绝了!...