Flink入门知识点有哪些

发布时间:2021-12-31 13:57:37 作者:iii
来源:亿速云 阅读:215
# Flink入门知识点有哪些

## 一、Flink概述

### 1.1 什么是Flink
Apache Flink是一个开源的**分布式流处理框架**,最初由柏林工业大学开发,后成为Apache顶级项目。它能够处理**有界(batch)和无界(stream)数据流**,提供高吞吐、低延迟的计算能力,并保证Exactly-Once的精确一次处理语义。

核心特点:
- **事件驱动型架构**:基于事件触发计算
- **状态管理**:内置完善的分布式状态管理机制
- **容错机制**:通过Checkpoint和Savepoint实现故障恢复
- **多语言支持**:支持Java/Scala/Python等API

### 1.2 Flink vs 其他框架

| 特性        | Flink       | Spark       | Storm       |
|------------|-------------|-------------|-------------|
| 处理模型    | 流批一体    | 微批处理    | 纯流处理    |
| 延迟       | 毫秒级      | 秒级        | 毫秒级      |
| 状态管理   | 完善        | 有限        | 依赖外部    |
| 语义保证   | Exactly-Once| Exactly-Once| At-Least-Once|

## 二、核心架构

### 2.1 运行时架构
```mermaid
graph TD
    Client -->|提交作业| JobManager
    JobManager -->|任务分配| TaskManager
    TaskManager -->|状态反馈| JobManager

2.2 并行度(Parallelism)

env.setParallelism(4);  // 设置全局并行度
dataStream.map(...).setParallelism(2);  // 算子级设置

三、编程模型

3.1 基础API

DataStream API(流处理)

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

DataStream<String> text = env.socketTextStream("localhost", 9999);
DataStream<Tuple2<String, Integer>> counts = text
    .flatMap((String value, Collector<Tuple2<String, Integer>> out) -> {
        for (String word : value.split(" ")) {
            out.collect(new Tuple2<>(word, 1));
        }
    })
    .keyBy(0)
    .sum(1);

counts.print();
env.execute("WordCount");

DataSet API(批处理,已逐步被Table API替代)

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
DataSet<String> text = env.readTextFile("file:///path/to/file");

3.2 Table API & SQL

-- 注册表
tableEnv.executeSql("CREATE TABLE orders (...) WITH (...)");

-- SQL查询
Table result = tableEnv.sqlQuery(
  "SELECT product, SUM(amount) FROM orders GROUP BY product");

-- 转换为DataStream
DataStream<Row> resultStream = tableEnv.toDataStream(result);

四、状态管理与容错

4.1 状态类型

  1. Keyed State:与Key绑定的状态

    • ValueState
    • ListState
    • MapState
  2. Operator State:算子级别状态

    • ListState
    • BroadcastState

4.2 Checkpoint机制

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

// 每10秒做一次Checkpoint
env.enableCheckpointing(10000); 

// 精确一次语义
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

// Checkpoint超时时间
env.getCheckpointConfig().setCheckpointTimeout(60000);

4.3 Savepoint与恢复

# 触发Savepoint
flink savepoint <jobId> [targetDirectory]

# 从Savepoint恢复
flink run -s :savepointPath [:runArgs]

五、时间语义

5.1 三种时间概念

  1. Event Time:事件产生时间(最常用)
  2. Ingestion Time:进入Flink时间
  3. Processing Time:处理时间(服务器时间)

5.2 水位线(Watermark)

DataStream<Event> withTimestampsAndWatermarks = stream
    .assignTimestampsAndWatermarks(
        WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5))
            .withTimestampAssigner((event, timestamp) -> event.getTimestamp())
    );

5.3 窗口计算

窗口类型

窗口类型 说明
Tumbling 固定大小,不重叠
Sliding 固定大小,可重叠
Session 基于活动间隔
Global 全局窗口

示例代码

stream.keyBy(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.seconds(30)))
    .reduce(<reduce function>);

六、连接器(Connectors)

6.1 常用Source

6.2 常用Sink

6.3 Kafka连接示例

// Source
KafkaSource<String> source = KafkaSource.<String>builder()
    .setBootstrapServers("brokers:9092")
    .setTopics("input-topic")
    .setGroupId("my-group")
    .setValueOnlyDeserializer(new SimpleStringSchema())
    .build();

// Sink
stream.sinkTo(KafkaSink.<String>builder()
    .setBootstrapServers("brokers:9092")
    .setRecordSerializer(
        KafkaRecordSerializationSchema.builder()
            .setTopic("output-topic")
            .setValueSerializationSchema(new SimpleStringSchema())
            .build()
    )
    .build());

七、部署模式

7.1 部署方式对比

模式 适用场景 特点
Local 开发测试 单JVM进程
Standalone 小规模生产 自带资源管理
YARN 企业级部署 资源隔离好
Kubernetes 云原生环境 弹性伸缩
Docker 容器化部署 环境隔离

7.2 YARN部署示例

# 启动YARN session
./bin/yarn-session.sh -n 4 -jm 1024m -tm 4096m

# 提交作业
./bin/flink run -m yarn-cluster -yn 2 -yjm 1024 -ytm 2048 ./examples/WordCount.jar

八、性能调优

8.1 关键配置参数

# flink-conf.yaml 示例
taskmanager.numberOfTaskSlots: 4
parallelism.default: 8
state.backend: rocksdb
state.checkpoints.dir: hdfs://namenode:8020/flink/checkpoints

8.2 优化建议

  1. 资源分配

    • TaskManager内存 = JVM堆内存 + 堆外内存(网络缓冲)
    • 建议每个CPU核心分配1个Slot
  2. 状态后端选择

    • MemoryStateBackend:测试用
    • FsStateBackend:常规生产(文件系统)
    • RocksDBStateBackend:大状态场景
  3. 反压处理

    • 监控网络缓冲使用情况
    • 调整taskmanager.network.memory.fraction

九、监控与运维

9.1 监控指标

9.2 常用工具

  1. Flink Web UI:8081端口
  2. Prometheus + Grafana
    
    metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter
    metrics.reporter.prom.port: 9999
    
  3. 日志分析:ELK集成

十、典型案例

10.1 电商场景

flowchart LR
    Kafka[用户行为日志] --> Flink[实时计算]
    Flink --> Redis[实时大屏]
    Flink --> HBase[用户画像]
    Flink --> ES[实时搜索]

10.2 物联网(IoT)

DataStream<SensorReading> readings = env.addSource(new SensorSource());

// 每5秒计算平均温度
readings.keyBy(r -> r.sensorId)
    .timeWindow(Time.seconds(5))
    .process(new TemperatureAverager());

// 高温报警
readings.filter(r -> r.temperature > 50.0)
    .addSink(new AlertSink());

十一、学习资源推荐

  1. 官方文档https://flink.apache.org/
  2. GitHub示例:flink-examples模块
  3. 书籍
    • 《Stream Processing with Apache Flink》
    • 《Fink原理与实践》
  4. 实践平台
    • Katacoda Flink教程
    • AWS EMR Flink

总结:Flink作为新一代流处理引擎,其核心优势在于统一的批流处理、完善的状态管理和强大的时间语义支持。建议初学者从DataStream API入手,逐步掌握时间窗口、状态管理等核心概念,再结合实际业务场景进行深度实践。 “`

注:本文档约4000字,采用Markdown格式编写,包含代码示例、流程图和表格等元素。实际使用时可根据需要调整内容深度或补充具体案例细节。

推荐阅读:
  1. Flink入门wordCount
  2. Redux入门知识点有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

flink

上一篇:Mac端的SSH端工具electerm怎么用

下一篇:如何解决Window-wsl2-emacs与Windows程序文件I/O卡顿延迟问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》