flink sql

for system_time as of 时间点

for system_time from ... to 时间段查询

for system_time between ... and ..

。。。。。。FOR SYSTEM_TIME AS OF otime语法的含义 - 钱塘江畔 - 博客园 

Demo:基于 Flink SQL 构建流式应用 | Jark's Blog

基于Flink SQL构建流式应用 - 王晓天 - 博客园

flink容量规划

2021-09-22 00:01:48

Flink:source+operator+sink

Source:

    SourceFunction:open

    CheckpointedFunction:initializeState、snapshotState

    一般是source+checkpoint

FlinkKafkaConsumerBase:有四种启动模式:EARLIEST、LATEST、SPECIFIC_OFFSETS、GROUP_OFFSETS

    EARLIEST:从最早的offset开始读取

    LATEST:从最近的offset开始读取

    SPECIFIC_OFFSETS:从指定的offset开始读取

    GROUP_OFFSETS:从commit offset位置开始读取

分区策略:

    每个算子都都需要考滤并行度和分区策略

    Global:全局只选择第一个Channel

    Shuffle:跨节点的随机选择一个Channel

    Rebalance:跨节点的轮询

    Rescale: 尽可能不跨节点的轮询,上游操作的每个分区与下游的分区存在固定的对接关系 ,不会跨TaskManager通信。本地化优先

    BroadCast:广播给每一个Channel

    Forward:并行度一样,同属一个subTasks,不会跨TaskManager通信。可组成operator chain

    KeyGroup:key的hash方式

    Custom:自定义

    具体见: (94条消息) Flink-Streaming之StreamPartitioner_IWBS的博客-优快云博客

Timer

    KeyedProcessFunction的onTimer是指定期器触发时执行的逻辑

    //注册定时期,设置Timer下次触发的时间(基于ProcessTime,Elment处理时间大于设定时间触发),底层用的是ScheduledThreadPoolExecutor.schedule,只会运行一次。多次使用需要多次注册

    ctx.timeService.registerProcessingTimeTimer(水印大于设定时间触发)

    //注册定时期,设置Timer下次触发的时间(基于EventTime)

    ctx.timeService.registerEventTimeTimer

State

    同一并行任务所处理的所有数据都可以访问到相同的状态

    存储:FsStateBackend/HeapStateBackend/RocksDBStateBackend

    分类:keyedState、OperatorState,Flink的Stateful Computations,所有State由RunTimeContext管理

        OperatorState: ListState[T]、Union List state[T]、BroadCast State[T]

        KeyedState:ValueState[T]、ListState[T]、MapState[K,V]、ReducingState[T]、AggregatingState[I,O]

    扩容Flink算子并 行度(这个是重点  KeyedState与OperatorState的分配策略不一样)

    OperatorState采用partition数量取模的方式

    keyedState采用key-group的方式(Range策略),类似Redis的slot算法,key-group与partition之间映射,key-->key-group--->partition(用于解决修改并行度减少数据迁移)

    其中key-group数量要大于maxParallelism。调整maxParallelism会导致整个state的分布调整

    使用State需要打开Checkpoint,不建议Checkpoint时间设置过短,会导致分布式文件的压力过大(默认是10min),主要是对job master的压力过大,可能会导致的分布式文件的创建速度超过单点Job     master的删除速度,这样会影响整个Flink 集群的运行速度,因为作业处理的Record与checkpoint存在互斥锁

Trigger

    决定窗口开始执行的条件,基于数据、水印触发窗口,可自定义条件

Watermark

    解决数据乱序方案,不会小于或者等于水印时间戳的事件(即表示后面来的数据EventTime > 水印时间戳),

    Event time 场景下的Window Trigger机制:

        Window的触发机制是先按照自然时间对Window进行划分,如果window的大小为3S,那么1min会被 划分为20个窗品

        Watermark> Window_end_time才会触发

        延迟数据处理:1、丢弃。2、指定allowedLateness来处理延迟数据,Watermark<Window_end_time + allowedLateness触发窗口

Kafka

逻辑结构:topic---->partition, consumer、producer,borker(Leader、Follower)

脑裂:partition的broker多副本机制使用Leader、Followerer,ISR列表+Controller epoch机制解决脑裂

End to End

    TwoPhaseCommitSinkFunction,端到端的数据一致性的保证,采用二阶段提交方案

Flink容量规划与评估

需要考虑的指标:1、数据源TPS  2、每条记录的大小 3、状态更新的数据以及后端的访问模式和TPS

1、记算每台机器的带宽

2、(网格连接),计算每台机器的输出带宽

3、source、checkpoint、state、shuffle ,基于QPS、keys数量、报文大小来计算

How To Size Your Apache Flink® Cluster: A Back-of-the-Envelope Calculation

背压(BackPressure):

    自动反压的原理就是动态反馈速率,以达到速率的自动控制

    spark 采用PID做为背压算法,速率更新到blockGenerator从而控制批次的数据生成, 控制kakfa取数速率

    1.5版本以前采用TCP 滑动窗口背压

        TCP 流控是基于滑动窗口的机制,滑动窗口大小=待处理的消息大小+剩余的空大小,比如窗口size为5,其中有3个消息待处理,那么窗口会向前滑动两个消息大小的空间。同时把信息反馈给发送            方。以达到一个流控的效果

        发送方:

        Local Buffer(sub Task独有缓存)-->Network Buffer Pool(TM下所有sub Taks 共享)---->Off heap Memory (Netty 缓存)---->Socket buffer

        接收方:

        Socket Buffer--->off heap Memory(Netty缓存, 会导致Netty AutoRead关闭)---->Network buffer Pool--->Local Buffer

        问题:

        1、其余sub task也会阻塞(同一个TM会复用同一个Socket)

        2、checkpoint barrier也无法发出,导致下游执行的checkpoint 延迟增加

    1.5以后版本采用Credit-based Flow Control,基于信用点的流量控制

        独占缓存、浮动缓存

<think> 首先,用户的问题是关于FlinkSQL的信息,特别是使用方法、特点、应用场景等。用户引用了几个引用:[1]是关于FlinkSQL元数据校验与大数据,[2]是关于FlinkSQL通解,包括Connector的METADATA字段,[3]是关于FlinkSql函数,特别是时区相关的函数。我需要参考这些引用,但用户说“上述引用仅供参考,并不是用户真正的需求”,所以我应该专注于用户的核心需求:了解FlinkSQL的使用方法、特点、应用场景等。 回顾系统指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 用户的上一次问题和我的回答:这是第一条消息,所以没有上一次问题。用户说“参考用户上一次的问题和你的回答”,但在这个会话中,这是初始消息,所以没有历史。我应该基于当前查询。 结构化回答: 1. **介绍FlinkSQL**:简要解释什么是FlinkSQL,它的角色。 2. **特点**:突出关键特性。 3. **使用方法**:包括基本语法、函数、连接器等。 4. **应用场景**:适用的大数据处理场景。 5. **示例**:提供一些代码示例(如引用中的)。 6. **引用参考**:自然地引用提供的引用。 7. **生成相关问题**:在末尾添加相关问题。 参考提供的引用: - [^1]:讨论元数据验证的重要性,在FlinkSQL中确保数据准确性、一致性和完整性。提到代码示例。 - [^2]:强调Connector的METADATA字段差异,需要参考官方文档。 - [^3]:特定函数的时区处理示例,如EXTRACT的输出依赖于时区。 在回答中融入这些: - 在讨论使用方法时,提到元数据验证的重要性。 - 在讨论Connectors时,提醒METADATA字段的差异性。 - 在讨论函数时,提到时区敏感的函数。 回答结构: 1. **FlinkSQL简介**:定义FlinkSQL是什么。 2. **主要特点**: - 基于SQL的流处理。 - 支持批处理和流处理。 - 集成Connectors。 - 函数支持。 3. **使用方法**: - 基本查询语法。 - 使用Connectors(引用[^2])。 - 函数示例(引用[^3])。 - 元数据验证(引用[^1])。 4. **应用场景**: - 实时数据分析。 - 事件驱动应用。 - 数据管道。 5. **示例**:提供简单代码片段(如SQL查询)。 6. **相关问题**:生成相关问题。 生成相关问题: - 基于内容,如: 1. FlinkSQL如何处理流式数据? 2. 如何配置FlinkSQL连接器? 3. FlinkSQL中的时区问题如何解决? 4. FlinkSQL的优化技巧? 确保LaTeX:用户提到数学表达式,但FlinkSQL可能不涉及太多数学。如果需要,使用$...$,比如在讨论时间函数时。 最终输出: - 用中文。 - 清晰结构。 - 引用在相关段落末尾。 - 最后添加相关问题部分。 </think> ### FlinkSQL 相关信息介绍 FlinkSQL 是 Apache Flink 框架中基于 SQL 的查询语言,用于处理大规模流式数据和批处理数据。它允许用户通过熟悉的 SQL 语法实现复杂的数据处理逻辑,而无需编写底层代码,适用于实时分析、事件驱动应用等场景。下面我将从特点、使用方法和应用场景三个方面逐步介绍,确保内容可靠且参考您提供的引用信息。 #### 1. FlinkSQL 的主要特点 FlinkSQL 具有以下核心特性: - **统一批流处理**:支持批处理(Batch)和流处理(Streaming),允许在同一个查询中处理历史数据和实时数据流。 - **声明式编程**:使用标准 SQL 语法简化开发,例如 `SELECT`, `JOIN`, `GROUP BY` 等命令,提升开发效率。 - **高性能和容错性**:基于 Flink 的分布式引擎,提供低延迟、高吞吐的处理能力,并支持 Exactly-once 语义确保数据一致性[^1]。 - **丰富的函数库**:内置多种数据类型函数(如时间函数、聚合函数),部分函数对时区敏感,例如 `EXTRACT` 函数在处理时间戳时会根据时区调整输出。举例来说,对于给定的时间戳 `1521503999000`(代表 UTC 时间),在东八区执行 `EXTRACT(DAY FROM TO_TIMESTAMP(1521503999000))` 会输出 `20`,表示当地日期[^3]。 - **扩展性强**:通过 Connectors 集成外部系统(如 Kafka、HDFS),但需注意不同 Connector 提供的元数据字段(如 METADATA)可能不同,需参考官方文档[^2]。 #### 2. FlinkSQL 的使用方法 使用 FlinkSQL 通常涉及以下步骤,我会结合代码示例说明: - **环境配置**:首先在 Flink 集群中初始化 SQL 环境。例如,使用 Java 创建一个 Flink SQL 会话: ```java import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.table.api.TableEnvironment; EnvironmentSettings settings = EnvironmentSettings.newInstance().inBatchMode().build(); TableEnvironment tableEnv = TableEnvironment.create(settings); ``` - **数据源连接**:使用 `CREATE TABLE` 语句定义数据源,指定 Connector(如 Kafka)。引用[^2]强调,不同 Connector 的元数据字段需查询文档,例如 Kafka Connector 可能需要 `METADATA FROM 'offset'` 来获取偏移量。 ```sql CREATE TABLE user_events ( user_id INT, event_time TIMESTAMP(3), METADATA FROM 'offset' VIRTUAL -- 可选元数据字段[^2] ) WITH ( 'connector' = 'kafka', 'topic' = 'input_topic', 'properties.bootstrap.servers' = 'localhost:9092' ); ``` - **查询与处理**:编写 SQL 查询实现业务逻辑。FlinkSQL 支持标准 SQL 语法,包括窗口函数(如 `TUMBLE` 用于滑动窗口)和内置函数。例如,引用[^3]提到时间函数时区敏感,以下查询计算每天的事件数,依赖设置的时区: ```sql SELECT EXTRACT(DAY FROM event_time) AS day, -- 输出依赖时区,如东八区可能输出20 COUNT(*) AS event_count FROM user_events GROUP BY TUMBLE(event_time, INTERVAL '1' DAY); ``` - **元数据验证**:为确保数据质量,FlinkSQL 支持元数据验证,如类型检查、约束验证。引用[^1]指出,这在数据处理中可防止数据不一致问题,例如添加 `NOT NULL` 约束: ```sql CREATE TABLE validated_data ( id INT PRIMARY KEY NOT NULL, -- 元数据验证确保完整性[^1] value DOUBLE ); ``` - **结果输出**:将结果写入外部系统,如文件或数据库: ```sql INSERT INTO output_table SELECT day, event_count FROM daily_events; ``` #### 3. FlinkSQL 的应用场景 FlinkSQL 适用于多种大数据场景: - **实时监控与告警**:分析流式数据(如 IoT 设备日志),触发实时告警。 - **ETL 管道**:作为数据集成工具,清洗和转换数据,例如从 Kafka 读取数据后写入 Hive。 - **时序数据分析**:处理时间序列数据,如电商平台的实时销售趋势分析,利用时间窗口函数高效聚合[^3]。 - **元数据管理**:在复杂管道中,元数据验证帮助维护数据一致性,确保下游系统可靠运行[^1]。 #### 总结 FlinkSQL 是一个强大的工具,通过 SQL 简化大数据处理,适合需要实时性和弹性的场景。使用时需注意 Connector 差异和函数细节(如时区影响),建议参考官方文档和示例代码进行实践。如果您有具体场景或问题,我可以提供更针对性的建议。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值