我们很高兴欢迎 Superology 的数据架构师 Marijan Ralasic 作为我们博客的嘉宾。继续阅读,了解 Superology 如何将 ClickHouse 与 Kafka 结合使用来为客户提供定量数据支持。
Superology 是一家经验丰富的产品科技公司。自 2012 年以来,我们一直在体育博彩行业进行创新。2017 年被 Superbet 集团收购后,我们成为了该行业领先力量之一。如今,我们的平台被数十万人使用,每天处理数百万笔交易。为了满足用户的需求并实现业务目标,我们在工作的各个层面都采用数据驱动的方法。
我们重视个人成长,也重视公司成长。因此,我们不遵循传统的企业模式,而是赋予员工权力,让他们充分发挥自己的才能,端到端地掌控自己的工作。
收集客户定量数据
定量数据是可以被企业轻松计数或衡量的,是具体且无偏差的数据点。Superology 使用定量数据创建报告,使用统计工具对其进行分析,并创建随机实验过程。从 Superology 的角度来看,定量数据包括衡量指标,例如统计应用或网站访问次数、客户点击特定页面的次数、我们社交部分的评论和关注者数量,以及各种转化事件和跳出率。我们使用这些数据来修改我们的客户体验,以提高应用程序的满意度和实用性。我们希望为那些想要查找体育统计数据、参与社交活动并总体上享受体育娱乐行业的人们提供最佳体验。
Google protobuf
为了收集这些数据,我们使用 Google 协议缓冲区。协议缓冲区 (Protobuf) 是一种免费且开源的跨平台数据格式,用于序列化结构化数据。该方法涉及一种接口描述语言,用于描述某些数据的结构,以及一个从该描述生成源代码的程序,用于生成或解析表示结构化数据的字节流。由于我们收集的数据结构可能会有所不同,因此我们决定使用 oneof 字段来处理动态属性,并指定消息中只能设置一系列字段中的一个。我们的数据以批处理方式序列化,因此单个 protobuf 消息可以包含各种事件和事件类型。以下是我们使用的 proto 方案示例。
syntax = "proto3";
import "google/protobuf/wrappers.proto";
// This is base event for analytics
message BaseMessage {
string id = 1;
oneof Events {
Event1 event_1 = 101;
Event2 event_2 = 201;
Event3_SubEvent1 event_subevent_1 = 301;
Event3_SubEvent2 event_subevent_2 = 302;
…
Event4 event_4 = 401;
…
};
string event_type = 3;
string session_id = 4;
bool gdpr_accepted = 5;
}
message Event1 {
}
message Event2 {
bool property1 = 1;
}
message Event3_SubEvent1 {
string property1 = 1;
string property2 = 2;
…
}
message Event3_SubEvent2 {
string property1 = 1;
string property2 = 2;
…
}
message Event4 {
google.protobuf.FloatValue property1 = 1;
}
}
ClickHouse Kafka 引擎和协议缓冲区
ClickHouse 具有内置的 Kafka 连接器,即 Kafka 引擎,并且 ClickHouse 已实现的输入类型之一是 Protobuf。此格式需要外部格式架构,并请记住架构在查询之间会被缓存。使用给定的 protobuf 架构,ClickHouse 会自动跟踪已传递的消息,因此每个组中的消息仅计算一次。快速可靠是我们正在寻找的解决方案,而 ClickHouse 已经实现了。我们的 ClickHouse 实现允许我们轻松地水平和垂直扩展。每个生成的 message 都会被导入到我们的“大型”原始表中,在这里,ClickHouse 的列式结构为我们提供了极好的扩展性。由于数据容易发生变化,我们确实允许更改我们的 proto 方案,但是,我们只允许添加新字段并扩展我们的 proto 方案。这样,我们可以确保始终向后兼容。使用 ALTER TABLE 和 ADD COLUMN 子句,向我们的原始表添加列/字段非常容易。如果我们想停止使用某个属性,我们会弃用 protoscheme 中相应的字段,并在我们的原始表中注释该列已弃用。这样,我们就可以保持历史数据的完整性,并且数据导入将照常继续。数据会在我们的磁盘上保留一段时间,然后使用分层存储发送到 S3。
过滤和转换我们的数据
原始表使用物化视图进一步扩展,并过滤出我们真正想要分析的数据。我们使用在我们的 oneof 字段中定义的事件来过滤数据,从而使我们能够仅查看客户行为的某个方面,例如页面点击。使用过滤选项,我们保留了特定事件或流消息的可追溯性,从而为我们提供了更多调试和深入分析选项。最后,我们根据我们的要求转换数据,从而实现不同的视角,例如漏斗分析和客户分类。最终的转换是特定操作的聚合视图,这些操作最终将成为我们报告仪表板上的某个值。
实验
我们不仅将数据用于报告,还对其进行了广泛的研究。ClickHouse 在管理 AB 测试和其他实验方面帮助了我们很多,不仅因为它们内置了统计函数,例如 welchTTest
、mannWhitneyUTest
和其他有用的函数,还因为通过利用 ClickHouse 架构使我们能够更容易、更高效地进行 AB 测试。我们经常使用 贝叶斯 A/B 测试 方法来做出业务决策。这些方法比传统方法在计算上更昂贵,但 ClickHouse 凭借其丰富的统计函数集,使我们能够创建工作流程,从而能够做出快速、可解释和准确的决策。
未来
我们计划通过将其与 MindsDB 耦合来丰富 ClickHouse 架构,这将使我们能够在数据库级别创建机器学习架构。此外,我们计划将 ClickHouse 转换推回 Kafka 流,使我们能够在下游应用程序中使用数据并丰富其他数据流。我们期待着 JSON 数据类型等新功能的出现,并希望与 ClickHouse Inc. 建立长期而成功的合作关系。