【发布时间】:2019-05-14 16:50:10
【问题描述】:
说,我有一个从 KAFKA 读取一批数据的应用程序,它使用传入消息的键并对 HBase 进行查询(从 HBase 读取这些键的当前数据),进行一些计算并写入数据返回 HBase 获取相同的密钥集。例如
{K1, V1}, {K2, V2}, {K3, V3}(来自 KAFKA 的传入消息) --> 我的应用程序(从 HBase 读取 K1、K2 和 K3 的当前值,使用传入值 V1 , V2 和 V3 进行一些计算,并在处理完成后将 K1 (V1+x)、K2 (V2+y) 和 K3(V3+z) 的新值写回 HBase。
现在,假设我有一个 KAFKA 主题分区和 1 个消费者。我的应用程序有一个正在处理数据的消费者线程。
问题是说 HBase 出现故障,此时我的应用程序停止处理消息,并且在 KAFKA 中建立了巨大的延迟。即使我有能力增加分区数量和相应的消费者,但由于 HBase 中的 RACE 条件,我无法增加其中任何一个。 HBase 不支持行级锁定,所以现在如果我增加分区的数量,相同的键可能会转到两个不同的分区,并相应地转到两个不同的消费者,他们可能最终处于 RACE 状态,最后写入的人就是赢家。我必须等到所有消息都得到处理后才能增加分区数。
例如
HBase 出现故障 --> 最初我有一个主题分区,并且有未处理的消息 --> 分区 0 中的 {K3, V3} --> 现在我增加了分区的数量,并且带有键 K3 的消息现在是现在假设在分区 0 和 1 中 --> 然后从分区 0 消费的消费者和从分区 1 消费的另一个消费者最终将竞争写入 HBase。
有解决问题的办法吗?当然,由处理消息的消费者锁定密钥 K3 不是解决方案,因为我们正在处理大数据。
【问题讨论】:
标签: apache-kafka kafka-consumer-api