Criteo在大规模数据工程优化上经验 - Nam


如何将 230 PB 的原始数据转化为可行的解决方案?

在我们快节奏的数字时代,每天通过 Internet 传输数十万 TB 的数据,访问正确的信息是保持相关性的关键。
从原始、无组织的数据中提取相关信息的能力仍然是业务决策的关键要素。

在 Criteo,通过数据衡量我们的绩效是非常重要的:
新的广告活动有多少点击会带来转化?在目标受众中,谁与横幅互动最多?哪一个广告组消耗了大部分预算?它交付了吗?
如何通过系统的方法来解决这些问题?答案:报告数据

在 Criteo,报告管道可以包括收集存储可视化数据的过程。我们通过客户的网站或我们的内部和外部应用程序收集数据。我们将数据存储在自托管数据中心。我们在分析仪表板中显示数据以评估我们的绩效。

Criteo 数据报告的基础架构
每当有广告要向用户展示时,Criteo 就会参与拍卖,我们会出价购买该展示可能性。这就是我们所说的投标请求。
每过一分钟,Criteo 的 TLA(顶级应用程序)就会通过我们的 Kafka 发送——这是一个事件流平台,有4 亿次投标请求、200 万次显示和大约2次互联网上的点击。
所有这些数字和未处理的数据都将通过我们的数据管道进入 Criteo 数据基础设施。

Criteo 报告管道的简化工作流程

上图是我们报告数据架构的最简化版本。我们有两个主要的存储系统:一个是 HDFS(Hadoop 文件系统),另一个是 Vertica。
为了在不丢失任何信息的情况下将数据从一个系统传输到另一个系统,我们拥有一套可靠的内部数据编排和数据质量监控工具(查看这个关于我们的数据调度程序的精彩系列)。这些子系统就像运转良好的机器上的齿轮一样工作,以提供最新的业务报告。
在这些应用程序的底层,我们使用 Scala、Python 和一点点 Java 编写代码。SQL 是必须的,我们也在 Spark 应用程序中练习微调一些对资源敏感的参数。


上图是我们所有自动化工作在内存和计算能力方面的预测。

右上角是我们最繁重的工作之一。要使作业完成一个执行周期,需要一个 CPU 42 天。但是由于我们的分布式系统,这项工作只运行了一个多小时
我们的报告基础架构并不复杂,但我们必须处理两件事:数据增长计算限制
我们的数据增长并且呈指数增长。我的老经理曾经告诉我,我们的 Hadoop 数据中心有大约 230 PB 的数据。在我拿到它之前,我不知道它有多大。而且这个数字越来越大。尽管我们努力清理遗留数据,但趋势仍然是积极的。所以我们每天都问自己的问题是:如何让我们的大数据变得更小?

我们拥有的数据越多,我们的应用程序运行得越慢。这很快就会成为瓶颈,而我们的硬件是唯一的限制。我们可以不断增加更多的机器,但是计算能力跟不上数据的增长速度。

我们需要针对大规模进行优化!

如何进行大规模数据优化
为了回答本文开头提出的问题,我们需要将可用的数据及时、可靠且持续地呈现在我们的客户面前。
数据工程不是花哨的工作。这都是汗水和繁琐的过程。但它使整个事情继续进行。我们很高兴拥有我们的基础设施和站点可靠性工程师。毕竟,他们为我们奠定了坚实的基础。在该架构上,我们可以构建持久的数据管道。
但我们自己也有一套数据工程方面的最佳实践。这些技术要么来自多年的经验,要么来自某个人的专业知识。中间什么都没有。
这些原则帮助我们解决了大规模测量的答案。

1、数据分区
我们的报告渠道实际上是离线报告。这意味着我们会及时更新数据,但不是实时更新。最终用户会期望数据可用性有一个小的延迟(这称为延迟,但我们将在其他时间讨论)。
当我们进行离线数据处理时,我们是批量进行的。每小时,每天,甚至每周。然后我们将数据存储在相应的批处理中。这称为数据分区。它有很多用途,但大多数情况下它对操作有很大帮助。
当您将数据存储在小盒子中时,您可以通过指定盒子编号确切地知道在哪里可以找到您的数据。如果您希望修改、替换、删除,甚至只是调试,那么在数据的某个孤立部分而不是整个表上执行此操作要容易得多。
结论:分区数据有助于查询运行得更快,管道更不容易出错。

2、数据建模
当我们谈论报告数据时,在 Criteo,我们总是谈论两件事:维度指标
指标是反映营销活动绩效的真实值。它们是点击次数、展示次数或销售次数。维度是指标可以分解成的投影。它们是设备环境、活动类型或产品类别。
在 Criteo,为了使维度和指标协调工作,我们采用了通用的数据建模模式。该模型由一个包含许多指标和一些键的事实表组成。然后我们使用这些键与另一组维度表进行连接。这项工作产生了一个分析仪表板,其中包含可以分解为任何可用维度的指标。

3、数据质量控制
什么是坏数据?
答:数据错误、数据不完整或根本没有数据。
如果您显示的只是虚假信息,那么您的分析可视化就没有任何价值。我们在 Criteo 了解这一点,并且我们已针对质量差的数据采取了认真的措施。我们每天检查数据的一致性稳定性。

  • 一致性反映了我们的数据在多个数据集中的同质性程度。通过将一组汇总值与定义的事实来源进行比较,我们确保我们的报告始终具有可信赖的数据。
  • 稳定性反映了我们的数据不易波动的事实。我们检查指标的聚合值是否在合理范围内。

我们希望确保到达我们分析引擎的数据尽可能干净。因为归根结底,客户会查看这些数据。

所有上述技术都确保了我们的报告管道的流畅性和准确性。现在客户可以访问报告中的重要信息,我们的任务是在其整个生命周期内保持该信息的稳定和准确。