MAC安装Flink单机

brew install apache-flink
/opt/homebrew/Cellar/apache-flink/1.13.1/libexec/bin/start-cluster.sh
http://localhost:8081/

提交word count到本地Flink

flink run -c com.cordell.SocketTextStreamWordCount /Users/leiwang/IdeaProjects/demo/target/demo-1.0-SNAPSHOT.jar 127.0.0.1 9000

Flink的集群架构

image.png

jobManager

image.png

TaskManager

image.png

Client

image.png

jobGraph

image.png

Flink集群部署模式

根据两种条件讲部署模式分为三种类型:

  1. 集群的生命周期和资源隔离
  2. 根据程序的main()方法执行在client还是在jobManager
  • Session Mode
    • 共享jobManager和TaskManager,所有提交的job都在一个runtime中运行。
  • Per-job Mode
    • 独享的jobManager与TaskManager,好比为每个job单独启动一个Runtime。
  • Application Mode(1.11版本提出)
    • Application的main()运行在flink的Cluster上,不在客户端。
    • 每个Application对应一个Runtime,Application中可以含有多个Job。

      Session集群运行模式

image.png

Per-job运行模式

image.png

Session集群和Per-job类型集群问题

image.png

Application Mode集群运行模式

image.png

Flink集群部署 Cluster Management支持

image.png
image.png

Native集群

image.png

Standalone(多机)部署

image.png

Yarn集群架构原理

image.png

Flink On Yarn Session

image.png
Flink On Yarn Per-job
image.png
Flink on Yarn优劣
image.png

分布式流处理模型(DataFlow)

image.png

DataStream API

API介绍

image.png

Flink DataStream程序实例

image.png

StreamExecutionEnvironment

image.png

DataStream数据源

image.png

DataStream基本数据源

image.png

Kafka连接器

import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011;

import java.util.Properties;

public class FlinkDemo {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

  1. Properties props = new Properties();<br /> props.put("bootstrap.servers", "localhost:9092");<br /> props.put("zookeeper.connect", "localhost:2181");<br /> props.put("group.id", "metric-group");<br /> props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); //key 反序列化<br /> props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");<br /> props.put("auto.offset.reset", "latest"); //value 反序列化
  2. DataStreamSource<String> dataStreamSource = env.addSource(new FlinkKafkaConsumer011<>(<br /> "metric", //kafka topic<br /> new SimpleStringSchema(), // String 序列化<br /> props)).setParallelism(1);<br /> //kafka生产者<br />// FlinkKafkaProducer011<String> flinkKafkaProducer = new FlinkKafkaProducer011<>(<br />// "metric"<br />// ,new SimpleStringSchema()<br />// ,props);<br />// dataStreamSource.addSink(flinkKafkaProducer);
  3. dataStreamSource.print(); //把从 kafka 读取到的数据打印在控制台<br /> env.execute("Flink add data source");<br /> }<br />}

DataStream主要转换操作

image.png
image.png

理解KeyedStream

image.png

DataStream之间的转换

image.pngimage.png

物理分组操作

image.png

Flink中的时间类型

image.png
image.png

基于Event Time处理数据

image.png

Watermark

image.png
Watermark是一种告诉Flink一个消息延迟多少的方式。它定义了什么时候不再等待更早的数据。
可以把Watermarks理解为一个水位线,这个Watermarks在不断的变化。Watermark实际上作为数据流的一部分随数据流流动。
当Flink中的运算符接收到Watermarks时,它明白早于该时间的消息已经完全抵达计算引擎,即假设不会再有时间小于水位线的事件到达。
这个假设是触发窗口计算的基础,只有水位线越过窗口对应的结束时间,窗口才会关闭和进行计算。

并行中的Watermark

image.png

Watermark与window之间的关系(Append Mode)

image.png

Watermark与Window之间的关系(Update Mode)

image.png

Watermark使用总结

image.png

Watermark Generator

Two Styles of Watermark Generation

image.png

Timestamp Assign与Watermark Generate

image.png

Timestamp Assign与Watermark Generate

image.png

PeriodicWatermarks定义

通过本方法设置水位线的获取
image.png

PunctuatedWatermarks定义

image.png

Source Functions with Timestamps and Watermarks

在定义source的run方法里制定timestamps和watermarks的获取
image.png

Watermark Strategies介绍

image.png

Using Watermark Strategies

image.png

Watermark Strategies and the Kafka Connector

image.png

Writing WatermarkGenerators

image.png

Periodic WatermarkGenerator Define

image.png

Punctuated WatermarkGenerator

image.png

Watermark总结

image.png

窗口计算

为什么需要窗口计算

image.png
image.png
image.png

Window应用场景

image.png

Window抽象概念

image.png

Windows编程接口

Keyed Windows

image.png

Non-Keyed WIndows

image.png

Window Assigner

image.png

Flink中的窗口类型

image.png

Sliding Window滑动窗口

image.png

Tumbliing Window滚动窗口

image.png

Session Window

image.png

Global Window

image.png

Flink内置的windows

Predefined Keyed Windows

image.png

Predefined Keyed Windows实例

image.png

Predefined Non-keyed Windows

image.png

Window Trigger

image.png

触发机制

水位线触发

image.png
当时间进入后,算出waterMark大于算子中的waterMark,就会将12.00-12.05的窗口数据进行汇总。
image.png

指定时间触发

image.png
当事件中的间隔时间大于制定时间就会触发窗口的输出
image.png
image.png
12.03对于上一个12.04 没有触发两分钟的设置值,而且没有触发更新Watermark,所以不会参与窗口计算。
image.png
12.08进入以后触发更新水位,同时为更新模式,会把12.03的记录更新到上一个窗口。
image.png

Window Evictor 数据清除器

image.png
image.png
image.png
image.png

Window Function

image.png

Window AggregateFunction

image.png

WIndowProcessFunction

image.png

WindowFunction分类

image.png

ReduceFunction

image.png

AggregateFunction实例

image.png

Predefined Aggregations

image.png

ProcessWindowFunction定义

image.png

ProcessWindowFunction

image.png

多流合并

image.png