Apache Flink快速入门

7 阅读3分钟

Apache Flink 是一个开源的分布式流处理框架,支持实时和批处理,能够高效处理大规模数据流。以下内容用最简单的语言介绍Flink的核心基础知识,并配以示例代码,帮助初学者快速理解和上手开发。


1. 搭建环境

  • 运行环境:可以在本地电脑上运行,也可以部署到集群(Standalone、YARN、Kubernetes等)
  • 开发环境:推荐使用IntelliJ IDEA等IDE,项目中需添加Flink依赖,如flink-streaming-javaflink-clients

2. 创建执行环境

Flink程序的入口,负责管理整个作业的生命周期。

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

这句代码创建了一个执行环境,后续所有操作都基于它进行


3. 读取数据源(Source)

Flink支持多种数据输入方式:

  • 从集合读取(适合测试):
DataStream<String> dataStream = env.fromElements("a", "b", "c");
  • 从文本文件读取
DataStream<String> dataStream = env.readTextFile("路径/文件名.txt");
  • 从Kafka读取(适合实时流数据):

需要配置Kafka消费者参数,使用Flink Kafka Connector。

  • 自定义数据源:实现SourceFunction接口,灵活读取各种数据

4. 数据转换(Transformation)

常用算子(操作)包括:

  • map:对每条数据进行转换。
  • filter:筛选符合条件的数据。
  • flatMap:一条数据变成多条。
  • keyBy:根据某个字段分组。
  • window:基于时间或数量的窗口操作。
  • join:两个数据流关联。

示例:筛选以“sensor”开头的数据

DataStream<String> filtered = dataStream.filter(value -> value.startsWith("sensor"));

5. 状态管理与容错

Flink支持有状态计算,状态数据保存在Keyed State或Operator State中。通过Checkpoint机制实现容错,保证数据不丢失,且支持Exactly-once语义。

  • 开启Checkpoint,间隔10秒执行一次
env.enableCheckpointing(10000);
  • Checkpoint基于分布式快照算法,作业失败时可恢复到最近一次的状态

6. 使用Table API和Flink SQL

Table API提供类似SQL的查询方式,简化复杂数据处理。

  • 创建Table环境
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
  • 注册CSV文件为表
tableEnv.connect(new FileSystem().path("路径/数据.csv"))
        .withFormat(new Csv())
        .withSchema(new Schema()
            .field("id", DataTypes.STRING())
            .field("time", DataTypes.BIGINT())
            .field("temperature", DataTypes.DOUBLE()))
        .createTemporaryTable("sensorTable");
  • 执行SQL查询
Table result = tableEnv.sqlQuery("SELECT * FROM sensorTable WHERE id = 'sensor_1'");
  • 将查询结果转成DataStream并打印
DataStream<Row> resultStream = tableEnv.toAppendStream(result, Row.class);
resultStream.print();

Table API和SQL支持流批一体查询,底层使用Apache Calcite解析器


7. 输出数据(Sink)

Flink支持多种输出方式:

  • 控制台打印(调试用)
dataStream.print();
  • 写入文件、Kafka、数据库等,需使用对应的Connector。

8. 提交执行作业

最后启动Flink作业:

env.execute("Flink基础作业");

9. 完整示例:基于Socket的5秒窗口单词统计

这是一个经典的Flink流处理案例,统计每5秒内从网络端口输入的单词数量。

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

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

        // 从本地9999端口读取文本流
        DataStream<String> text = env.socketTextStream("localhost", 9999);

        // 拆分单词,转换成 (word, 1) 形式
        DataStream<Tuple2<String, Integer>> counts = text
            .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
                @Override
                public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
                    for (String word : value.split(" ")) {
                        out.collect(new Tuple2<>(word, 1));
                    }
                }
            })
            .keyBy(value -> value.f0) // 按单词分组
            .timeWindow(Time.seconds(5)) // 5秒滚动窗口
            .sum(1); // 统计单词出现次数

        // 打印结果
        counts.print();

        // 启动作业
        env.execute("Window WordCount");
    }
}

运行步骤

  1. 在终端运行命令启动监听端口:

    nc -lk 9999
    
  2. 在该终端输入单词并回车,Flink程序会每5秒输出一次统计结果


总结

Flink的核心开发流程:

  • 创建执行环境
  • 读取数据源(文件、Kafka、Socket等)
  • 使用算子进行数据转换(map、filter、window等)
  • 管理状态和容错(Checkpoint)
  • 使用Table API或SQL进行复杂查询
  • 输出处理结果
  • 提交并执行作业

通过这些步骤,可以快速搭建实时数据处理应用,满足大数据实时计算需求


以上内容结合了基础概念、代码示例和实用技巧,适合中国初学者快速理解Apache Flink的入门知识。更多高级功能如自定义函数、复杂事件处理、状态后端配置等,可参考官方文档和社区教程。