在谈Flink之前, 我们在一个更高的层面上来理解一下数据的处理, 包括数据类型和处理模型两个大的方面.
首先, 是数据的类型
我们把数据处理分成两种模型:
无边界的数据: 可以理解为持续追加的无线数据及
有边界的数据: 有线的, 不会更改的数据
在现实的处理环境, 我们通常认为的有边界的或者批处理数据其实都是无边界的数据集. 不管这个数据是在HDFS上的一系列的目录文件, 还是类似于kafka的日志系统, 其实都属于无边界的数据集合.
为了有更好的认识, 这里列举几个典型的无边界的数据集:
- 终端用户在移动和web应用的交互数据
- 物理传感器产生的持续的测量数据
- 资本市场产生的经济数据
- 服务器日志数据
然后是数据的处理模式
流式处理: 持续的处理所产生的数据
批处理: 在一个有限的时间窗口内执行处理逻辑, 并且在计算完成后释放资源
我们可以以任一种处理模式来处理任一种数据类型, 尽管不完美. 比如, 我们可以用批处理方式来处理无边界数据, 这样会有一些潜在问题, 问题来自于窗口数据, 状态管理和无序数据.
依靠自己的流处理模型, Flink非常适合流式的处理无边界的数据. 合适的处理模型和数据类型的匹配有很多有点, 比如精度和效率.
为什么选择Flink?
Flink是分布式的流处理框架:
- Provides results that are accurate, even in the case of out-of-order or late-arriving data
- Is stateful and fault-tolerant and can seamlessly recover from failures while maintaining exactly-once application state
- Performs at large scale, running on thousands of nodes with very good throughput and latency characteristics
Flink的这些feature对计算精确的数据很重要, 并且在flink的流处理模式下是使能的, 他们包括: 状态管理, 处理无序数据, 动态窗口.
- Flink可以保证在有状态的计算时exactly-once, 有状态指的是应用维护数据的聚合或者摘要信息, 即使出现了失败的事件.
- Flink支持event time语义, 在流处理和批处理时, 这个在乱序和事件延迟的case下很有意义
- Flink支持灵活的处理窗口配置, 可以基于时间, 数量或者事件驱动的窗口会话. 窗口的大小可以根据不同的触发条件灵活的配置,
- Flink的很轻量级的实现了容错, 可以保证高吞吐和exactly-once. Flink的错误恢复是无数据丢失的, 并且在可靠性和延迟上的代驾是可以忽略的.
- Flink实现了高吞吐和低延迟, 下图是Flink和Storm的性能比较.
- Flink的savepoints提供了状态保存和恢复机制, 使得可以更新应用或者重启历史数据, 并且保证过程中不丢失数据和最少的宕机时间.
- Flink既适用于大规模的集群场景, 也可以工作于单点模式, 支持YARN和Mesos
Flink, 流处理模式和有边界数据的说明
Flink有针对无边界数据的DataStream API和有边界数据的DataSet接口.
我们介绍了流处理模式, 也就是一次处理一个事件, 这个很明显适用于无边界的流数据, 不过有边界的数据又是怎么适用于流处理架构的呢. 其实这个关系很自然, 有边界数据只是无边界数据的一个特殊case, 所以所有的流处理概念都是通用的.
如图, 正是DataSet工作的流程, 有边界的数据被处理成有限的stream, 与无边界的数据相比只有细微的不同. 当然Flink这个牛逼的框架也可以在一个执行引擎中同时处理有边界和无边界的两种数据.
Runtime
Flink的核心是分布式流计算引擎, 也就是说每次处理一个消息事件, 而不是一系列的批处理.
Flink的API:
- DataStream API: It is for programs that implement transformations on data streams (e.g., filtering, updating state, defining windows, aggregating).
- DataSet API: It is for programs that implement transformations on data sets (e.g., filtering, mapping, joining, grouping).
- Table API: It is a SQL-like expression language for relational stream and batch processing that can be easily embedded in Flink’s DataSet and DataStream APIs (Java and Scala).
- Streaming SQL: enables SQL queries to be executed on streaming and batch tables. The syntax is based on Apache Calcite™.
Flink同时也提供了一些特殊库, 来支持复杂的事件处理, 机器学习, 图计算以及Storm兼容.
Flink的处理框架简单描述如下, 包括:
- Data source:Incoming data that Flink processes
- Transformations:The processing step, when Flink modifies incoming data
- Data sink:Where Flink sends data after processing
Flink 生态:
The connectors:
Apache Kafka(sink/source)
Elasticsearch(sink)
Elasticsearch 2.x(sink)
HDFS(sink)
RabbitMQ(sink/source)
Amazon Kinesis Streams(sink/source)
Twitter(source)
Apache NiFi(sink/source)
Apache Cassandra(sink)
Redis, Flume, and ActiveMQ (via Apache Bahir)(sink)