我们都知道, Druid在摄取时需要设置一个时间窗口, 在时间窗口之外的数据,将会丢弃。我们如何将这部分丢弃的数据重新摄取进Druid系统中,以提高数据的准确性?通常的做法是把数据保存起来, 等待重新摄取。 目前比较流行的处理方法是Lambda架构。
1.Lambda架构
Lambda是实时处理框架Storm 的作者Nathan Marz 提出的用于同时处理离线和实时数据的架构理念 Lambda架构(LA)旨在满足一个稳定的大规模数据处理系统所需的修错性、低延迟 ,可扩展的特性。 LA的可行性和必要性基于如下假设利原则。
• 任何效据系统可定义为: query= functional(all data)。
• 人为容错性 (Human Falult-Tolerance):数据是易丢失的。
• 数据不可变(Data Immutability):数据是只读的,不在变化。
• 重新计算(Recomputation):因为上面两个原则,运行函数重新计算结果时可能的。
LA基本架构图:
该架构具有如下特点:
• 所有新数据分别分发到批处理层和实时处理层。
• 批处理层有两个功能:管理主要的数据(该类数据特点只能的加, 不能更新}为下一步计算出批处理视图做预计算。
• 服务层计算出批处理视图中的数据做索引.以提供低延时,即使查询。
• 实时处理层仅处理实时数据,并为服务层提供查询服务。
• 任何查询都可以通过实时处理层和批处理层的查询结果合并得到。
从以上论述我们所以知道,Druid本身就心一个典型的 Lambda 架构系统,Druid有实时节点和所史节点,任何查询都是聚合实时节点和历史节点的数据得到查询结果。那么, 我们如何在Druid 系统之外采用 Lambda 架构的思维去解决时间窗口面临的问题呢?
2.解决时间窗口问题
Druid 在摄取数掘时,对于超山时间窗口的数据会直接丢弃,这对于某些要求数据准确性的系统来说:是不可以接受的,那么就需要重新摄入这部分数据,参考Lambda的思想,实现方式如下:
流程如下:
(1) 源数揭都进人Kafka.
(2) 数据通过实时节点或者索引服务进人Druid中
(3) Kafka 的数据通过 Flume 备份到 Hadoop.
(4) 定时或者发现有教据丢失时,通过 Druid Hadoop Index Job 重新摄人数据