Flink 简介

Apache Flink 是一个开源的流处理框架,它具有高吞吐量、低延迟、精确一次(exactly-once)状态一致性等诸多优秀特性。

  • 流批一体:它能够以统一的方式处理流式数据和批量数据,既可以对实时持续流入的数据流进行高效处理,也可以像传统批处理那样对静态数据集进行操作,打破了流处理和批处理之间的界限。
  • 状态管理:提供了强大且易用的状态管理机制,允许在处理数据过程中保存和更新中间状态,方便实现诸如窗口聚合、复杂事件处理等功能,并且能保证状态的一致性,在遇到故障等情况时可以准确恢复状态。
  • 事件时间处理:很好地支持基于事件实际发生时间来进行处理,而不是数据到达系统的时间,这对于处理乱序数据等场景极为重要,能确保计算结果的准确性。
  • 灵活的窗口机制:拥有丰富多样的窗口类型,比如滚动窗口、滑动窗口、会话窗口等,可以根据不同的业务需求灵活地对数据进行分组和聚合操作。

Flink 在很多领域都有广泛应用,例如实时数据分析、实时监控告警、实时推荐系统等,能够助力企业快速、准确地处理海量实时数据并获取有价值的洞察。

Flink 简单 Demo 示例(使用 Java 语言基于 Flink 的 DataStream API,统计单词出现次数)

以下是一个简单的基于 Flink 的示例代码,展示了如何从一个文本流中统计单词出现的次数:

  1. 引入依赖
    首先需要在项目的pom.xml(如果是 Maven 项目)中添加 Flink 相关依赖,示例如下:
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-java</artifactId>
    <version>1.16.0</version>  <!-- 根据实际情况选择合适版本 -->
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-java_2.11</artifactId>
    <version>1.16.0</version>
</dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  1. 编写代码
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.util.Collector;

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

        // 从元素构建数据源,这里模拟一个简单的文本流(实际中可以对接如Kafka等数据源)
        DataStream<String> textStream = env.fromElements("hello world", "hello flink", "world flink");

        // 对文本流进行处理,先分割单词,再转换为(word, 1)的形式,便于后续统计
        DataStream<Tuple2<String, Integer>> wordAndOneStream = textStream.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
                String[] words = value.split(" ");
                for (String word : words) {
                    out.collect(Tuple2.of(word, 1));
                }
            }
        });

        // 按照单词进行分组,并对每组的计数进行求和,得到单词出现次数的统计结果
        DataStream<Tuple2<String, Integer>> wordCountStream = wordAndOneStream.keyBy(0).sum(1);

        // 输出结果到控制台
        wordCountStream.print();

        // 执行任务
        env.execute("WordCount Example");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

在上述代码中:

  • 首先通过StreamExecutionEnvironment.getExecutionEnvironment()创建了 Flink 的流处理执行环境。
  • 接着利用env.fromElements模拟了一个简单的文本数据流。
  • 通过flatMap操作对文本流中的每个元素(每行文本)进行单词分割,并将每个单词转换为(word, 1)的二元组形式。
  • 然后使用keyBy按照单词进行分组,再通过sum操作对每个分组内代表出现次数的数字(初始都是 1)进行求和,最终得到每个单词出现的次数统计结果,并且通过print输出到控制台。最后调用env.execute启动整个任务的执行。

请注意:

  • 上述只是一个非常基础的示例,实际应用中,数据源往往会是从外部系统(如消息队列、文件系统持续读取等)获取实时数据。
  • 代码中的 Flink 版本号可根据实际需求和项目兼容性进行调整。