Part1 基础概念
1 input data stream 当作 unbounded input table
2 new data = new rows
3 查询input table会产生result table
4 每过一个trigger interval,添加新的row到Input table,并更新result table
5 每次result table更新,写将更新的行写到external sink(外部存储,即external storage)
6 output是要写到外部存储的内容,可以有不同模式
1) complete mode: 把上次trigger之后被更新的整个result table写入外部存储
2) append mode: 只把上次trigger之后新添加到result table的行,写入外部存储
3) update mode: 把更新(新增或修改)的行写入外部存储
structured streaming不保留source data,只将source data不断处理并更新result table,然后丢弃
只保留minimal intermediate state data最小中间状态数据
Part2 event-time处理
1 event-time是数据本身的属性,记录数据生成(event)的时间,是table的一个字段,每一行数据都是一个event,Spark每隔一段去读数据是trigger interval,不是event time
2 可以做window操作
Part3 late data处理
1 基于event-time可以处理late data,spark可以完全掌控聚合操作,如果有late data,可以清空旧的aggregates操作以限制intermediate state data的大小
2 spark2.1开始支持使用watermarking,指定late data的threshold(界限),允许engine相应地清理old state
Part4 fault tolerance 语义
三个方面共同实现structured data sources, execution engine, external sinks,实现对处理过程的可靠精确跟踪,通过restart或者reprocess处理各种失败
1 streaming source都有offsets(类似于kafka),跟踪read position in stream
2 execution engine使用checkpointing和write ahead logs记录每个trigger正在处理数据的offset range
3 streaming sinks处理reprocess的时候,是幂等的,也就是相同的输入就会有相同的输出
总结:使用replayable数据源和idempotent sinks,在任何失败情况下保证end-to-end exactly-once semantics