Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。
Apache Flink 功能强大,支持开发和运行多种不同种类的应用程序。它的主要特性包括:批流一体化、精密的状态管理、事件时间支持以及精确一次的状态一致性保障等。Flink 不仅可以运行在包括 YARN、 Mesos、Kubernetes 在内的多种资源管理框架上,还支持在裸机集群上独立部署。在启用高可用选项的情况下,它不存在单点失效问题。事实证明,Flink 已经可以扩展到数千核心,其状态可以达到 TB 级别,且仍能保持高吞吐、低延迟的特性。世界各地有很多要求严苛的流处理应用都运行在 Flink 之上。
在Flink中,一切都是由流组成的,离线数据是有界限的流,实时数据是一个没有界限的流。
一个Flink集群,主要包含以下两个核心组件:作业管理器(JobManger)和 任务管理器(TaskManager) 。
JobManager 是一个 Flink 集群中任务管理和调度的核心,是控制应用执行的主进程。也就是说,每个应用都应该被唯一的 JobManager 所控制执行。JobManger 又包含 3 个不同的组件:分发器(Dispatcher)、JobMaster、资源管理器(ResourceManager) 。
流式的WordCount示例,从kafka中读取一个实时数据流,每10S统计一次单词出现次数,DataStream实现代码如下
DataStream<String> Lines=env.addSource(new FlinkKafkaConsumer<>(...));
DataStream<String> events=lines.map((line)->parse(line));
DataStream<Statistics>stats=events
.keyBy(event->event.id)
.timeWindow(Time.seconds(10))
.apply(new MyWindowAggregationFunction());
stats.addSink(new BucketingSink(path));
业务逻辑转换为一个Streaming DataFlow Graph
假设示例的sink算子的并发配置为1 , 其余算子并发为2 紧接着会将上面的Streaming DataFlow Graph转化Parallel Dataflow (内部叫Execution Graph) :
为了更高效地分布式执行,Flink会尽可能地将不同的operator链接( chain )在一起形成Task。 这样每个Task可以在一个线程中执行,内部叫做OperatorChain,如下图的source和map算子可以Chain在一起。
最后将上面的Task调度到具体的TaskManager中的slot 中执行,一个Slot只能运行同一个task的subTask