我正在使用 Kafka Streams (v0.10.0.1) 编写一个应用程序,并希望通过查找数据来丰富我正在处理的记录。该数据(带时间戳的文件)每天(或每天 2-3 次)写入 HDFS 目录。
我怎样才能将其加载到Kafka Streams
应用并结合实际KStream
?
当新文件到达 HDFS 时重新读取数据的最佳实践是什么?
或者切换到更好Kafka Connect
并将 RDBMS 表内容写入 Kafka 主题,该主题可供所有 Kafka Streams 应用程序实例使用?
Update:
按照建议卡夫卡连接将是要走的路。因为查找数据是在 RDBMS 上更新的daily我正在考虑按计划运行 Kafka Connect一次性工作 http://docs.confluent.io/3.0.0/connect/intro.html而不是保持连接始终打开。是的,因为语义和保持连接始终打开并确保它不会被中断的开销......等等。对我来说,在这种情况下进行预定的获取看起来更安全。
查找数据不大,记录可能删除/添加/修改。我也不知道如何始终将完整转储到 Kafka 主题并截断以前的记录。启用日志压缩并为已删除的键发送空值可能不起作用,因为我不知道源系统中删除了哪些内容。另外,据我所知,当压缩发生时我无法控制。
推荐的方法确实是将查找数据也摄取到 Kafka 中——例如通过 Kafka Connect——正如您在上面所建议的那样。
但在这种情况下,如何安排 Connect 作业每天运行,而不是连续从源表中获取,这在我的情况下是不必要的?
也许您可以更新您的问题,您不想让 Kafka Connect 作业连续运行?您是否担心资源消耗(数据库上的负载),您是否担心处理的语义(如果不是“每日更新”),或者......?
Update:正如所建议的那样,Kafka Connect 将是最佳选择。由于查找数据每天都会在 RDBMS 中更新,因此我正在考虑将 Kafka Connect 作为一项计划的一次性作业运行,而不是保持连接始终打开。是的,因为语义和保持连接始终打开并确保它不会被中断的开销......等等。对我来说,在这种情况下进行预定的获取看起来更安全。
卡夫卡连接is安全,并且 JDBC 连接器的构建正是为了以健壮、容错和高性能的方式将数据库表输入 Kafka(已经有许多生产部署)。所以我建议不要仅仅因为“它看起来更安全”而退回到“批量更新”模式;就我个人而言,我认为触发每日摄取在操作上不如仅仅保持其运行以进行连续(实时!)摄取更方便,而且它还会给您的实际用例带来一些缺点(请参阅下一段)。
但当然,您的里程可能会有所不同 - 因此,如果您决定每天更新一次,那就去做吧。但是,您会失去 a) 在丰富发生时使用最新的数据库数据丰富传入记录的能力,并且相反,b) 您实际上可能会使用陈旧/旧数据丰富传入记录,直到下一天更新已完成,这很可能会导致您向下游发送/可供其他应用程序使用的数据不正确。例如,如果客户更新了她的送货地址(在数据库中),但您每天只将此信息提供给流处理应用程序(以及可能的许多其他应用程序)一次,则订单处理应用程序会将包裹运送到错误的地方直到下一次每日摄取完成为止。
查找数据不大,记录可能会被删除/添加/修改。我也不知道如何始终将完整转储到 Kafka 主题并截断以前的记录。启用日志压缩并为已删除的键发送空值可能不起作用,因为我不知道源系统中删除了哪些内容。
Kafka Connect 的 JDBC 连接器已自动为您处理此问题:1. 它确保数据库插入/更新/删除正确反映在 Kafka 主题中,2. Kafka 的日志压缩确保目标主题不会超出范围。也许您可能想阅读文档中的 JDBC 连接器,以了解您可以免费获得哪些功能:http://docs.confluence.io/current/connect/connect-jdbc/docs/ http://docs.confluent.io/current/connect/connect-jdbc/docs/ ?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)