Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何在两个kafka流或数据库表之间比较(10亿条记录)数据_Database_Apache Kafka_Apache Kafka Streams_Ksqldb - Fatal编程技术网

Database 如何在两个kafka流或数据库表之间比较(10亿条记录)数据

Database 如何在两个kafka流或数据库表之间比较(10亿条记录)数据,database,apache-kafka,apache-kafka-streams,ksqldb,Database,Apache Kafka,Apache Kafka Streams,Ksqldb,我们通过CDC将数据从DB2表1发送到Kafka主题1。 我们需要在DB2数据和Kafka主题之间进行协调。 我们有两个选择: a将所有kafka主题数据作为table-1-copy放到DB2中,然后在table-1和table-1-copy之间进行左外部连接,以查看不匹配的记录,创建增量并将其推回到kafka中。 问题:可伸缩性——我们的数据集大约有10亿条记录,我不确定DB2DBA是否会让我们运行这样一个巨大的连接操作,这个操作可以轻松地持续15-20分钟 b将DB2再次推回到并行的kafk

我们通过CDC将数据从DB2表1发送到Kafka主题1。 我们需要在DB2数据和Kafka主题之间进行协调。 我们有两个选择:

a将所有kafka主题数据作为table-1-copy放到DB2中,然后在table-1和table-1-copy之间进行左外部连接,以查看不匹配的记录,创建增量并将其推回到kafka中。 问题:可伸缩性——我们的数据集大约有10亿条记录,我不确定DB2DBA是否会让我们运行这样一个巨大的连接操作,这个操作可以轻松地持续15-20分钟

b将DB2再次推回到并行的kafka topic-1-copy中,然后执行一些基于kafka流的解决方案,在kafka topic-1和topic-1-copy之间执行左外连接。我仍在绕着卡夫卡河和左外连接头。 我不确定在kafka streams中使用窗口系统是否能够比较topic-1和topic-1-copy的全部内容

更糟糕的是,卡夫卡的主题1是一个紧凑的主题, 因此,当我们将DB2中的数据推回到Kafka topic-1-copy中时,我们无法确定地启动Kafka topic压缩循环,以确保在对topic-1和topic-1-copy运行任何类型的比较操作之前,它们都被完全压缩

C,还有其他的框架选项吗?我们可以考虑这个问题吗?


理想的解决方案必须针对任何大小的数据进行扩展。

我看不出有任何理由不能在Kafka Streams或KSQL中这样做。两者都支持表联接。这是假设数据的格式是受支持的

键压缩不会影响结果,因为Streams和KSQL都将构建连接两个表的正确最终状态。如果已运行压缩,则需要处理的数据量可能会减少,但结果将是相同的

例如,在ksqlDB中,您可以将这两个主题作为表导入,并执行联接,然后根据topic-1表为null进行筛选,以查找缺少的行列表

-使用0.9 ksqlDB的示例,假设为INT主键: -从主主题创建表: 创建表1 ROWKEY INT主键, 使用kafka_topic='topic-1',value_format='?'; -从第二个主题创建表: 创建表2 ROWKEY INT主键, 使用卡夫卡_topic='topic-1-copy',value_format='?'; -创建仅包含缺少的键的表: 创建缺少的作为 从表2中选择T2.*从表2中选择左连接表 其中T1.ROWKEY=null; 这种方法的好处是,缺失行的缺失表将自动更新:当您从源DB2实例提取缺失行并将其生成到主题1时,“缺失”表中的行将被删除,即,您将看到生成到缺失主题的墓碑

您甚至可以扩展此方法以查找topic-1中已存在但不再在源数据库中的行:

-对上面的表1和表2使用相同的DDL语句 -执行连接: 创建加入为 从表2 T2中选择*完全外部连接表1 T1; -检测数据库中不在主题中的行: 创建缺少的作为 从连接中选择* 其中T1_ROWKEY=null; -检测主题中不在数据库中的行: 创建额外的作为 从连接中选择* 其中T2_ROWKEY=null; 当然,您需要相应地调整集群的大小。ksqlDB集群越大,处理数据的速度就越快。它还需要磁盘上的容量来实现表


可以通过主题上的分区数设置的最大并行化量。如果您只有一个分区,那么数据将按顺序处理。如果使用100个分区运行,那么您可以使用100个CPU核心来处理数据,前提是您运行了足够多的ksqlDB实例。默认情况下,每个ksqlDB节点将为每个查询创建4个流处理线程,但如果服务器有更多的内核,则可以增加该线程数

您可以使用KSQL和steam表连接吗?您需要通过对数据进行分区并让多个KSQL服务器来进行扩展,但对我来说,这似乎是合理的,并且是可扩展的。这基本上是选项b,其中副本是流,主题1是表。关于压缩,我相信KSQL应该注意这里的密钥更新。