Flink 与 Hadoop 和 Spark 的主要不同点在于:
数据处理方式:
- Flink 流式计算,基于数据流进行运算。
- Hadoop 和 Spark 批式计算,基于数据集块进行运算。
程序模型:
- Flink 基于数据流的转换模型(transformation model), Transformation 的操作结果立即发生改变。
- Hadoop MapReduce 和 Spark 基于数据集的转换模型(Dataset model),需要执行 Action 操作后才会真正触发计算。
状态管理:
- Flink 有先进的状态管理机制,可以方便处理有状态的计算(stateful computation)。
- Hadoop 和 Spark 通过外部存储系统来管理状态。
容错能力:
- Flink 有强大的容错功能,支持精确一次(exactly-once)的状态更新。
- Hadoop 无法保证处理成果的精确性。Spark 只支持至少一次(at-least-once)的状态更新。
性能:
- Flink 具有更高的吞吐量和更低的延迟。Flink 的运行时专为流计算进行了优化。
- Hadoop 和 Spark 的运行时更加通用。
例如,一个简单的 Flink 程序:
DataStream<SensorReading> dataStream = env.readTextFile("sensor-data");
dataStream.filter(reading -> reading.temperature > 30)
.reduce((first, second) -> first.temperature + second.temperature)
.addSink(new SensorAlertSink());
这个 Flink 程序会读取 sensor 数据流,过滤温度大于 30 的数据,对温度值进行求和,并将结果输出到报警器。