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*.jarflink-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

五、验证结果

  1. 查看 YARN UIhttp://<rm-address>:8088),确认应用状态为 RUNNING 或 FINISHED。
  2. 查看 HDFS 输出目录
hdfs dfs -ls hdfs:///user/hadoop/output
hdfs dfs -cat hdfs:///user/hadoop/output/*

预期输出:

(flink,2)
(hello,2)
(of,1)
(world,2)
  1. 查看 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)    收藏  举报

导航