A/B测试是少数,直到我们找到了德鲁伊的替代品
#编程 #database #datascience #分析

Author: Heyu Dou, Xinxin Wang

与普通报告不同,A/B测试每次都会收集不同尺寸组合的数据。这也是对巨大数据的复杂分析。在我们的情况下,我们的实时数据量为数百万OP(每秒操作),每个操作都涉及约20个数据标签,并且超过十二个维度。

对于有效的A/B测试,作为数据工程师,我们必须确保快速计算以及高数据完整性(这意味着没有重复,并且没有数据丢失)。我敢肯定我不是唯一一个这样说的人:这很难!

让我向您展示我们与以前基于DRUID的数据平台的长期斗争。

平台体系结构1.0

组件:apache storm + apache druid + mysql

这是我们的实时数据瓦里屋,Apache Storm是实时数据处理引擎,Apache Druid预先聚集了数据。但是,德鲁伊不支持某些分页并加入查询,因此我们定期将数据从德鲁伊(Druid)撰写,使MySQL成为Druid的“物质视图”。但这只是一个胶带解决方案,因为它无法支持我们扩大的实时数据大小。因此数据及时性是无法实现的。

1

平台体系结构2.0

组件:apache flink + apache druid + tidb

这次,我们用Flink代替了Storm,然后用TIDB代替了MySQL。在语义和功能方面,Flink更强大,而TIDB具有分布式功能,比MySQL更可维护。但是Architecture 2.0远没有我们的端到端数据一致性的目标,因为在处理庞大的数据时,可以使TIDB交易大大减慢数据编写。另外,德鲁伊本身不支持标准SQL,因此使用中有一些学习成本和摩擦。

2

平台体系结构3.0

组件:apache flink + Apache Doris

我们用Apache Doris代替Apache Druid作为OLAP引擎,这也可以用作统一的数据服务网关。因此,在体系结构3.0中,我们只需要维护一组查询逻辑。我们将实时数据瓦式层次分层以增加实时数据的可重复使用性。

3

证明弗林克和多丽丝的组合是答案。我们可以利用它们的功能来实现快速计算和数据一致性。继续阅读,看看我们如何实现。

快速计算

作为一个操作数据可以连接到20个标签,在A/B测试中,我们每次仅比较两组数据中心。首先,我们考虑将一块操作数据(带有20个标签)分成20个数据,仅在数据摄入时只有一个标签的数据,然后将它们导入Doris进行分析,但这可能会导致数据爆炸,从而导致巨大的压力在我们的集群上。

然后,我们尝试将此类工作量的一部分移至计算引擎。因此,我们尝试并“爆炸”了Flink中的数据,但很快就后悔了,因为当我们使用flink作业中的全局哈希窗口汇总数据时,网络和CPU的使用也“爆炸”。

我们的第三张镜头是在我们拆分之后,将数据汇总在弗林克本地。如下所示,我们在一个用于本地聚合的操作员的内存中创建了一个窗口;然后,我们使用全局哈希窗口将其进一步汇总。由于两个被链接在一起的操作员是一个线程,因此在操作员之间传输数据会消耗少得多的网络资源。 两步聚集方法与 Aggregate model apache doris结合使用,可以将数据爆炸保持在可管理的范围内。

4

为了方便A/B测试,我们将测试标签ID作为Apache Doris中的第一个排序字段,因此我们可以使用排序的索引快速找到目标数据。为了进一步最大程度地减少查询中的数据处理,我们使用常用维度创建实质性的视图。随着不断的修改和更新,实现的视图适用于我们的80%的查询。

总结一下,使用分类索引和实体视图,我们将查询响应时间缩短为仅在A/B测试中的几秒钟。

数据完整性保证

想象一下,您的算法设计师汗流和眼泪试图改善业务,只是发现由于数据丢失而无法通过A/B测试来验证其解决方案。这是一个难以忍受的情况,我们尽一切努力避免这种情况。

开发一个水槽到多边形组件

为了确保端到端数据完整性,我们开发了一个接收器到doris组件。它建立在我们自己的Flink Stream API脚手架上,并通过Apache Doris的同性恋写作和Apache Flink的两阶段提交机构实现。最重要的是,我们具有针对异常的数据保护机制。

这是我们长期演变的结果。我们用来通过实现“一个标签ID的一个写作”来确保数据一致性。然后,我们意识到我们可以充分利用Apache Doris中的交易和Apache Flink的两阶段提交。

5

如上所述,这是两阶段提交的工作方式来保证数据一致性:

  1. 将数据写入本地文件;
  2. 第一阶段:apache doris的预订数据。将多丽丝事务ID保存到状态;
  3. 如果检查点失败,请手动放弃交易;如果检查点成功,请在第二阶段进行交易;
  4. 如果提交在多次重试后失败,则交易ID和相关数据将保存在HDF中,我们可以通过代理负载还原数据。

我们可以将单个检查点分为多个交易,以便在大型数据量的情况下,我们可以防止一个流负载花费更多的时间。

应用程序显示

这就是我们实现接收器的方式。该组件已阻止API调用和拓扑组件。通过简单的配置,我们可以通过流载荷将数据写入Apache Doris。

6

群集监视

对于集群和主机监控,我们采用了Apache Doris社区提供的指标模板。对于数据监视,除了模板指标外,我们还添加了流加载请求号和加载率。

7

我们关注的其他指标包括数据编写速度和任务处理时间。对于异常情况,我们将以电话,消息和电子邮件的形式收到通知。

8

关键要点

成功的A/B测试的配方是快速计算和高数据完整性。为此,我们在Apache Flink中实现了两步聚合方法,利用了Apache Doris的汇总模型,实现的视图和简短的索引。然后,我们开发了一个接收器到doris组件,该组件是通过apache doris的同性努力和apache flink的两阶段提交机制实现的。