Flink 简介和简单的demo

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

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

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

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

  1. 引入依赖
    首先需要在项目的pom.xml(如果是 Maven 项目)中添加 Flink 相关依赖,示例如下:

登录后复制

xml 复制代码
<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. 编写代码

登录后复制

java 复制代码
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");
    }
}

在上述代码中:

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

请注意:

  • 上述只是一个非常基础的示例,实际应用中,数据源往往会是从外部系统(如消息队列、文件系统持续读取等)获取实时数据。
  • 代码中的 Flink 版本号可根据实际需求和项目兼容性进行调整。
相关推荐
Elastic 中国社区官方博客1 小时前
你的 AI agent 不需要你的 API 密钥:使用 OAuth 2.1 对 Elasticsearch MCP 服务器进行身份验证
大数据·运维·人工智能·elasticsearch·搜索引擎·全文检索
Json____5 小时前
五金制品行业-企业官网源码
java·大数据·数据库·企业站·wwwoop.com
黄焖鸡能干四碗5 小时前
信息安全保障方案(Word文件)
大数据·网络·人工智能·架构·区块链
大东(AIP内容运营专员)6 小时前
我用 OPC 模式运营一年多的AI产品
大数据·人工智能
互联网中的一颗神经元7 小时前
ZZ — Git 速查表
大数据·git·elasticsearch
roman_日积跬步-终至千里7 小时前
【Spark与SQL网关(1)】Spark 提交模式与 Spark Thrift Server:到底在“提交”什么
大数据·sql·spark
汽车仪器仪表相关领域8 小时前
SIRIUS R1DB/R2DB便携式一体化数据采集系统
大数据·人工智能·功能测试·深度学习·压力测试
C++、Java和Python的菜鸟17 小时前
第2章 项目前置课-代码版本控制Git
大数据·elasticsearch·搜索引擎
Sammyyyyy18 小时前
如何在不停项目不停机的情况下切换AI大模型
大数据·人工智能