卡夫卡消费者写入多个文件

时间:2018-07-30 16:59:43

标签: file-io apache-kafka

我必须实现一个kafka使用者,该使用者可以从主题中读取数据,然后根据有效负载中存在的帐户ID(将接近百万)将其写入文件。假设每秒大约有3K个事件。可以为每个读取的消息打开和关闭文件吗? 还是应该考虑使用其他方法?

3 个答案:

答案 0 :(得分:0)

如果您的帐户ID重复,那么最好开窗口。您可以通过窗口汇总1分钟内的所有事件,然后可以按键对事件进行分组并立即处理所有accountId。

这样,您不必多次打开文件。

答案 1 :(得分:0)

我假设以下情况:

  1. 每个帐户ID将是唯一的,并将具有其自己的唯一文件。
  2. 文件中的数据稍有延迟是可以的,即文件中的数据将接近实时。
  3. 每个事件读取的数据不是很大。

解决方案:

  1. Kafka Consumer读取数据并写入数据库,最好是NoSQL db。
  2. 一个单独的单线程定期读取数据库中是否有新记录插入,并按accountId将它们分组。
  3. 然后遍历accoundId,并为每个accountId打开File,立即写入数据,关闭File,然后移至下一个accountId。

优势:

  1. 您的使用者不会因为文件处理而被阻止,因为这两个操作是分离的。
  2. 即使文件处理失败,数据也始终存在于数据库中以进行重新处理。

答案 2 :(得分:0)

不能为每条消息打开一个文件,您应该缓冲固定数量的消息,然后在每个限制时写入文件。


您可以使用Confluent提供的HDFS Kafka Connector进行管理。

例如,如果配置了FieldPartitioner并写入给定store.url=file:///tmp的本地文件系统,则将为主题中的每个唯一accountId字段创建一个目录。然后,flush.size配置确定单个文件中最终将包含多少条消息

由于HDFS库包含在Kafka Connect类路径中,并且它们支持本地文件系统,因此不需要安装Hadoop

创建两个属性文件后,您将以这种方式启动

bin/connect-standalone worker.properties hdfs-local-connect.properties