Exactly-once 语义是实时计算的难点之一。要做到每一条记录只会被处理一次,即使服务器或网络发生故障时也能保证没有遗漏,这不仅需要实时计算框架本身的支持,还对上游的消息系统、下游的数据存储有所要求。此外,我们在编写计算流程时也需要遵循一定规范,才能真正实现 Exactly-once。本文将讲述如何结合 Spark Streaming 框架、Kafka 消息系统、以及 MySQL 数据库来实现 Exactly-once 的实时计算流程。
引例
首先让我们实现一个简单而完整的实时计算流程。我们从 Kafka 接收用户访问日志,解析并提取其中的时间和日志级别,并统计每分钟错误日志的数量,结果保存到 MySQL 中。
示例日志:
|
|
结果表结构,其中 log_time
字段会截取到分钟级别:
|
|
Scala 项目通常使用 sbt
来管理。我们将下列依赖添加到 build.sbt
文件中。本例使用的是 Spark 2.2 和 Kafka 0.10,数据库操作类库使用了 ScalikeJDBC 3.0。
|
|