3. 开发环境搭建:JDK、Maven、Flink集群与第一个WordCount程序
本章将引导你从零搭建一套完整的Flink流处理开发环境,涵盖JDK、Maven、Flink集群(Standalone与YARN模式)以及IDE的配置,并通过经典的WordCount程序验证环境可用性。环境版本选择遵循生产级稳定性原则,避免使用过新或过旧的组件。
3.1 环境版本矩阵与选型说明
以下为本次教程推荐的组件版本及其选型理由,建议严格对齐以避免兼容性问题:
| 组件 | 推荐版本 | 选型理由 |
|---|---|---|
| JDK | 1.8.0_202 (8u202) 或 11.0.18+ | Flink 1.14+ 对JDK 8/11支持最稳定;JDK 8建议使用最后免费商用版本8u202 |
| Maven | 3.6.3 或 3.8.8 | 3.6.x/3.8.x 与Flink shade插件兼容性最佳;3.9+ 可能触发依赖解析异常 |
| Flink | 1.14.6 或 1.17.2 | 1.14为长期维护版,1.17为最新稳定版;两者均支持Standalone与YARN部署 |
| Hadoop (YARN) | 3.2.4 或 3.3.6 | Flink on YARN需要Hadoop客户端;3.2.x/3.3.x 均通过官方认证 |
| IDE | IntelliJ IDEA 2023.2+ | 社区版免费且对Maven/Scala/Flink插件支持完善 |
版本对齐提示: 若使用Flink 1.17,建议搭配JDK 11 + Maven 3.8.8;若使用Flink 1.14,JDK 8 + Maven 3.6.3 是经过大量生产验证的组合。
3.2 JDK与Maven安装配置
3.2.1 JDK安装与环境变量
- 下载JDK: 从Oracle Archive或Adoptium获取JDK 8u202或JDK 11.0.18的tar.gz包。
- 解压至指定目录:
sudo tar -zxf jdk-8u202-linux-x64.tar.gz -C /usr/local/ - 配置环境变量: 编辑
/etc/profile或~/.bashrc,添加以下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_202
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- 验证安装: 执行
java -version,输出应显示1.8.0_202或11.0.18。
3.2.2 Maven安装与仓库配置
- 下载Maven: 从Apache官网获取
apache-maven-3.8.8-bin.tar.gz。 - 解压并配置环境变量:
export MAVEN_HOME=/usr/local/apache-maven-3.8.8
export PATH=$MAVEN_HOME/bin:$PATH
- 配置阿里云镜像(国内加速): 修改
$MAVEN_HOME/conf/settings.xml的<mirrors>段:
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
- 验证:
mvn -version输出应包含Maven版本及Java版本信息。
3.3 Flink集群部署:Standalone与YARN模式
Flink支持多种部署模式,本教程重点覆盖Standalone(单机/集群)和YARN(资源托管)两种模式。下图展示了两种模式的架构差异:
3.3.1 Standalone模式部署步骤
- 下载Flink:
wget https://archive.apache.org/dist/flink/flink-1.14.6/flink-1.14.6-bin-scala_2.12.tgz - 解压:
tar -zxf flink-1.14.6-bin-scala_2.12.tgz -C /opt/ - 配置JobManager: 编辑
/opt/flink-1.14.6/conf/flink-conf.yaml,设置:
jobmanager.rpc.address: localhost
jobmanager.rpc.port: 6123
jobmanager.memory.process.size: 1600m
taskmanager.memory.process.size: 2048m
taskmanager.numberOfTaskSlots: 4
parallelism.default: 2
- 启动集群:
/opt/flink-1.14.6/bin/start-cluster.sh - 验证: 访问
http://localhost:8081查看Web UI,确认JobManager与TaskManager均处于Running状态。
3.3.2 YARN模式部署配置
- 确保Hadoop环境就绪:
hadoop version输出正常,且YARN ResourceManager已启动。 - 配置Flink on YARN: 设置环境变量
export HADOOP_CLASSPATH=$(hadoop classpath),并将此命令加入~/.bashrc。 - 提交Flink会话到YARN:
/opt/flink-1.14.6/bin/yarn-session.sh -n 2 -tm 2048 -s 2 -d
参数说明:-n 2 启动2个TaskManager;-tm 2048 每个TaskManager分配2GB内存;-s 2 每个TaskManager分配2个Slot;-d 后台运行。
- 验证: 通过YARN ResourceManager Web UI(默认
http://localhost:8088)查看Flink会话的Application状态。
YARN模式常见问题: 若提交时提示
ClassNotFoundException: org.apache.hadoop.yarn.conf.YarnConfiguration,请检查 HADOOP_CLASSPATH 是否完整包含所有Hadoop依赖jar包。
3.4 IDE配置与Maven项目骨架
3.4.1 IntelliJ IDEA配置
- 安装Scala插件: 如果使用Scala API,需在
Settings → Plugins中搜索并安装 Scala 插件。 - 配置JDK:
File → Project Structure → SDKs,添加JDK 8或11。 - 配置Maven:
Settings → Build, Execution, Deployment → Build Tools → Maven,设置Maven home path为/usr/local/apache-maven-3.8.8,并勾选Always update snapshots。
3.4.2 创建Flink Maven项目
使用Maven Archetype快速生成项目骨架:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.14.6 \
-DgroupId=com.realtime.feature \
-DartifactId=flink-wordcount \
-Dversion=1.0-SNAPSHOT \
-Dpackage=com.realtime.feature.wordcount \
-DinteractiveMode=false
生成后的项目结构如下:
flink-wordcount/
├── pom.xml
└── src/
└── main/
├── java/
│ └── com/realtime/feature/wordcount/
│ ├── StreamingJob.java
│ └── BatchJob.java
└── resources/
└── log4j.properties
3.5 第一个Flink程序:流式WordCount
以下代码实现一个完整的流式WordCount程序,从socket读取文本流,实时统计单词出现次数:
package com.realtime.feature.wordcount;
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 StreamingJob {
public static void main(String[] args) throws Exception {
// 1. 创建流执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 2. 从socket读取数据流(nc -lk 9999)
DataStream<String> textStream = env.socketTextStream("localhost", 9999);
// 3. 转换:切分单词 -> 映射为 (word, 1) -> 按word分组 -> 累加计数
DataStream<Tuple2<String, Integer>> wordCounts = textStream
.flatMap(new Tokenizer())
.keyBy(value -> value.f0)
.sum(1);
// 4. 打印结果到控制台
wordCounts.print();
// 5. 执行任务
env.execute("Streaming WordCount");
}
// 自定义FlatMapFunction:将每行文本切分为单词,输出 (word, 1)
public static class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
String[] words = value.toLowerCase().split("\\W+");
for (String word : words) {
if (word.length() > 0) {
out.collect(new Tuple2<>(word, 1));
}
}
}
}
}
3.6 程序运行与验证
3.6.1 启动数据源
在终端启动netcat作为数据源:
nc -lk 9999
3.6.2 提交作业到Flink集群
Standalone模式:
mvn clean package -DskipTests
/opt/flink-1.14.6/bin/flink run target/flink-wordcount-1.0-SNAPSHOT.jar
YARN模式:
mvn clean package -DskipTests
/opt/flink-1.14.6/bin/flink run -m yarn-cluster -yjm 1024 -ytm 2048 target/flink-wordcount-1.0-SNAPSHOT.jar
3.6.3 验证结果
在netcat终端输入以下文本:
hello flink
hello world
flink streaming wordcount
Flink TaskManager的控制台输出应类似:
(hello,1)
(flink,1)
(hello,2)
(world,1)
(flink,2)
(streaming,1)
(wordcount,1)
验证要点: 注意
hello 和 flink 的计数随着新行输入而递增,说明流处理状态正确维护了累加器。若计数始终为1,请检查 keyBy 逻辑或并行度设置。
3.7 环境搭建检查清单
使用下表快速确认所有组件是否就绪:
| 检查项 | 验证命令/操作 | 预期结果 |
|---|---|---|
| JDK | java -version |
显示 1.8.0_202 或 11.0.18 |
| Maven | mvn -version |
显示 3.6.3 或 3.8.8 |
| Flink Standalone | jps 或 Web UI :8081 |
StandaloneSessionClusterEntrypoint + TaskManagerRunner |
| Flink YARN | yarn application -list |
显示 Flink 会话 Application |
| WordCount 作业 | Flink Web UI → Jobs | 作业状态为 RUNNING,输出正确计数 |