一、数据管道基本概念
在使用Kafka构建数据管道时,通常有两种使用场景:第一种:把Kafka作为数据管道的两个端点之一,例如,把Kafka里的数据移动到云上,或者把MongoDB里的数据移动到Kafka里;第二种:把Kafka作为数据管道两个端点的中间媒介,例如,为了把DB的数据移动到ElasticSearch上,需要先把它们移动到Kafka里,再将它们从Kafka移动到Elastic Search上。
Kafka为数据管道带来的主要价值在于,它可以作为数据管道各个数据段之间的大型缓冲区,有效地解耦管道数据的生产者和消费者。数据管道的重要作用之一是解耦数据源和数据池,Kafka在这方面的能力以及在安全和效率方面的可靠性,使它成为构建数据管道的最佳选择。
1、数据管道需要考虑的问题
1.1、及时性
有些系统希望每天一次性地接收大量数据,而有些则希望在数据生成几毫秒之内就能拿到它们,大部分数据管道介于这两者之间。一个好的数据集成系统能够很好地支持数据管道的各种及时性需求,而且在业务需求发生变更时,具有不同及时性需求的数据表之间可以方便地进行迁移。
Kafka作为一个基于流的数据平台,提供了可靠且可伸缩的数据存储,可以支持几近实时的数据管道和基于小时的批处理。生产者可以频繁地向Kafka写入数据,也可以按需写入:消费者可以在数据到达的第一时间读取它们,也可以每隔一段时间读取一次积压的数据。
Kafka在这里扮演了一个大型缓冲区的角色,降低了生产者和消费者之间的时间敏感度。实时的生产者和基于批处理的消费者可以同时存在,也可以任意组合。实现回压策略也因此变得更加容易,Kafka本身就使用了回压策略(必要时可以延后向生产者发送确认),消费速率完全取决于消费者自己。
1.2、可靠性
我们要避免单点故障,并能够自动从各种故障中快速恢复。数据通过数据管道到达业务系统,哪怕出现几秒钟的故障,也会造成灾难性的影响,对于那些要求毫秒级的及时性系统来说尤为如此。数据传递保证是可靠性的另一个重要因素。有些系统允许数据丢失,不过在大多数情况下,它们要求至少一次传递。也就是说,源系统的每一个事件都必须到达目的地,不过有时候需要进行重试,而重试可能造成重复传递。有些系统甚至要求仅一次传递——源系统的每一个事件都必须到达目的地,不允许丢失,也不允许重复。
1.3、高吞吐量和动态吞吐量
为了满足现代数据系统的要求,数据管道需要支持非常高的吞吐量。更重要的是,在某些情况下,数据管道还需要能够应对突发的吞吐量增长。
由于我们将Kafka作为生产者和消费者之间的缓冲区,消费者的吞吐量和生产者的吞吐量就不会耦合在一起了。如果生产者的吞吐量超过了消费者的吞吐量,可以把数据积压在Kafka里,等待消费者追赶上来。通过增加额外的消费者或生产者可以实现Kafka的伸缩,因此我们可以在数据管道的任何一边进行动态的伸缩,以便满足持续变化的需求。
因为Kafka是一个高吞吐量的分布式系统,一个适当规模的集群每秒钟可以处理数百兆的数据,所以根本无需担心数据管道无住满足伸缩性需求。另外Connect API不仅支持伸缩,而且擅长并行处理任务。
1.4、数据格式
数据管道需要协调各种数据格式和数据类型,这是数据管道的一个非常重要的因素。数据类型取决于不同的数据库和数据存储系统。你可能会通过Avro将XML或关系型数据加载到Kafka里,然后将它们转成JSON写入ElasticSearch,或者写入HDFS等等。Kafka与数据格式无关,生产者和消费者可以使用各种序列化器来表示任意格式的数据。
2、Kafka Connect
这个不同于普通API,Connect是Kafka的一部分,它位在Kafka和外部数据存储系统之间移动数据提供一种可靠且可伸缩的方式,它不是一个API调用,它主责移动数据。
Connect以worker进程集群的方式运行,然后使用REST API来管理和配置,并且这些进程都是长时间持续运行的作业。比如使用将一个Mysql的表数据导入到一个Kafka的主题上,然后再将他们加载到ElasticSearch里,然后对它们的内容进行索引。
二、流式处理基本概念
Kafka早期版本一般被认为是一个强大的消息总线,可以传递事件流,但没有处理和转换事件的能力。Kafka可靠的传递能力让它成为流式处理系统完美的数据来源,很多基于Kafka构建的流式处理系统都将Kafka作为唯一可靠的数据来隙,如Apache Storm、Apache SparkStreaming、Apache Flink、Apache Samza等。
从0 . 10 . 0版本开始,Kafka不仅为每一个流行的流式处理框架提供了可靠的数据来源,还提供了一个强大的流式处理类库,并将其作为客户端类库的一部分。这样开发人员就可以在应用程序里读取、处理和生成事件,而不需要再依赖外部的处理框架。
1、数据流
先来看看什么是数据流(也被称为“事件流”或“流数据”)。首先,数据流是无边界数据集的抽象表示。无边界意味着无限和持续增长。无边界数据集之所以是无限的,是因为随着时间的推移,新的记录会不断加入进来。