第4章 Flink初体验:安装、启动与第一个程序

说实话,学任何技术最怕什么?就是环境装了半天,最后跑不起来。

Flink 的安装其实没那么复杂。我当年第一次装的时候,也是照着文档一步步来。踩过一些坑,今天我把这些经验都告诉你。

4.1 环境准备

Flink 依赖 Java 环境。先确认你的机器上有没有 JDK。

最低要求:JDK 8 以上。我个人建议用 JDK 11,兼容性最好。

检查命令很简单:

java -version

如果输出类似下面这样,说明环境 OK:

openjdk version "11.0.18" 2023-01-17
Java HotSpot(TM) 64-Bit Server VM

嗯,这里要注意:别用 JDK 17 以上的版本。我在项目中遇到过 Flink 1.13 和 JDK 17 不兼容的情况,折腾了半天。

4.2 下载与安装 Flink

去 Flink 官网下载安装包。我建议用稳定版,比如 1.14 或 1.15。

下载链接(以 1.14.6 为例):

wget https://archive.apache.org/dist/flink/flink-1.14.6/flink-1.14.6-bin-scala_2.12.tgz

解压:

tar -xzf flink-1.14.6-bin-scala_2.12.tgz
cd flink-1.14.6

目录结构长这样:

目录/文件 作用
bin/ 启动脚本,比如 start-cluster.sh
conf/ 配置文件,flink-conf.yaml 在这里
lib/ 依赖 jar 包
log/ 运行日志
examples/ 官方示例程序

小技巧:把 flink 的 bin 目录加到 PATH 里,后面用起来方便。

export FLINK_HOME=/path/to/flink-1.14.6
export PATH=$FLINK_HOME/bin:$PATH

4.3 启动 Flink 集群

Flink 支持多种部署模式。本地开发用 Standalone 模式就够了。

启动命令:

./bin/start-cluster.sh

看到类似输出就成功了:

Starting cluster.
Starting standalonesession daemon on host localhost.
Starting taskexecutor daemon on host localhost.

验证一下:打开浏览器,访问 http://localhost:8081。

你会看到 Flink 的 Web UI。这里能看到集群状态、任务列表、资源使用情况。我平时排查问题,第一件事就是看 Web UI。

注意:如果 8081 端口被占用,去 conf/flink-conf.yaml 里改 rest.port。

关闭集群用这个:

./bin/stop-cluster.sh

4.4 运行第一个 WordCount(批模式)

WordCount 是大数据界的 "Hello World"。说白了就是统计单词出现次数。

Flink 自带了一个示例 jar 包,在 examples 目录下。

先准备一个输入文件:

echo -e "hello flink\nhello world\nflink is awesome" > input.txt

然后提交任务:

./bin/flink run ./examples/batch/WordCount.jar \
  --input file:///path/to/input.txt \
  --output file:///path/to/output.txt

看输出结果:

awesome 1
flink 2
hello 2
is 1
world 1

每个单词出现几次,一目了然。

你想想看,批模式处理的是什么?是有界数据。数据读完了,任务就结束。这是 Flink 处理批任务的典型方式。

核心概念:批模式 = 有界数据流。Flink 把批当成一种特殊的流来处理。

4.5 运行第一个 Socket 流处理(流模式)

批模式跑完了,咱们来点真正的流处理。

流模式处理的是无界数据——数据源源不断,任务永不停止。

Flink 也提供了一个 Socket 流处理的示例。不过我更建议你亲手写一个。

先启动一个数据源:用 netcat 模拟实时发送数据。

nc -lk 9999

这个命令会在 9999 端口监听。你输入什么,Flink 就消费什么。

然后提交流处理任务:

./bin/flink run ./examples/streaming/SocketWindowWordCount.jar \
  --port 9999

回到 netcat 窗口,随便输入一些单词:

hello flink
hello world
flink streaming

去 Flink Web UI 看 Task Managers 的 stdout 日志,你会看到类似这样的输出:

hello : 2
flink : 2
world : 1
streaming : 1

注意看:数据是实时统计的。每输入一行,结果就更新一次。这就是流处理的魅力。

避坑指南:我曾经在 Windows 上跑 netcat,发现数据发不出去。后来发现是防火墙把端口拦了。记得检查防火墙设置。

4.6 批与流:一张图看懂区别

说了这么多,批和流到底有什么区别?我画了张图,帮你理清思路。

批模式 vs 流模式 批模式(有界数据) 数据一次性读入 计算完成后输出结果 任务自动结束 流模式(无界数据) 数据持续不断流入 实时计算,结果持续更新 任务持续运行 核心区别 Flink 用同一套引擎处理批和流,只是数据边界不同

说白了,批模式就是"攒够了再算",流模式是"来一条算一条"。Flink 的厉害之处在于:两种模式用同一套 API。你学一次,两边都能用。

4.7 本章小结

今天咱们干了三件事:

  • 装了 Flink 环境,启动了集群
  • 跑了 WordCount 批处理程序
  • 跑了 Socket 流处理程序

你亲手体验了批和流的区别。批处理处理有界数据,任务跑完就结束。流处理处理无界数据,任务一直跑。

记住:Flink 的核心思想就是"流批一体"。后面我们会深入这个理念,看看它到底怎么做到的。

课后小练习:试试修改 Socket 流处理的端口号,或者换一个输入文件跑 WordCount。动手是最好的学习方式。