Apache kafka 使用模糊匹配重复数据消除进行流处理的最佳做法

Apache kafka 使用模糊匹配重复数据消除进行流处理的最佳做法,apache-kafka,bigdata,apache-kafka-streams,Apache Kafka,Bigdata,Apache Kafka Streams,我正在设计一个数据管道,它从读取的平面文件开始。文件中的每一行都是一条记录 一旦加载,每个记录都将被解析、转换和充实。这与其他记录无关 作为最后一步,我希望基于多个记录字段的模糊匹配来消除重复记录。要做到这一点,我想得到2个记录的所有组合 目前我使用sql表作为缓冲区。我的表包含所有记录,我将表与其自身联接,在键不同的条件下,名称与的模糊匹配听起来像是: CREATE TABLE temp_tblSoundsLikeName AS SELECT DISTINCT clients1.client_

我正在设计一个数据管道,它从读取的平面文件开始。文件中的每一行都是一条记录

一旦加载,每个记录都将被解析、转换和充实。这与其他记录无关

作为最后一步,我希望基于多个记录字段的模糊匹配来消除重复记录。要做到这一点,我想得到2个记录的所有组合

目前我使用sql表作为缓冲区。我的表包含所有记录,我将表与其自身联接,
在键不同的条件下,名称与
的模糊匹配听起来像是

CREATE TABLE temp_tblSoundsLikeName AS
SELECT DISTINCT clients1.client_name client_name1,
                clients1.client_id client_id1,
                clients2.client_name client_name2,
                clients2.client_id client_id2,
FROM tblClients clients1 
  JOIN tblClients clients2 
    ON clients1.client_name != clients2.client_name
       AND clients1.ban_id < clients2.ban_id
       AND SUBSTRING_INDEX(clients2.client_name,' ',1) SOUNDS LIKE SUBSTRING_INDEX(clients1.client_name,' ',1)
CREATE TABLE temp_tblSoundsLikeName AS
选择DISTINCT clients1.client_name client_name 1,
clients1.client_id client_id 1,
clients2.client_name client_name 2,
clients2.client_id client_id2,
来自TblClient客户端1
加入TBL客户端2
在客户端1上。客户端名称!=clients2.client\u名称
和clients1.ban_id
temp_tblSoundsLikeName中的记录表示重复项,我将它们合并到tblclient中

我在考虑使用卡夫卡流,这是我过去没有使用过的。当消息
M
(表示记录
R
)到达重复数据消除主题时,我希望我的应用程序使用它,并因此生成一条包含来自
R
和另一条消息
R'
的信息的消息,其中
R'
是过去5小时内到达重复数据消除阶段的任何消息。这些消息包含两条消息的组合,应该发送到另一个主题,在那里它们可以通过匹配和模糊匹配条件进行过滤,最后一个阶段是合并重复记录,并使用kafka connect JDBC将合并的记录推送到RDBMS

但是,我不知道如何为所有这些
R
R'
组合创建消息。 这可能吗?
这是Kafka Streams的一个很好的用例吗?

使用Kafka的Streams API进行重复数据消除的起点是
EventDeduplicationLambdaIntegrationTest.java
at(Confluent Platform 3.3.0/Apache Kafka 0.11.0:的直接链接)

方法
isDuplicate
控制是否将新事件视为重复事件:

private boolean isDuplicate(final E eventId) {
  long eventTime = context.timestamp();
  WindowStoreIterator<Long> timeIterator = eventIdStore.fetch(
      eventId,
      eventTime - leftDurationMs,
      eventTime + rightDurationMs);
  boolean isDuplicate = timeIterator.hasNext();
  timeIterator.close();
  return isDuplicate;
private boolean isdopplicate(最终E事件ID){
long eventTime=context.timestamp();
WindowsStoreIterator timeIterator=eventIdStore.fetch(
eventId,
事件时间-leftDurationMs,
eventTime+rightDurationMs);
布尔值isDuplicate=timeIterator.hasNext();
timeIterator.close();
返回两份;
eventIdStore
是一个所谓的“状态存储”,它允许您从过去的事件中记住信息,以便您可以做出“重复的是/否”决策

当消息M(表示记录R)时到达重复数据消除主题,我希望我的应用程序使用该主题,从而生成一条包含来自R和另一条消息R'的信息的消息,其中R'是过去5小时内到达重复数据消除阶段的任何消息。这些消息(包含两条消息的组合)应发送到另一个主题,其中它们可以通过匹配和模糊匹配条件进行过滤,最后一个阶段是合并重复的记录,并使用kafka connect JDBC将合并的记录推送到RDBMS


您可以选择在一个步骤中执行“给定一个新的
R
,让我们查找所有
R'
消息,然后执行重复数据消除”,即在一个处理步骤中执行此操作(与上面的示例类似,使用所谓的
转换器
),而不是创建一组新的下游消息,这会导致写放大(
1*R=>N*“(R/R')”
下游消息)。状态存储可用于跟踪所有以前的消息,包括您感兴趣的各种
R'
何时到达。

使用Kafka的Streams API进行重复数据消除的起点是
EventDeduplicationLambdaIntegrationTest.java
at(Confluent Platform 3.3.0/Apache Kafka 0.11.0:的直接链接)

方法
isDuplicate
控制是否将新事件视为重复事件:

private boolean isDuplicate(final E eventId) {
  long eventTime = context.timestamp();
  WindowStoreIterator<Long> timeIterator = eventIdStore.fetch(
      eventId,
      eventTime - leftDurationMs,
      eventTime + rightDurationMs);
  boolean isDuplicate = timeIterator.hasNext();
  timeIterator.close();
  return isDuplicate;
private boolean isdopplicate(最终E事件ID){
long eventTime=context.timestamp();
WindowsStoreIterator timeIterator=eventIdStore.fetch(
eventId,
事件时间-leftDurationMs,
eventTime+rightDurationMs);
布尔值isDuplicate=timeIterator.hasNext();
timeIterator.close();
返回两份;
eventIdStore
是一个所谓的“状态存储”,它允许您从过去的事件中记住信息,以便您可以做出“重复的是/否”决策

当消息M(表示记录R)时到达重复数据消除主题,我希望我的应用程序使用该主题,从而生成一条包含来自R和另一条消息R'的信息的消息,其中R'是过去5小时内到达重复数据消除阶段的任何消息。这些消息(包含两条消息的组合)应发送到另一个主题,其中它们可以通过匹配和模糊匹配条件进行过滤,最后一个阶段是合并重复的记录,并使用kafka connect JDBC将合并的记录推送到RDBMS

您可以选择在一个步骤中执行“给定一个新的
R
,让我们查找所有
R'
消息,然后执行重复数据消除”,即在一个处理步骤中执行此操作(与上面的示例类似,使用所谓的
转换器
),而不是创建一组新的下游消息,这会导致写放大(
1*R=>N*“(R/R')”
下游消息)。状态存储可用于跟踪所有以前的消息