2. Flink 基础与环境搭建

在精算坏样本归因场景中,我们需要处理来自多个业务系统的实时保单、理赔与外部征信数据。Flink 作为流式计算引擎,能够以毫秒级延迟对数据流进行关联、聚合与规则判定。本章将系统讲解 Flink 的核心概念,并指导你完成本地开发环境的搭建。

2.1 Flink 核心概念

Flink 的编程模型围绕三个核心抽象展开:DataStream(数据流)、Operator(算子)和 Time(时间语义)。理解这三者是编写正确、高效的实时归因作业的前提。

2.1.1 DataStream:流式数据的核心抽象

DataStream 是 Flink 中对无限数据流的抽象表示。在精算坏样本归因中,每一条进入系统的保单变更、理赔申请或征信查询记录,都会被封装为 DataStream 中的一个事件。

概念 说明 精算场景示例
DataStream<T> 未分区的数据流,T 为事件类型 DataStream<PolicyEvent>
KeyedStream 按 key 分区的数据流,用于分组计算 按保单号 keyBy 后的理赔流
WindowedStream 在 KeyedStream 上开窗后的流 按 5 分钟滚动窗口统计出险次数
ConnectedStreams 连接两个不同数据类型的流 将保单流与征信流 connect 做关联
精算提示:在坏样本归因中,DataStream 的泛型类型建议使用 POJO(Plain Old Java Object)或 Flink 的 Tuple 类型,便于后续算子进行字段访问和序列化。

2.1.2 Operator:转换与处理逻辑的载体

Flink 提供了丰富的算子(Operator)用于对 DataStream 进行转换。在精算坏样本归因 pipeline 中,常用的算子包括:

  • map / flatMap:数据清洗与字段提取,例如将原始 JSON 解析为归因事件对象。
  • filter:过滤无效或非目标样本,例如只保留理赔金额大于阈值的记录。
  • keyBy:按保单号、客户 ID 或产品代码进行分组,为后续聚合做准备。
  • window:定义时间窗口(滚动、滑动、会话),用于计算窗口内的统计指标。
  • process:最灵活的算子,可访问状态、定时器和上下文信息,适合复杂归因逻辑。
  • connect / coMap:连接两个不同来源的流,实现保单与征信数据的实时关联。
归因场景算子链示例:
source (Kafka) → flatMap (解析) → filter (坏样本筛选) → keyBy (保单号) → window (5min) → process (归因规则引擎) → sink (结果表)

2.1.3 Time:事件时间、处理时间与摄入时间

时间是流处理的核心维度。Flink 支持三种时间语义,在精算坏样本归因中,事件时间(Event Time)是最常用的选择,因为它能准确反映业务发生时刻,不受处理延迟影响。

时间语义 定义 精算归因适用场景 注意事项
事件时间 事件实际发生的时间戳 理赔申请时间、保单生效时间 需处理乱序与延迟,配合 Watermark
处理时间 算子所在机器的系统时钟 实时监控告警、性能指标 结果不可复现,受系统负载影响
摄入时间 事件进入 Flink 源算子的时间 数据到达顺序敏感的统计 介于事件时间与处理时间之间
关键约束:在坏样本归因中,如果使用处理时间,当数据因网络延迟或重试而乱序到达时,归因结果将出现偏差。务必使用事件时间 + Watermark 机制保证准确性。
Flink 核心概念关系图:DataStream、Operator、Time Flink 核心概念关系图 DataStream Operator Time KeyedStream WindowedStream ConnectedStreams map / flatMap keyBy / window process / connect 事件时间 (Event Time) 处理时间 (Processing Time) 摄入时间 (Ingestion Time) 精算归因场景:DataStream 承载事件 → Operator 执行转换 → Time 控制窗口与准确性

2.2 本地开发环境搭建

我们将使用 Java 11 + Maven 作为主要技术栈,在本地搭建 Flink 开发环境。Scala 用户可参考对应配置,核心步骤一致。

2.2.1 环境依赖清单

组件 版本要求 验证命令 备注
JDK 11 或 17(推荐 11) java -version 需配置 JAVA_HOME 环境变量
Maven 3.6.3+ mvn -version 确保使用 Maven Wrapper 或全局安装
IDE IntelliJ IDEA 2022+ — 建议安装 Flink 插件辅助开发
Git 2.x git --version 用于版本管理与代码同步

2.2.2 创建 Flink Maven 项目

推荐使用 Maven Archetype 快速生成项目骨架,或手动创建 pom.xml。以下为手动创建的核心配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.insurtech.flink</groupId>
    <artifactId>bad-sample-attribution</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <flink.version>1.17.1</flink.version>
        <java.version>11</java.version>
        <scala.binary.version>2.12</scala.binary.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>${flink.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java</artifactId>
            <version>${flink.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients</artifactId>
            <version>${flink.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka</artifactId>
            <version>${flink.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.4.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals><goal>shade</goal></goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
版本选择说明:Flink 1.17 是当前长期支持(LTS)版本,与 Kafka 3.x 兼容性良好。如果生产环境使用 CDH 或自建 Kafka,请确认 flink-connector-kafka 版本与 Kafka broker 版本匹配。

2.2.3 项目目录结构与入口类

创建标准的 Maven 目录结构,并在 src/main/java 下编写 Flink 作业入口类:

package com.insurtech.flink.attribution;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;

public class BadSampleAttributionJob {
    public static void main(String[] args) throws Exception {
        // 1. 创建流执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 2. 设置时间语义为事件时间
        env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

        // 3. 从 Kafka 读取数据源(占位,后续章节细化)
        // DataStream<String> sourceStream = env.addSource(...);

        // 4. 定义 Watermark 策略(占位)
        // WatermarkStrategy<String> watermarkStrategy = ...;

        // 5. 执行作业
        env.execute("BadSampleAttributionJob");
    }
}
常见错误:在 Flink 1.12+ 中,setStreamTimeCharacteristic 方法已被标记为弃用,事件时间通过 WatermarkStrategy 隐式启用。上述代码仅为演示结构,后续章节将使用最新 API。

2.2.4 环境验证步骤

  1. 编译项目:在项目根目录执行 mvn clean package -DskipTests,确认 BUILD SUCCESS。
  2. 本地运行:在 IDE 中直接运行 BadSampleAttributionJob.main,观察控制台无异常抛出。
  3. 启动 Flink 集群(可选):下载 Flink 1.17.1 二进制包,执行 ./bin/start-cluster.sh,访问 http://localhost:8081 查看 Web UI。
  4. 提交作业:使用 ./bin/flink run -c com.insurtech.flink.attribution.BadSampleAttributionJob target/bad-sample-attribution-1.0-SNAPSHOT.jar 提交作业。
本地 Flink 开发环境搭建流程 本地 Flink 开发环境搭建流程 安装 JDK 11 安装 Maven 配置 IDE 创建 Maven 项目 编写入口类 mvn package 本地运行验证 提交到本地 Flink 集群 提示:所有依赖 scope 为 provided 的 jar 在本地运行时需手动添加到 classpath,或使用 flink-runner 插件

2.3 本章小结

  • DataStream 是 Flink 流处理的核心抽象,精算坏样本归因中所有事件都封装为 DataStream 中的元素。
  • Operator 提供了从简单转换到复杂状态管理的完整处理能力,归因 pipeline 由多个算子串联而成。
  • Time 语义的选择直接影响归因结果的准确性,事件时间 + Watermark 是生产环境的标配。
  • 本地开发环境基于 JDK 11 + Maven + Flink 1.17,通过标准 Maven 项目结构即可快速启动开发。