编写和运行第一个 Flink 程序的指南

253 阅读2分钟

Flink 是一个流式处理框架,可以用于实时处理和分析大规模数据流。

创建 Flink 项目

创建 Flink Maven 项目,如下所示:

确定项目的名称如下所示:

image.png

修改 Maven 项目的 pom.xml 文件中添加 Flink 的依赖项。以下是一个示例的 pom.xml 文件:

<properties>
    <flink.version>1.9.2</flink.version>
    <scala.binary.version>2.12</scala.binary.version>
    <scala.version>2.12.17</scala.version>
</properties>

<dependencies>
    <!-- flink -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>${scala.version}</version>
    </dependency>
</dependencies>

编写 WordCount 程序

下面是一个使用 Flink 编写的简单的第一个程序的示例:

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 WordCount {
    public static void main(String[] args) throws Exception {
        // 创建执行环境
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 创建数据源
        DataStream<String> text = env.fromElements(
                "Hello Flink",
                "Hello World",
                "Flink is awesome"
        );

        // 对数据流进行操作
        DataStream<Tuple2<String, Integer>> counts = text
                .flatMap(new Tokenizer())
                .keyBy(0)
                .sum(1);

        // 输出结果
        counts.print();

        // 执行任务
        env.execute("WordCount");
    }

    public static final 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));
                }
            }
        }
    }
}

这个程序实现了一个简单的单词计数功能。它将输入的文本流拆分成单词,并统计每个单词出现的次数,然后将结果打印出来。

启动 Flink

本地执行

本地执行结果如下图所示:

在 Flink Docker 环境上执行

修改打包主函数,如下所示:

image.png

执行打包脚本,如下所示:

image.png

打包结果如下:

image.png

执行脚本如下所示:

在执行脚本之前,需要先在本地搭建 flink 环境搭建

## 将打包后的 jar 包拷贝到 flink 环境下
docker cp flink-demo/target/flink-demo-1.0-SNAPSHOT.jar example_jobmanager_1:/opt/

docker exec -it example_jobmanager_1  bash -c 'flink run /opt/flink-demo-1.0-SNAPSHOT.jar'

执行之后的结果在页面上可以看到,具体内容如下所示:

image.png

请注意,这只是 Flink 的一个简单示例,你可以根据自己的需求和数据进行更复杂的操作和处理。