我正在使用Kafka Streams(v0.10.0.1)编写一个应用程序,并希望通过查找数据丰富我正在处理的记录。此数据(带时间戳的文件)每天(或每天2-3次)写入HDFS目录。
如何在Kafka Streams
应用程序中加载它并加入实际的KStream
?
当新文件到达时,从HDFS重新读取数据的最佳做法是什么?
或者更好地切换到Kafka Connect
并将RDBMS表内容写入Kafka主题,可以被所有Kafka Streams应用程序实例使用?
更新:
正如建议 Kafka Connect 将是要走的路。由于查找数据是在每日的基础上在RDBMS中更新的,因此我考虑将Kafka Connect作为计划的one-off job运行,而不是始终保持连接打开。是的,因为语义和保持连接始终打开的开销,并确保它不会被中断..等等。对于我来说,在这种情况下进行预定的提取看起来更安全。
查找数据不大,记录可能删除/添加/修改。我不知道如何总是完全转储到Kafka主题并截断以前的记录。启用日志压缩并为已删除的密钥发送空值可能不起作用,因为我不知道源系统中已删除的内容。另外AFAIK我在压实发生时没有控制权。
答案 0 :(得分:3)
推荐的方法确实是将查询数据摄取到Kafka中 - 例如通过Kafka Connect - 如上所述。
但在这种情况下,如何安排Connect作业每天运行,而不是从源表中连续获取,这在我的情况下是不必要的?
也许您可以更新您不希望连续运行Kafka Connect作业的问题?您是否担心资源消耗(数据库上的负载),如果它不是“每日udpates”,您是否关注处理的语义,或者......?
<强>更新强> 正如所建议的那样,Kafka Connect将是您的最佳选择。因为查询数据每天在RDBMS中更新,所以我考虑将Kafka Connect作为预定的一次性工作运行,而不是始终保持连接打开。是的,因为语义和保持连接始终打开的开销,并确保它不会被中断..等等。对于我来说,在这种情况下进行预定的提取看起来更安全。
Kafka Connect 是安全的,并且JDBC连接器的构建正是为了以强大,容错和高效的方式将数据库表提供给Kafka(已经有许多生产部署)。所以我建议不要因为“它看起来更安全”而回退到“批量更新”模式;就个人而言,我认为触发每日摄入操作在操作上不仅仅是保持连续(和实时!)摄取的运行,而且还会导致实际用例的几个缺点(见下一段)。
但是,当然,您的里程可能会有所不同 - 所以如果您每天只更新一次,那就去吧。但是你失去了a)能够在浓缩发生的时间点用最新的数据库数据来丰富你的传入记录,反之,b)你可能实际上用过时/旧数据丰富传入的记录直到下一个每日更新已完成,这很可能会导致您向下游发送不正确的数据/使其他应用程序可供使用。例如,如果客户更新了她的送货地址(在数据库中),但您只能每天一次将此信息提供给您的流处理应用程序(可能还有许多其他应用程序),那么订单处理应用程序会将包裹发送给错误地址,直到下一次每日摄取完成。
查找数据不大,可以删除/添加/修改记录。我不知道如何总是完全转储到Kafka主题并截断以前的记录。为已删除的密钥启用日志压缩和发送空值可能不会起作用,因为我不知道源系统中已删除的内容。
Kafka Connect的JDBC连接器已经为您自动处理:1。它确保数据库插入/更新/删除正确反映在Kafka主题中,并且2. Kafka的日志压缩确保目标主题不会增长出界。也许您可能想要阅读文档中的JDBC连接器,以了解您免费获得哪些功能:http://docs.confluent.io/current/connect/connect-jdbc/docs/?