每次先大致写下,后期写的多了在去调格式
目录
目录
2、测试实时代码时,可以先不写入到表中,先标准输出到界面中。
一、文档学习
flink 中时间语义:
①、Event Time:是事件创建的时间。例如采集的日志数据中,每一条日志都会记录自己的生成时间。
②、Ingestion Time:是数据进入Flink的时间。(ingestion 摄取进入)。
③、Processing Time(算子执行时的时间):是每一个执行基于时间操作的算子的本地系统时间,与机器相关,默认的时间属性就是Processing Time。
waterMark 水位线:
waterMark 特点: waterMark 是一种衡量 Event time进展的机制,所以 waterMark 必须是单调递增的。
waterMark = n 表示什么? 表示 在 n s 之前的数据已经全部到达了。
waterMark 是什么? waterMark 是 一个特殊的数据,并作为一个特殊的数据 插入到数据流中
waterMark 作用: waterMark 是用来处理乱序数据的,有乱序数据时,才会使用(正常顺序的,采用事件事件即可,因为正常顺序已经表示在 n s 之前的数据已经到达。)
举例:
比如设置的 waterMark 允许乱序时间(最大延迟到达时间)为 2s,则 waterMark = 事件时间 - 2s
二、官网学习
基于 flink 1.12
1、列属性中:计算列 Computed Columns :
计算列: 可以理解为 通过计算产生的一列。
解释: 文中说计算列 一般用来定义时间属性。
Event time 的介绍:
解释: 文中说的是 事件时间 是可以基于每条记录的时间戳(topic 中最后一列有这个字段)。
一般来说 WaterMark 是基于事件时间来产生的。
CREATE TABLE user_actions (
user_name STRING,
data STRING,
user_action_time TIMESTAMP(3),
-- declare user_action_time as event time attribute and use 5 seconds delayed watermark strategy
WATERMARK FOR user_action_time AS user_action_time - INTERVAL '5' SECOND
) WITH (
...
);
SELECT TUMBLE_START(user_action_time, INTERVAL '10' MINUTE), COUNT(DISTINCT user_name)
FROM user_actions
GROUP BY TUMBLE(user_action_time, INTERVAL '10' MINUTE);
TIMESTAMP(3) 这个是什么意思? 也是一个函数?
Process time 的介绍:
CREATE TABLE user_actions (
user_name STRING,
data STRING,
user_action_time AS PROCTIME() -- declare an additional field as a processing time attribute
) WITH (
...
);
SELECT TUMBLE_START(user_action_time, INTERVAL '10' MINUTE), COUNT(DISTINCT user_name)
FROM user_actions
GROUP BY TUMBLE(user_action_time, INTERVAL '10' MINUTE);
解释:
PROCTIME()
是一个函数。 使用 ** AS PROCTIME()
这样的格式就是把某某字段作为一个处理时间列。然后使用时,滚动窗口中使用的时间列就是 ** 所对应的时间列。(user_action_time 是随意定义的一个列,以便后面使用。 )
2、测试实时代码时,可以先不写入到表中,先标准输出到界面中。
注意:
主要用于调试。
Apache Flink 1.12 Documentation: Print SQL 连接器
CREATE TABLE print_table (
f0 INT,
f1 INT,
f2 STRING,
f3 DOUBLE
) WITH (
'connector' = 'print'
)
查看 print 输出的数据:
3、upsert kafka
主要是为了保证数据一致性。
Apache Flink 1.12 Documentation: Upsert Kafka SQL 连接器
CREATE TABLE pageviews_per_region (
user_region STRING,
pv BIGINT,
uv BIGINT,
PRIMARY KEY (user_region) NOT ENFORCED
) WITH (
'connector' = 'upsert-kafka',
'topic' = 'pageviews_per_region',
'properties.bootstrap.servers' = '...',
'key.format' = 'avro',
'value.format' = 'avro'
);
CREATE TABLE pageviews (
user_id BIGINT,
page_id BIGINT,
viewtime TIMESTAMP,
user_region STRING,
WATERMARK FOR viewtime AS viewtime - INTERVAL '2' SECOND
) WITH (
'connector' = 'kafka',
'topic' = 'pageviews',
'properties.bootstrap.servers' = '...',
'format' = 'json'
);
-- 计算 pv、uv 并插入到 upsert-kafka sink
INSERT INTO pageviews_per_region
SELECT
user_region,
COUNT(*),
COUNT(DISTINCT user_id)
FROM pageviews
GROUP BY user_region;