第2章:Flink核心概念与环境搭建
各位同学,今天我们来聊聊Flink的核心概念和环境搭建。说实话,这部分内容是我在量化交易系统落地过程中踩坑最多的地方。很多同学一上来就急着写代码,结果环境没配好,后面全崩了。咱们稳扎稳打,先把地基打牢。
2.1 Flink架构:从宏观到微观
Flink的架构,说白了就是一套「主从模式」。我习惯把它想象成一个交易团队:JobManager是策略经理,TaskManager是执行交易员。
核心组件一览:
- JobManager:负责调度、协调、容错。相当于团队的大脑。
- TaskManager:真正干活的节点,执行具体的计算任务。
- ResourceManager:管理资源分配,比如内存、CPU。
- Dispatcher:提供REST接口,方便我们提交任务。
我在项目中遇到过一个问题:刚开始用Flink做实时行情处理时,TaskManager的内存设得太小,结果数据量一上来就OOM。嗯,这里要注意——TaskManager的slot数量要和CPU核数匹配,别贪多。
2.2 数据流与批处理:统一的计算模型
Flink最牛的地方在于,它把批处理当作「有界流」来处理。你想想看,这意味着一套代码既能跑实时,也能跑离线。
我个人习惯把数据流分为两类:
- 无界流:实时行情、订单流,永远不停。
- 有界流:历史K线数据、回测数据,有始有终。
为什么会这样设计?因为量化交易中,我们经常需要「先用历史数据回测,再切到实盘」。如果两套引擎,维护成本翻倍不说,逻辑还可能不一致。
避坑指南:我曾经在切换批流模式时,忘了调整watermark的生成策略。结果回测时数据全对,一上实盘就延迟爆炸。记住:批处理不需要watermark,流处理必须配。
2.3 本地环境搭建:从零开始
咱们先搭个本地环境,方便调试。我建议用Mac或Linux,Windows用户记得开WSL2。
# 1. 下载Flink(我习惯用1.17版本,稳定)
wget https://dlcdn.apache.org/flink/flink-1.17.0/flink-1.17.0-bin-scala_2.12.tgz
# 2. 解压
tar -xzf flink-1.17.0-bin-scala_2.12.tgz
cd flink-1.17.0
# 3. 启动本地集群
./bin/start-cluster.sh
# 4. 检查是否启动成功
jps # 应该看到StandaloneSessionClusterEntrypoint和TaskManagerRunner
启动后,打开浏览器访问 http://localhost:8081,你会看到Flink的Web UI。这里可以查看任务状态、检查点信息。
注意:本地环境默认只分配1个TaskManager,1个slot。做测试够用,但别拿它跑生产数据。我曾经犯过这个错,结果行情数据一进来,Web UI直接卡死。
2.4 集群环境搭建:生产就绪
生产环境我推荐用Standalone模式或者YARN模式。这里以Standalone集群为例,三台机器就够了。
| 节点 | 角色 | 配置建议 |
|---|---|---|
| node1 | JobManager + TaskManager | 8核16G |
| node2 | TaskManager | 16核32G |
| node3 | TaskManager | 16核32G |
# 在node1上修改 conf/flink-conf.yaml
jobmanager.rpc.address: node1
taskmanager.numberOfTaskSlots: 4
parallelism.default: 8
# 修改 conf/workers(添加worker节点)
node1
node2
node3
# 同步配置到所有节点
scp -r flink-1.17.0 node2:/opt/
scp -r flink-1.17.0 node3:/opt/
# 在node1上启动集群
./bin/start-cluster.sh
我个人习惯把TaskManager的slot数设为CPU核数的一半。比如16核的机器,设8个slot。这样每个slot有2个核,不会因为线程切换导致性能抖动。
2.5 核心知识体系一览
下面这张图是我自己画的,把本章的核心概念串起来了。你看完应该能理解Flink的整体脉络。
我的经验:刚开始学Flink时,别纠结于所有细节。先把JobManager和TaskManager的关系搞清楚,再理解流和批的统一模型。剩下的watermark、state这些东西,后面实战中自然就懂了。
2.6 环境验证:跑个Hello World
环境搭好了,咱们跑个简单的WordCount验证一下。虽然量化交易不数单词,但这个例子能帮你确认整个链路是通的。
# 提交一个测试任务
./bin/flink run examples/streaming/WordCount.jar
# 查看输出(默认输出到TaskManager的日志)
tail -f log/flink-*-taskexecutor-*.out
如果你看到一堆单词和数字,说明环境没问题。我曾经在集群上跑这个测试,结果等了5分钟没反应——原来是防火墙没开6123端口。嗯,网络配置这块容易忽略。
生产环境提醒:集群模式下,记得配置HA(高可用)。我见过有人没配HA,JobManager挂了整个集群瘫痪。用ZooKeeper做HA是最常见的方案,后面章节会详细讲。
好了,这一章的内容就到这里。环境搭好了,下一章咱们就可以真正开始写量化交易的数据处理逻辑了。
公众号:蓝海资料掘金营,微信deep3321