Kafka Streams在HDFS上查找数据

Bru*_*ald 6 hadoop apache-kafka apache-kafka-streams confluent apache-kafka-connect

我正在用Kafka Streams(v0.10.0.1)编写一个应用程序,并希望用查找数据丰富我正在处理的记录.此数据(带时间戳的文件)每天(或每天2-3次)写入HDFS目录.

如何在Kafka Streams应用程序中加载它并加入实际KStream
当新文件到达时,从HDFS重新读取数据的最佳做法是什么?

或者更好地切换到Kafka Connect将KDBka表内容写入Kafka主题并将其写入所有Kafka Streams应用程序实例可以使用的主题?

更新:
正如Kafka Connect所建议的那样.因为查询数据每天在RDBMS中更新,所以我考虑将Kafka Connect作为预定的一次性工作运行,而不是始终保持连接打开.是的,因为语义和保持连接始终打开的开销,并确保它不会被中断..等等.对于我来说,在这种情况下进行预定的提取看起来更安全.

查找数据不大,可以删除/添加/修改记录.我不知道如何总是完全转储到Kafka主题并截断以前的记录.启用日志压缩并为已删除的密钥发送空值可能不起作用,因为我不知道源系统中已删除的内容.另外AFAIK我在压实发生时没有控制权.

Mic*_*oll 3

推荐的方法确实是将查找数据也摄取到 Kafka 中——例如通过 Kafka Connect——正如您在上面所建议的那样。

但在这种情况下,我如何安排 Connect 作业每天运行,而不是连续从源表中获取,这在我的情况下是不必要的?

也许您可以更新您的问题,您不想让 Kafka Connect 作业连续运行?您是否担心资源消耗(数据库上的负载),您是否担心处理的语义(如果不是“每日更新”),或者......?

更新: 正如建议的那样,Kafka Connect 将是最佳选择。由于查找数据每天都会在 RDBMS 中更新,因此我正在考虑将 Kafka Connect 作为一项计划的一次性作业运行,而不是保持连接始终打开。是的,因为语义和保持连接始终打开并确保它不会被中断的开销......等等。对我来说,在这种情况下进行预定的获取看起来更安全。

Kafka Connect安全的,并且 JDBC 连接器的构建正是为了以健壮、容错和高性能的方式将数据库表输入 Kafka(已经有许多生产部署)。因此,我建议不要仅仅因为“它看起来更安全”而退回到“批量更新”模式;就我个人而言,我认为触发每日摄取在操作上不如仅仅保持其运行以进行连续(实时!)摄取更方便,而且它还会给您的实际用例带来一些缺点(请参阅下一段)。

但当然,您的里程可能会有所不同 - 因此,如果您决定每天更新一次,那就去做吧。但是您会失去 a) 在丰富发生时使用最新的数据库数据丰富传入记录的能力,并且相反,b) 您实际上可能会使用过时/旧的数据来丰富传入记录,直到下一天更新已完成,这很可能会导致您向下游发送/可供其他应用程序使用的数据不正确。例如,如果客户更新了她的送货地址(在数据库中),但您每天只将此信息提供给流处理应用程序(以及可能的许多其他应用程序)一次,则订单处理应用程序会将包裹运送到错误的地方直到下一次每日摄取完成为止。

查找数据不大,记录可能会被删除/添加/修改。我也不知道如何始终将完整转储到 Kafka 主题并截断以前的记录。启用日志压缩并为已删除的键发送空值可能不起作用,因为我不知道源系统中删除了哪些内容。

Kafka Connect 的 JDBC 连接器已自动为您处理此问题:1. 它确保数据库插入/更新/删除正确反映在 Kafka 主题中,2. Kafka 的日志压缩确保目标主题不会超出范围。也许您可能想阅读文档中的 JDBC 连接器,以了解您可以免费获得哪些功能:http ://docs.confluence.io/current/connect/connect-jdbc/docs/ ?