使用Apache Kafka和ksqlDB的流数据管道介绍

322 阅读7分钟

数据管道是一种将数据从一个系统获取到另一个系统的方法,无论是为了分析目的还是为了存储。学习构成这一成熟架构的元素可以帮助你形成一个心理蓝图,当你去设计自己的数据系统时将会很有用。

一个管道可以简单到只有一个数据库和一个分析仪表盘,也可以复杂得多,许多数据源被发送到一个中央处理层,在那里数据被连接和处理,然后由分析层进行查询。流是一个经常被添加到数据管道的属性,它意味着在事件发生时将数据从源头发送到目标。流带来了准确和相关的数据的优势,它有助于避免大量数据涌入可能产生的瓶颈。(然而,根据定义,数据管道不一定是流式的)。

在复杂的数据管道中,中央处理层的一个成熟的选择是Apache Kafka®,通常由ksqlDB或Kafka Streams来增强数据操作。Kafka与管道的解耦性质混合得很好,因为数据被保存在其中,可随时重放。这一点至关重要,例如,如果一个现有的系统元素需要恢复,或者一个新的系统需要上线。反过来,ksqlDB作为处理层,你可以在这里对数据进行操作,如去掉规范化、过滤、聚合、运行机器学习模型等,然后再将其发送给目标。

这篇博文将描述建立基于Kafka的数据管道所涉及的要素:将数据实体连接在一起;将数据从源头流到管道中间--Kafka;用ksqlDB过滤、连接和充实数据;最后将数据输送到Elasticsearch的Kibana。读完这篇文章后,请务必访问涵盖这一概念的广泛的Confluent开发者课程:数据管道101

将数据实体连接在一起

在Kafka数据管道中连接流式数据摄入和输出的最有效方式是使用Kafka Connect,你可以在Confluent Cloud上作为一个可管理的、易于配置的工具运行,或者直接在你自己的服务器上运行(如果某个连接器在Confluent Cloud上不可用或者你不使用Cloud,你可能想这么做)。Kafka Connect让你用Kafka连接无数的系统:关系型数据库如Oracle、Postgres和MySQL;消息队列如ActiveMQ、IBM MQ和JMS供应商;云数据仓库如Snowflake和BigQuery;NoSQL数据库如MongoDB和Cassandra,或Salesforce等SaaS平台。如果你不使用Confluent Cloud上的连接器,你可以在Confluent Hub上找到连接器。

通过变化数据捕获(CDC)从源数据库捕获变化到Kafka中

变化数据捕获可以让你在获取源数据库的完整快照后订阅其变化,这是一种有效的方式,可以将数据从管道的起点获取到中间,即Kafka所在的位置。你有两个选择来实现它。

查询法只是使用基于时间戳或单调递增的标识符的查询谓词,或两者兼而有之,以固定的时间间隔对源数据库进行投票。基于查询的CDC通常比基于日志的CDC设置得更快(只要你能修改源模式),但它有几个限制。它持续地冲击你的数据库,你不能跟踪DELETE,而且你只能跟踪最新的变化(请记住,在两次投票之间的时间里可能会发生多种行为,所以不是所有的行为都会被捕获)。基于查询的CDC的一个例子是Kafka Connect JDBC源连接器。

相反,基于日志的CDC读取源数据库的交易日志(又称重做日志、binlog等),是一个二进制文件。与基于查询的方法相比,基于日志的方法的优势在于,它可以捕获所有的变化,包括DELETE,因此可以传输一个数据库的完整历史。此外,基于日志的CDC捕获所有的东西,延迟更低,对数据库的影响也更小。基于日志的 CDC 的缺点是,它需要更长的时间来设置,并且通常需要更大的系统权限。使用基于日志的方法的连接器是Confluent Oracle CDC连接器和所有的Debezium项目连接器。

用ksqlDB过滤数据

一旦你建立了你的数据流,下一步就是通过某种方式处理通过管道的数据来增加其价值--例如,通过过滤或丰富它。如果你对Java有经验并且善于部署的话,你可以使用Kafka Streams来做这件事。然而,ksqlDB对任何人来说都是一个选择,无论其编程语言的专业性如何,因为它可以使流处理程序用简单的SQL来表达。使用ksqlDB,你可以快速应用一个过滤器,例如,删除所有在一个字段中包含特定值的事件--例如 "测试 "这个词。

在ksqlDB中使用一个表作为查询源来丰富数据

对于你将建立的大多数数据管道,你需要在某种程度上连接数据源。例如,你可能想把网站上的客户评级与电话和电子邮件等客户数据连接起来(以《数据管道101》中的例子为例)。

你的客户数据很可能存在于一个外部数据库中,因此首先需要通过Kafka Connect拉到Kafka中,这样才能进行连接。此外,为了将这些数据作为一个查询源,你需要将其从外部数据库的流形式转换为一个有状态的表。(在ksqlDB中,流可以很容易地转换为表,反之亦然。)相反,客户评级可能来自REST端点、移动应用程序或Web前端等。一旦你的数据有了正确的形式,你就可以通过查询表的键来丰富每个客户的评价,你可以把这些数据发送到一个新的流。

发送数据到分析仪表板,或其他地方

一旦你成功地将数据放入你的管道并进行了处理,最后一步是创建一个水槽来接收你的数据,用于分析目的,或用于存储。如上所述,你可以使用Kafka Connect进行数据输出,就像你可以使用数据输入一样简单。在Confluent Cloud上,你会发现大多数你可能想要发送数据的地方都有连接器,包括对象存储、云数据仓库和NoSQL存储。对于分析来说,Confluent云上完全管理的Elasticsearch连接器是一个坚固的选择,和其他所有管理的连接器一样,设置只需要你在Confluent云控制台填写一些空白。

用实践的例子来巩固你的知识

现在你已经了解了数据管道的基本要素,你可以通过跟随数据管道101课程中的累积练习来练习设置一个完整的管道。在示例场景中,你将把从一个理论上的网络应用中到达的模拟客户评级与从模拟的MySQL数据库中提取的客户数据连接起来。你的数据最终将被输送到Elasticsearch的Kibana。在练习的过程中,你将学习Kafka连接以及ksqlDB过滤器、连接和表--还有更多。

首先,在Confluent Cloud设置你的Kafka生态系统环境,包括Kafka、Kafka Connect、Confluent Schema Registry和ksqlDB。请注意,如果你使用促销代码PIPELINES101 ,你将获得101美元的免费Confluent Cloud使用权。

何去何从

在基于Kafka的数据管道中解耦源和目标有很多优势。正如前面所提到的,如果一方脱机,管道不会受到影响。如果目标方宕机,Kafka仍然持有数据,当它恢复时,可以继续向目标方发送数据;如果源方宕机,目标方除了没有数据外,甚至不会注意到;最后,如果目标方无法跟上源方的速度,Kafka可以吸收一些背压。数据管道的发展也很好,因为数据被保存在Kafka中,可以独立地发送到任何数量的目标。

要了解更多关于数据管道的信息,请确保。