Lambda 架构 Speed Layer 详解
目前实时层比较流行的一个解决方案是Flume + Kafka + Storm/Spark Streaming/Flink + Redis.
Redis 是一个很有意思的内存数据库, 它支持五种数据结构, 并且有很多很有意思的API和使用方式, 在Speed layer中, 它充当数据库的角色.
Storm/Spark Streaming/Flink 相当于批处理层中 MR 的角色, 它是speed layer的分布式计算引擎.
Kafka 是speed layer的缓存层, 是一个分布式消息系统, 你可以想象一下storm处理的速度和数据涌入的速度不一定相等, 如果有一些数据还来不及处理怎么办? 答案是缓存在Kafka里.
对于日志分析这样的应用场景, kafka前还会有一个flume是日志采集系统, flume就是一个日志的快速ETL系统.
Flume 是一个可以通过配置就能实现日志采集功能的组件。由Source、Channel、Sink三个组成部分构成。Source一般使用avro格式的文件夹,Channel推荐选择Memory模式,速度够快。Sink根据场景可以选择kafka或者hdfs,或者另一个flume。
Flume可以通过对Sink分组,来实现failover,高可用和负载均衡。参考:
Flume: ------ Sink Processors实现Sink Group的负载均衡、优先级选择_姜同学的学习笔记的博客-CSDN博客
Flume vs Kafka
Flume collects data from the source and move the data to the sink which is very similar to Kafka.
The difference between kafka and flume is that kafka will cache the message unprocessed. While Flume intends to maintain a balance between input rate and output rate.
Flume also has a transition mechinism to make sure the sink and data output succeed. Kafka can guarantee the exact-once message delivery.
前文链接: Lambda 架构 简介_rav009的专栏-CSDN博客_lambda架构
Speed Layer作为实时处理层和离线处理层相辅相成, 当增量数据被离线处理完毕, 实时层就不必继续处理这批数据了, 术语叫作: Expiring Real-Time View
那么问题来了, 怎么通知Speed Layer某一部分数据已经被离线处理完毕, 可以释放了呢?
一种方案是维护两个实时处理层, 轮流作为 主实时层, 备用实时层定期与离线处理层交互, 当得知某增量数据已经处理完成备用实时层删除这批数据, 然后主备切换.