最佳实践|使用 RisingWave + Redpanda 进行实时广告效果分析

292 阅读5分钟

本文将为大家分享如何使用 RisingWave 来消费消息队列中的数据流并进行数据分析。我们将使用广告曝光和点击事件作为样本数据,并计算广告曝光后一分钟内的点击量。

常用的消息队列包括了 Apache Kafka、Apache Pulsar 等等。RisingWave 可以从各种消息队列系统中实时消费数据。在本文,我们使用 Redpanda 为例。

RisingWave 是新一代分布式流数据库,提供极简且高效的数据流处理与管理能力。相比于 Apache Spark Streaming、Apache Flink 等传统流处理系统,其更加易用、节省资源。

Redpanda 是一个兼容 Apache Kafka® 的流式数据平台。它从一开始就以性能和简单为前提。它不需要 Zookeeper®,不需要 JVM,也不需要修改代码。

1.概述

以下是广告曝光事件和点击事件的数据模型:

{
  "user_id": 2926375,
  "click_timestamp": "2022-05-11 16:04:06.416369",
  "impression_timestamp": "2022-05-11 16:04:06.273401",
  "ad_id": 8184596
}

对于不熟悉数字广告的用户来说,曝光即广告在 App 或网站上的一次展示。impression_timestamp是广告曝光的时间。在此数据模型中,impression_timestamp一定会比click_timestamp更小(更早),以确保只有印象之后的点击被计算在内。

2. 运行前提

  • 请确保你的环境中安装了 Docker[2] 和 Docker Compose[3]。请注意,Docker Compose 包含在 Windows 和 MacOS 的 Docker Desktop 中。如果你使用 Docker Desktop,请在启动演示集群之前确保它正在运行。
  • 确保 PostgreSQL[4]的交互式终端 psql 已安装在你的环境中。
    • 要在 macOS 上安装psql,请运行这个命令。 brew install postgres.
    • 要在 Ubuntu 上安装psql,请运行这个命令。 sudo apt-get install postgresql-client.

3. 第 1 步:启动演示集群

首先,把 risingwave-demo 仓库克隆到你的环境中。

git clone https://github.com/risingwavelabs/risingwave-demo.git

现在让我们定位到 ad-click 目录,并用 docker compose 启动演示集群。

cd ad-click
docker-compose up -d

我们将会启动一个 Redpanda 实例和必要的 RisingWave 组件,包括前端节点、计算节点、元数据节点和 MinIO。

我们在 docker-compose 中还打包了一个负载生成器。它将生成一些随机数据并发送至 Redpanda。

4. 第 2 步:将 RisingWave 连接到 Redpanda 流上

现在让我们连接到 RisingWave,以便我们能够管理数据流并进行数据分析。

psql -h localhost -p 4566

请注意,RisingWave 可以通过 psql 连接,默认端口为 4566,而Redpanda 则是监听端口 9092。如果你打算直接从 Redpanda 摄取数据,你应该使用端口 9092。

我们将用如下 SQL 语句来设置与 Redpanda 的连接。

create source ad_source (
  user_id bigint,
  ad_id bigint,
  click_timestamp timestamp,
  impression_timestamp timestampwith (
  'connector' = 'kafka',
  'kafka.topic' = 'ad_clicks',
  'kafka.brokers' = 'message_queue:9092',
  'kafka.scan.startup.mode' = 'latest'row format json;

让我们再深入了解一下 WITH 中的参数。

  • 'connector' = 'kafka': 由于 Redpanda 与 Kafka 兼容,它可以以与Kafka 相同的方式连接。
  • 'kafka.topic' = 'user_activities': Redpanda 的 topic。
  • 'kafka.brokers' = 'redpanda:9092': Redpanda Broker 的网络地址。
  • 'kafka.scan.startup.mode' = 'earliest': 这意味着 RisingWave 将从流中最早的记录开始消费数据。或者,你也可以将此参数设置为 latest,这意味着 RisingWave 将从最新的记录开始消耗数据。

5. 第 3 步:分析数据

我们将定义一个物化视图来计算每个广告在曝光后一分钟内的点击量。

通过物化视图,每次有新的事件出现时,RisingWave 将只会进行增量计算。一但新事件的计算完成后,结果就会被持久化。

create materialized view m_click_statistic as
select
  ad_id,
  count(user_id) as clicks_count
from
  ad_source
where
  click_timestamp is not null
  and impression_timestamp < click_timestamp
  and impression_timestamp + interval '1' minute >= click_timestamp
group by
  ad_id;

我们希望只算被点击过的广告曝光,因此我们使用click_timestamp is not null的条件来限制范围。我们希望排除任何在曝光后一分钟内的点击,因此这里有一个impression_timestamp + interval '1' minute >= click_timestamp条件。

6. 第 4 步:查询结果

RisingWave旨在通过对数据流进行预聚合,实现秒级实时性和以及低查询延迟。由此一来,下游应用可以在极短瞬间内查询结果。

我们用以下语句来进行查询:

select * from m_click_statistic;

其结果可能是这样的:

ad_id | clicks_count
------+--------------
    1 | 356
    2 | 340
    3 | 319
    4 | 356
    5 | 333
    6 | 368
    7 | 355
    8 | 349
    9 | 359
(9 rows)

如果你多次查询,你将能够看到,随着新事件的出现,结果在不断变化。例如,如果你在 10 秒后再次运行查询,你可能得到如下结果:

ad_id | clicks_count
------+--------------
    1 | 362
    2 | 345
    3 | 325
    4 | 359
    5 | 335
    6 | 369
    7 | 360
    8 | 353
    9 | 360
(9 rows)

结束后,你可以执行以下命令来删除 Docker 容器:

docker-compose down

7. 总结

在本教程中,我们将 RisingWave 连接至 Redpanda 流,并进行了基本的广告性能分析。该用例有点简单,旨在提供启发而非提供完整案例。如果你对某个特定的使用场景感兴趣,请在 RisingWave 用户社区中告诉我们。

关于 RisingWave

RisingWave 是一款分布式 SQL 流处理数据库,旨在帮助用户降低实时应用的的开发成本。作为专为云上分布式流处理而设计的系统,RisingWave 为用户提供了与 PostgreSQL 类似的使用体验,并且具备比 Flink 高出 10 倍的性能以及更低的成本。

🔧如果你还不知道如何上手 RisingWave,请体验中文入门教程:www.risingwavetutorial.com/

💻想要更深入地理解并使用 RisingWave,请阅读中文用户文档:zh-cn.risingwave.com/docs