内容提要
本文介绍从零编写Flink WordCount应用:先安装Java和Maven,用Flink Maven Archetype创建项目,编写WindowWordCount类,从Socket读取数据,经flatMap拆分单词、keyBy分组、5秒滚动窗口、sum聚合后打印输出。运行时报NoClassDefFoundError需勾选包含provided依赖;最后演示编译打包、启动本地Flink集群及用flink run提交任务。
延伸解读
provided 依赖的作用与本地运行配置
文章指出 flink-streaming-java 和 flink-clients 的 scope 为 provided,因此不会被打包进 jar。这是因为 Flink 集群已内置这些核心依赖。在 IntelliJ IDEA 中直接运行时会报 NoClassDefFoundError,解决方法是在运行配置中勾选 Include dependencies with "Provided" scope。这提醒读者:本地调试与集群部署的类路径不同,需注意依赖范围。
窗口与聚合的语义:处理时间滚动窗口
示例使用 TumblingProcessingTimeWindows.of(Time.seconds(5)),即按处理时间每 5 秒切分一个滚动窗口,窗口之间不重叠。sum(1) 在每个窗口内对分组后的单词计数求和。文章通过时间线示例说明窗口如何划分,但未讨论事件时间、水位线或延迟数据,读者需注意该示例仅适用于简单的处理时间场景。
从本地运行到集群提交的关键步骤
要在本地 Flink 集群运行,需先修改 pom.xml 中的 mainClass 为 com.flink.demo.WindowWordCount,然后执行 mvn clean package 生成 jar。启动集群使用 ./bin/start-cluster.sh,提交任务使用 ./bin/flink run 指定 jar 路径。任务日志在 log/ 目录,Web UI 默认在 localhost:8081,停止集群用 stop-cluster.sh。这些步骤构成了完整的部署闭环。
Q&A
编写第一个Flink应用需要提前安装哪些软件?
需要安装Java(Java 8或Java 11)和Maven。此外建议使用IntelliJ IDEA来编写Java应用。
如何用Flink Maven Archetype快速创建Flink项目?
使用mvn archetype:generate命令,指定archetypeGroupId为org.apache.flink、archetypeArtifactId为flink-quickstart-java、archetypeVersion为1.12.0,并设置groupId、artifactId、version、package等参数,即可生成包含flink-streaming-java、flink-clients等依赖的项目。
WindowWordCount应用从Socket读取数据后,经过哪些处理步骤?
数据从Socket读取后,先通过flatMap算子(自定义Splitter类)将每行按空格拆分为单词并转换为(word,1)元组,然后用keyBy按单词分组,接着用5秒滚动窗口(TumblingProcessingTimeWindows)切分数据流,再用sum(1)对每个窗口内单词计数求和,最后用print输出结果。
在IntelliJ IDEA中运行Flink应用报NoClassDefFoundError错误如何解决?
原因是flink-streaming-java和flink-clients依赖的scope为provided,不会被打包到jar中。解决方法是在IntelliJ IDEA的运行配置中勾选“Include dependencies with "Provided" scope”。
如何将Flink WordCount应用编译打包并提交到本地集群运行?
首先修改pom.xml中的mainClass为com.flink.demo.WindowWordCount,然后执行mvn clean package编译打包,生成jar文件。接着下载并解压Flink,运行./bin/start-cluster.sh启动本地集群,最后使用./bin/flink run命令提交jar包运行任务。
Flink中的滚动窗口(TumblingProcessingTimeWindows)在WordCount示例中起什么作用?
它每5秒对数据流做一次切分,将不同时间到达的单词划分到不同的窗口中,从而分别统计每个5秒窗口内各单词出现的次数。