第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 批与流:一张图看懂区别
说了这么多,批和流到底有什么区别?我画了张图,帮你理清思路。
说白了,批模式就是"攒够了再算",流模式是"来一条算一条"。Flink 的厉害之处在于:两种模式用同一套 API。你学一次,两边都能用。
4.7 本章小结
今天咱们干了三件事:
- 装了 Flink 环境,启动了集群
- 跑了 WordCount 批处理程序
- 跑了 Socket 流处理程序
你亲手体验了批和流的区别。批处理处理有界数据,任务跑完就结束。流处理处理无界数据,任务一直跑。
记住:Flink 的核心思想就是"流批一体"。后面我们会深入这个理念,看看它到底怎么做到的。
课后小练习:试试修改 Socket 流处理的端口号,或者换一个输入文件跑 WordCount。动手是最好的学习方式。