Flink 把流计算框架可能处理的数据集分为如下两种。
- 无界数据集(unbounded dataset):无界数据集通常是持续不断产生的,就像河水一样不停流人。现实世界中的许多数据都是无界的数据集,比如电子商务交易日志、网站点击日志等。
- 有界数据集(bounded dataset):有界的数据集通常是批次的,考虑Hadoop、MapReduce 处理的文件。
对应上述两种数据集,就有两种数据处理模型。
- 流处理:流处理任务就是常说的实时任务,任务一直运行,持续不断地处理流入的无界的数据集。(持续不停地占用计算和内存资源)
- 批处理:批处理任务对于自己要处理的有界数据集非常明确,处理完该数据集后就会释放有关计算和内存资源。
Flink底层用流处理模型来同时处理上述两种数据。在Flink看来,有界数据集不过是无界数据集的一种特例;而Spark Streaming走了完全相反的技术路线,它把无界数据集分割成有界数据集再通过微批对待流计算。
同spak sueaming、storm 等流计算引擎一样,Flink的数据处理组件也被分为三类:
数据输人(souree)、数据处理(transformation)和数据输出(sink)。
Flink 程序实际执行时,会映射到流数据流(streaming dataflow)。streaming dataflow由流和转换算符构成,每个数据流起始于一个或多个source,并终止于一个或多个 sink,整个数据流类似于任意的有向无环图(DAG)。并且是并行的。
数据流在两个transformation间传输数据有两种方式:
- 一对一流 :保持元素间分区和排序;
- redistribution流:改变流的分区。一次交换中,排序只保留在每对发送与接收子任务中。
Flink中时间:
- 事件时间event time:事件中时间戳;
- 采集时间 ingest time :事件进入数据流源算符的事件;
- 处理时间process time:每个执行时间操作的运算符的本地时间。