前面几篇都是从自己开发的角度来思考该怎么做实时计算,但是思路切到去理解flink是怎么实现的话就需要从另一个角度去学习了。
flink 将一个应用划分为多个task,放在taskslot中执行,什么是taskslot呢?flink将节点分为了jobmanager和taskmanager,在taskmanager上启动的是一个jvm进程,每个taskmanager上jvm进程中的taskslot数量是根据flink的配置文件来的。为了避免内存竞争就引入了taskslot,但是taskslot的作用就是隔离内存,各个taskslot还是共享cpu的,这样在同一个jvm上的task共享tcp连接,在一定程度上减少了网络传输提升了性能。
在一个 Flink 任务中,有很多的算子,这些算子的计算压力各不相同,比如简单的 map 和 filter 算子所需要的资源不多,但是有些算子比如 window、group by 则需要更多的计算资源才能满足计算所需。这时候那些资源需求大的算子就可以共用其他的 Slot,提高整个集群的资源利用率。
在整个 Flink 的资源管理的类中,核心的类包括 Scheduler、SlotPool、JobMaster。它们之间的交互流程主要包括:Scheduler 调度器会向 SlotPool 资源池申请和释放 Slot;如果 SlotPool 不能满足需求,那么会向 ResourceManager 发起申请;获取到的资源通过 JobMaster 分配给 SlotPool。
当然并行度也可以修改,在算子/配置文件/提交任务和执行环境中均可修改。
实时计算中也会遇到需要将实时表与维度表关联的情况,类似于后端开发业务代码,需要将两张表join,但是DB的join是在数据库汇总完成的,flink join时的数据可能一端来自hbase一端来时kafka,这种情况可以有三种方式join一个是每次都同步读取维度表数据,显然这是非常影响性能的,一种是将维度表全量加载到内存,显然这只适合维度表比较小的情形,最后一种就是用同步读取数据结合LRU缓存了,这样即提升了热点数据的读取效率又减少了内存使用。