Apache Kafka最初由LinkedIn开发,是最成熟的事件流平台之一。Kafka被用于高性能数据管道、流分析、数据集成和关键任务应用。
将所有的数据保存在数据仓库中,并使用每晚的批处理程序进行分析,已经不足以及时监控和管理一个业务或流程。相反,你应该对数据流进行简单的实时分析,除了保存数据供以后深入分析。
Apache Kafka最初由LinkedIn开发,是最成熟的事件流平台之一。Kafka的辅助工具包括Apache Flink、Apache Samza、Apache Spark、Apache Storm、Databricks和Ververica。Kafka的替代品包括Amazon Kinesis、Apache Pulsar、Azure Stream Analytics、Confluent和Google Cloud Dataflow。
Kafka的一个缺点是,建立大型Kafka集群可能很麻烦。Kafka的商业云实施,如Confluent Cloud和Amazon Managed Streaming for Apache Kafka,可以解决这个问题和其他问题,但需要付出代价。
Apache Kafka的定义
Apache Kafka是一个开源的Java/Scala分布式事件流平台,用于高性能数据管道、流分析、数据集成和关键任务应用。Kafka事件被组织并持久地存储在主题中。
Kafka有五个核心API。
- 管理API,用于管理和检查主题、经纪人和其他Kafka对象。
- 生产者API将事件流发布(写)到一个或多个Kafka主题。
- 消费者API可以订阅(读取)一个或多个主题,并处理向其产生的事件流。
- Kafka Streams API用于实现流处理应用程序和微服务。它提供了更高层次的功能来处理事件流,包括转换、聚合和连接等有状态的操作、窗口化、基于事件时间的处理等等。从一个或多个主题读取输入,以生成输出到一个或多个主题,有效地将输入流转换为输出流。
- Kafka Connect API用于构建和运行可重用的数据导入/导出连接器,这些连接器从外部系统和应用程序中消费(读)或产生(写)事件流,以便它们能够与Kafka集成。例如,一个连接到关系型数据库(如PostgreSQL)的连接器可能会捕获一组表的每一个变化。然而,在实践中,你通常不需要实现自己的连接器,因为Kafka社区已经提供了数百个现成的连接器。
要实现比你用Streams API可以轻松处理的更复杂的流处理,你可以将Kafka与Apache Samza(下文讨论)或Apache Flink集成。
对于Apache Kafka的商业支持版本,可以考虑Confluent。
Kafka是如何工作的?
Kafka是一个分布式系统,由服务器和客户端组成,通过高性能的TCP网络协议进行通信。它可以部署在企业内部的裸机硬件、虚拟机和容器上,也可以部署在云环境中。
服务器。Kafka以一个或多个服务器集群的形式运行,可以跨越多个数据中心或云区域。其中一些服务器形成了存储层,称为经纪人。其他服务器运行Kafka Connect,以事件流的形式持续导入和导出数据,将Kafka与你现有的系统(如关系型数据库)以及其他Kafka集群集成。为了让你实现关键任务的用例,Kafka集群是高度可扩展和容错的。如果它的任何一个服务器出现故障,其他服务器将接管他们的工作,以确保连续运行,没有任何数据损失。
客户端。Kafka客户端允许你编写分布式应用和微服务,以并行、大规模和容错的方式读取、写入和处理事件流,即使在网络问题或机器故障的情况下。Kafka在出厂时就包含了一些客户端,并由Kafka社区提供的几十个客户端进行了扩充。Kafka客户端可用于Java和Scala,包括更高级别的Kafka流库,也可用于Go、Python、C/C++和其他许多编程语言以及REST APIs。
什么是Apache Samza?
Apache Samza是一个开源的Scala/Java的分布式流处理框架,最初是在LinkedIn与(Apache)Kafka一起开发的。Samza允许你建立有状态的应用程序,实时处理来自多个来源的数据,包括Apache Kafka。Samza的特点包括。
- 统一的API。一个简单的API,以独立于数据源的方式描述应用逻辑。同样的API可以处理批处理和流式数据。
- 每一级的可插拔性。处理和转换来自任何来源的数据。Samza提供了与Apache Kafka、AWS Kinesis、Azure Event Hubs(Azure原生Kafka即服务)、Elasticsearch和Apache Hadoop的内置集成。此外,它也很容易与你自己的资源整合。
- Samza作为一个嵌入式库。与你现有的应用程序集成,并消除了为流处理旋转和操作一个单独的集群的需要。Samza可以作为一个轻量级的客户端库嵌入到Java/Scala应用程序中。
- 一次编写,随地运行。灵活的部署选项可以在任何地方运行应用程序--从公共云到容器化环境到裸机硬件。
- Samza作为一个管理服务。通过与流行的集群管理器(包括Apache YARN)集成,将流处理作为管理服务运行。
- 容错性。在发生故障的情况下,透明地迁移任务及其相关状态。Samza支持主机亲和性和增量检查点,以实现从故障中快速恢复。
- 大规模。在使用数兆字节的状态并在数千个内核上运行的应用程序上进行了战斗测试。Samza为多个大型公司提供支持,包括LinkedIn、Uber、TripAdvisor和Slack。
Kafka和Confluent
Confluent平台是对Apache Kafka的商业化改编,由Kafka的原创作者提供,在企业内部和云端提供。Confluent云从头到尾都是一个无服务器、有弹性、有成本效益、完全可管理的云原生服务,并在亚马逊网络服务、微软Azure和谷歌云平台上运行。
主要云服务提供商上的Kafka
Amazon Managed Streaming for Apache Kafka(MSK)与Confluent Cloud和AWS上的Amazon Kinesis共存。这三者执行的是本质上相同的服务。在Microsoft Azure上,Apache Kafka on HDInsight和Confluent Cloud与Azure Event Hubs和Azure Stream Analytics并存。在谷歌云上,谷歌云Dataflow、谷歌云Dataproc、谷歌云Pub/Sub和谷歌云BigQuery与Confluent Cloud并存。
Kafka使用实例
腾讯(Confluent的客户)使用Kafka来构建数据管道,用于跨区域的日志摄取、机器学习平台和微服务之间的异步通信。腾讯需要比单个Kafka集群获得更多的吞吐量和更低的延迟,因此它将Kafka集群包裹在代理层中,创建一个联合的Kafka设计,每天处理超过10万亿条消息,集群最大带宽为240Gb/s。
微软Azure利用Confluent Cloud、MQTT经纪人和连接器、Azure Cosmos DB的分析存储、Azure Synapse Analytics和Azure Spring Cloud构建了一个原型的端到端物联网数据处理解决方案。引用的文章包括所有的设置步骤。
ACERTUS用Confluent Cloud、ksqlDB(专门用于流式数据的SQL数据库)、AWS Lambda和Snowflake数据仓库建立了一个端到端的车队管理系统。ACERTUS报告说,该系统在第一年就产生了超过1000万美元的收入,该系统取代了一个主要的手工系统。
正如我们所看到的,Kafka可以解决需要流式数据的真正的、大规模的问题。同时,有很多方法可以设计基于Kafka的解决方案,并将Kafka与分析和存储互连。