基于 Flink 的百亿数据去重实践

在工作中经常会遇到去重的场景,例如基于 App 的用户行为日志分析系统,用户的行为日志从手机客户端上报到 Nginx 服务端,通过 Logstash、Flume 或其他工具将日志从 Nginx 写入到 Kafka 中。

由于用户手机客户端的网络可能出现不稳定,所以手机客户端上传日志的策略是:宁可重复上报,也不能丢日志。所以导致 Kafka 中必然会出现日志重复的情况,即:同一条日志出现了 2 条或 2 条以上。

通常情况下,Flink 任务的数据源都是 Kafka,若 Kafka 中数据出现了重复,在实时 ETL 或者流计算时都需要考虑对日志主键进行去重,否则会导致流计算结果偏高或结果不准确的问题,例如用户 a 在某个页面只点击了一次,但由于日志重复上报,所以用户 a 在该页面的点击日志在 Kafka 中出现了 2 次,最后统计该页面的 click 数时,结果就会偏高。

这里只阐述了一种可能造成 Kafka 中数据重复的情况,在生产环境中很多情况都可能造成 Kafka 中数据重复,这里不一一列举,本节主要讲述出现了数据重复后,该如何处理。

实现去重的通用解决方案

Kafka 中数据出现重复后,各种解决方案都比较类似,一般需要一个全局 set 集合来维护历史所有数据的主键。当处理新日志时,需要拿到当前日志的主键与历史数据的 set 集合按照规则进行比较,若 set 集合中已经包含了当前日志的主键,说明当前日志在之前已经被处理过了,则当前日志应该被过滤掉,否则认为当前日志不应该被过滤应该被处理,而且处理完成后需要将新日志的主键加入到 set 集合中,set 集合永远存放着所有已经被处理过的数据。程序流程图如下图所示:

你可能感兴趣的:(大数据实时计算引擎,Flink,实战与性能优化)