用 Java 开发 Apache Flink 程序 是目前最主流的方式之一(Flink 本身就是用 Scala + Java 写的),DataStream API(流处理)和 Table API/SQL 都支持 Java,而且文档和社区资源最丰富。
下面一步步教你怎么上手(基于 2026 年最新 Flink 2.x 系列,兼容性很好):
1. 环境准备(必须的)
- JDK:11 或 17(推荐 17,Flink 2.x 支持很好)
- Maven:3.6+(或 Gradle)
- IDE:IntelliJ IDEA 推荐(内置 Maven 支持超好),Eclipse 也行
- 可选:本地安装 Flink(用于提交 job 测试),但开发阶段可以直接在 IDE 里跑
2. 最快方式:用 Maven 骨架生成项目(官方推荐)
在命令行运行下面命令(会自动生成一个标准 Flink Java 项目):
Bash
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=2.2.0 # 改成你想用的版本,最新是 2.2.x
- 它会问你 groupId、artifactId、package 等,按需填(比如 groupId=com.example,artifactId=flink-demo)
- 生成后进项目目录:cd flink-demo
项目结构大概长这样:
text
src/main/java/com/example/
├── StreamingJob.java ← 流处理模板
└── BatchJob.java ← 批处理模板(现在很少用)
3. 最简单的 Hello World 示例(流处理版)
直接替换 StreamingJob.java 里的内容为下面这个超级简单的例子(把数字翻倍并打印):
Java
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
public class StreamingJob {
public static void main(String[] args) throws Exception {
// 1. 创建执行环境(本地模式自动)
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 2. 从内存创建数据源(模拟无限流)
DataStream<Integer> numbers = env.fromElements(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 3. 简单 transformation:每个数 × 2
DataStream<Integer> doubled = numbers.map(n -> n * 2);
// 4. 输出到控制台
doubled.print();
// 5. 执行(这行很重要!)
env.execute("My First Flink Java Job");
}
}
-
在 IntelliJ 里右键 → Run 'StreamingJob.main()' 就能跑
-
控制台会看到输出: text
2 4 6 ... 20
这就是最基础的 Flink Java 程序了!(数据进来 → 处理 → 输出)
4. 经典例子:WordCount(实时版,从 socket 读)
很多人第一个真实例子都用这个(监听本地 socket,统计单词):
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 SocketWordCount {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 从 socket 读(nc -lk 9999 发数据测试)
DataStream<String> text = env.socketTextStream("localhost", 9999);
DataStream<Tuple2<String, Integer>> wordCounts = text
.flatMap(new Splitter()) // 切分单词
.keyBy(0) // 按单词分组
.sum(1); // 累加计数
wordCounts.print();
env.execute("Socket Window WordCount");
}
public static class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) {
for (String word : sentence.split(" ")) {
out.collect(new Tuple2<>(word, 1));
}
}
}
}
- 测试方法:在终端新开窗口运行:nc -lk 9999
- 然后随便敲英文句子回车,Flink 控制台就会实时打印单词计数
5. 依赖管理(pom.xml 里通常长这样)
Flink 项目 pom.xml 核心部分:
XML
<dependencies>
<!-- 核心依赖(根据需要选一个或多个) -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>2.2.0</version>
</dependency>
<!-- 如果要用 Table/SQL -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.12</artifactId>
<version>2.2.0</version>
</dependency>
<!-- Kafka connector 示例 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka</artifactId>
<version>3.2.0-2.2</version> <!-- 注意版本匹配 -->
</dependency>
</dependencies>
6. 下一步推荐学什么
- 从简单到复杂:先掌握 DataStream → map/filter/flatMap → keyBy + window/sum/reduce → ProcessFunction(带状态)
- 连接真实数据源:Kafka(最常见)、文件、RabbitMQ、CDC 等
- Table API / SQL:写 SQL 做流处理(超级方便)
- 部署:打包成 fat-jar → ./bin/flink run -c com.example.StreamingJob your-job.jar
官方文档(强烈推荐):https://nightlies.apache.org/flink/flink-docs-stable/ 里面有 "Try Flink" → DataStream API 教程,Java 例子很全。