structed streaming的执行批次,较spark streaming有所改变。更加灵活。总结下来,可大白话地分为三类:

1尽可能快的执行,不定时间

2按固定间隔时间执行

3仅执行一次

详情如下:

Trigger类型 使用 注意
unspecified (default) as soon as micro-batch If no trigger setting is explicitly specified, then by default, the query will be executed in micro-batch mode, where micro-batches will be generated as soon as the previous micro-batch has completed processing.如果不设置,默认使用微批,但没有时间间隔,尽可能快的处理
Interval micro-batch(固定间隔的微批) Trigger.ProcessingTime(long interval, TimeUnit timeUnit) 根据数据实际情况,不定时批次1. 没有明确指明触发器时,默认使用该触发器,即Trigger.ProcessingTime(0L), 表示将尽可能快地执行查询。2. 该模式下,将按用户指定的时间间隔启动微批处理。3. 如果前一个微批在该间隔内完成,则引擎将等待该间隔结束,然后再开始下一个微批处理。4. 如果前一个微批花费的时间比间隔要长,下一个微批将在前一个微批处理完成后立即开始。5. 如果没有新数据可用,则不会启动微批处理。
One-time micro-batch (一次性微批) Trigger.Once() 仅执行一次
Continuous with fixed checkpoint interval(连续处理) Trigger.Continuous(long interval, TimeUnit timeUnit) 以固定的Checkpoint间隔(interval)连续处理。在这种模式下,连续处理引擎将每隔一定的间隔(interval)做一次checkpoint,可获得低至1ms的延迟。但只保证 at-least-once

为什么continuous只支持at-least-once

df.writeStream
.format("console")
.trigger(continuous='1 second')
.start()

注意这里的 1 second 指的是每隔 1 秒记录保存一次状态,而不是说每隔 1 秒才处理数据

continuous 不再是周期性启动 task,而是启动长期运行的 task,也不再是处理一批数据,而是不断地一个数据一个数据地处理,并且也不用每次都记录偏移,而是异步地,周期性的记录状态,这样就能实现低延迟.

综上,continuous模式下长期运行一个task,而不会实时去记录offset,所以不能保证eactly-once.

三种批次方式的验证

1.Interval micro-batch(固定间隔的微批)

`{

Logger.getRootLogger().setLevel(Level.ERROR);

Logger.getLogger(StructuredSparing.class).setLevel(Level.ERROR);

SparkSession session = SparkSession

.builder()

.master("local")

.config("spark.sql.streaming.checkpointLocation", "D://checkpoint")

.getOrCreate();

    Dataset<Row> stream = session.readStream()
.format("kafka")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("subscribe", "test")
.load();
StreamingQuery query = stream.writeStream()
.queryName("StructuredSparingTest")
.format("console")
.trigger(Trigger.ProcessingTime(5, TimeUnit.SECONDS))
.start(); try {
query.awaitTermination();
} catch (StreamingQueryException e) {
e.printStackTrace();
}
}`

设置为5秒一个批次。

通过UI界面可以很直观地看出,在有数据的时候5秒一个批次,在没有数据的时候,10秒甚至3分钟才执行一个批次。

通过与spark streaming进行比较可以更加直观.在spark streaming里设置8秒一个批次,在UI界面可以看到,不管有无数据,spark streaming严格按照8秒的批次执行。

2.One-time micro-batch (一次性微批)

.trigger(Trigger.Once())

执行结果,略。

3.Continuous方式

.trigger(Trigger.Continuous(100,TimeUnit.MILLISECONDS))

设置100毫秒一个执行批次,通过UI界面可以看出,时间已经1.2分钟,但是active job一直只有一个,一直在running,证明启动了一个长期运行的task,不断地一批数据一批数据连续处理。

structed streaming 触发器trigger的更多相关文章

  1. mysql之触发器trigger

    触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...

  2. mysql之触发器trigger 详解

    为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table)  ...

  3. mysql之触发器trigger(1)

    触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...

  4. 如何使用MySQL触发器trigger

    阅读目录:触发器trigger的使用 创建触发器 单一执行语句.多执行语句 new.old详解 查看触发器 删除触发器:慎用触发器,不用就删除 Q:什么是触发器? A: 触发器是与表有关的数据库对象, ...

  5. mysql 触发器(trigger)

    触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...

  6. SQL入门(3):定义约束/断言assertion/触发器trigger

    本文介绍数据库的完整性 完整性控制程序: 指定规则,检查规则 (规则就是约束条件) 动态约束 intergrity constraint::=(O,P,A,R) O : 数据集合, 约束的对象 ?: ...

  7. mysql触发器trigger 实例详解

    mysql触发器trigger 实例详解 (转自 https://www.cnblogs.com/phpper/p/7587031.html)   MySQL好像从5.0.2版本就开始支持触发器的功能 ...

  8. 04 Zabbix4.0系统配置触发器trigger

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 04 Zabbix4.0系统配置触发器trigger 请点击查看Zabbix3.0.8版本trig ...

  9. WPF触发器(Trigger)

    WPF触发器(Trigger.DataTrigger.EventTrigger) WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改 ...

  10. mysql 触发器 trigger用法 two (稍微复杂的)

    触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...

随机推荐

  1. Python学习笔记--元组+字符串

    元组 元组一旦定义完成,就不能再被修改 同样,元组也可以进行嵌套操作 当然,若是在元组里面嵌套一个list,那么list里面的元素是可以进行修改的! 案例: 实现: 字符串 查找索引值: 字符串替换: ...

  2. 开源规则引擎——ice:致力于解决灵活繁复的硬编码问题

    背景介绍 业务中是否写了大量的 if-else?是否受够了这些 if-else 还要经常变动? 业务中是否做了大量抽象,发现新的业务场景还是用不上? 是否各种调研规则引擎,发现不是太重就是接入或维护太 ...

  3. springboot jpa---->总结一下遇到的问题

    Native Query throw exception dto code import lombok.Value; @Value public class IdsOnly { Integer id; ...

  4. 内核不中断前提下,Gaussdb(DWS)内存报错排查方法

    摘要:本文主要讲解如何在内核保证操作不能中断采取的特殊处理,理论上用户执行的sql使用的内存(dynamic_used_memory) 是不会大范围的超过max_dynamic_memory的内存的 ...

  5. API网关:开源Apinto网关快速入门

    Apinto网关基于GO语言模块化开发,5分钟极速部署,配置简单.易于维护,支持集群与动态扩容,开箱即用.Apinto除了提供丰富的网关插件外,还提供监控告警.用户角色等扩展应用,同时支持自定义网关插 ...

  6. Ubuntu+uWSGI部署基于Django的API【鸿篇巨制,事无巨细】

    背景 任务: 视频翻译项目需要在两个服务器上进行通信(国内&海外的阿里服务器). 因为python是主语言,选用了Django 来快速部署API. 注:Django中文文档:https://d ...

  7. python实现员工信息表

    学习python时,看到的一个题目第一次写博客, 有误的地方还请大佬们指正,十分感谢~要求如下'''文件存储格式如下:id,name,age,phone,job(这行不需要写)1,alice,22,1 ...

  8. [Java/IDE]IDEA运行Java类时报错:Error running 'MainTest': Command line is too long. Shorten command line for MainTest or also for Application default configuration

    报错原因 Java项目启动命令过长 解决方法 点击项目启动配置项 -> shorten command line 选项选择 classpath file 或 java manifest 选项 - ...

  9. sql ytd 附python 实现方式

    ytd释义 YTD分析属于同比分析类,其特点在于对比汇总值,即从年初第一日值一直至今的值累加.作用在于分析企业中长期的经营绩效. 做法 假定: 有一张销量明细表 date 仓库 sku 销量 2020 ...

  10. 在smt贴片加工中手工焊接和机器焊接的区别

    在smt贴片加工领域,都需要将电子元件贴装在pcb板表面并进行焊接的,常用的焊接方式分为两种:手动焊接和全自动机器焊接,而常用的焊接机器有回流焊机和波峰焊机,那你知道他们的区别是什么吗?安徽英特丽带你 ...