05.flink给一个最简单的flink count的demo,然后使用推荐 Application 模式 + HDFS部署,,以及启动程序
下面提供一个最简的 Flink Batch WordCount Demo,并演示如何使用 Application 模式 + HDFS 远程依赖 部署到 YARN 集群。整个流程分为三步:编写代码 → 打包上传 → 提交运行。
一、Demo 代码(Java)
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;
public class BatchWordCount {
public static void main(String[] args) throws Exception {
// 1. 创建批处理环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
// 2. 从 HDFS 读取文本文件(路径由第一个参数传入)
String inputPath = args.length > 0 ? args[0] : "hdfs:///user/hadoop/input.txt";
DataSet<String> text = env.readTextFile(inputPath);
// 3. 分词并计数
DataSet<Tuple2<String, Integer>> counts =
text.flatMap(new Tokenizer())
.groupBy(0)
.sum(1);
// 4. 输出结果到 HDFS(路径由第二个参数传入)
String outputPath = args.length > 1 ? args[1] : "hdfs:///user/hadoop/output";
counts.writeAsText(outputPath).setParallelism(1);
// 5. 执行
env.execute("Batch WordCount");
}
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));
}
}
}
}
}
说明:这是一个批处理 WordCount,从 HDFS 读取文本,统计每个单词出现次数,并将结果写入 HDFS。
二、打包(Fat JAR)
使用 Maven 打包,pom.xml 核心配置如下(省略 groupId/version):
<dependencies>
<!-- Flink Java 依赖 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.14.4</version>
<scope>provided</scope> <!-- 因为集群已有 Flink lib -->
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>1.14.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>BatchWordCount</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
执行打包:
mvn clean package -DskipTests
生成 target/BatchWordCount-1.0-SNAPSHOT.jar。
三、部署前的准备工作
1. 准备 HDFS 上的 Flink Lib 目录(一次性操作)
将 Flink 发行版的 lib 目录上传到 HDFS,供 Application 模式远程拉取:
hdfs dfs -mkdir -p hdfs:///flink/lib
hdfs dfs -put $FLINK_HOME/lib/*.jar hdfs:///flink/lib/
注意:
$FLINK_HOME是 Flink 安装目录,通常包含flink-dist*.jar、flink-table*.jar等核心 jar。
2. 上传作业 JAR 到 HDFS
hdfs dfs -mkdir -p hdfs:///flink/jars
hdfs dfs -put target/BatchWordCount-1.0-SNAPSHOT.jar hdfs:///flink/jars/
3. 准备输入数据
在 HDFS 上创建一个测试文件:
echo -e "hello world\nhello flink\nworld of flink" | hdfs dfs -put - hdfs:///user/hadoop/input.txt
四、使用 Application 模式提交作业
./bin/flink run-application \
-t yarn-application \
-d \
-Djobmanager.memory.process.size=1024m \
-Dtaskmanager.memory.process.size=2048m \
-Dtaskmanager.numberOfTaskSlots=2 \
-Dyarn.application.name="batch-wordcount-demo" \
-Dyarn.application.queue=default \
-Dyarn.provided.lib.dirs="hdfs:///flink/lib" \
hdfs:///flink/jars/BatchWordCount-1.0-SNAPSHOT.jar \
hdfs:///user/hadoop/input.txt \
hdfs:///user/hadoop/output
参数说明:
-t yarn-application:指定部署模式为 Application。-d:后台运行。-D...:动态配置 JobManager/TaskManager 内存、Slot 数、YARN 队列等。-Dyarn.provided.lib.dirs:指向 HDFS 上的 Flink lib 目录,客户端不再上传 jar。- 最后两个参数分别是输入路径和输出路径,传给
main()方法。
提交后,Flink 会在 YARN 上启动一个 Application,输出类似:
2023-XX-XX XX:XX:XX,XXX INFO org.apache.flink.yarn.YarnClusterDescriptor [] - YARN application has been deployed successfully.
Application ID: application_XXXXXXXXX_XXXX
五、验证结果
- 查看 YARN UI(
http://<rm-address>:8088),确认应用状态为 RUNNING 或 FINISHED。 - 查看 HDFS 输出目录:
hdfs dfs -ls hdfs:///user/hadoop/output
hdfs dfs -cat hdfs:///user/hadoop/output/*
预期输出:
(flink,2)
(hello,2)
(of,1)
(world,2)
- 查看 Flink 日志(可通过 YARN 的 logs 命令或 Flink Web UI 查看)。
六、清理
作业完成后会自动释放 YARN 容器。如需强制停止:
yarn application -kill application_XXXXXXXXX_XXXX
删除 HDFS 输出目录(下次运行前):
hdfs dfs -rm -r hdfs:///user/hadoop/output
七、关键点总结
- Application 模式:
main()在 JobManager 上执行,客户端只负责提交命令,适合生产环境。 - HDFS 远程依赖:
yarn.provided.lib.dirs避免了每次提交都上传几百 MB 的 Flink jar,大幅提升提交速度。 - 批处理 vs 流处理:本例使用批处理(
ExecutionEnvironment),若改为流处理(StreamExecutionEnvironment)同样适用 Application 模式。 - 参数传递:通过命令行末尾的参数传递给
main()方法,方便动态指定输入输出路径。
这个 Demo 可作为 Flink on YARN Application 模式的入门模板,后续只需替换业务逻辑即可。
posted on 2026-08-19 14:29 luzhouxiaoshuai 阅读(6) 评论(0) 收藏 举报
浙公网安备 33010602011771号