Flink的容错机制第七篇 流处理架构与Apache Kafka

本篇主要简介Flink工程中出现的Apache kafka的功能和应用场景,更有助于理解Flink的整体工程架构,文章中可能出现之前写过的内容。

一,背景:数据处理架构

 多年来,数据的收集和使用一直在增长,公司已经设计并构建了基础架构来管理数据。 大多数企业实施的传统架构区分了两种类型的数据处理:事务处理和数据分析处理。 在本节中,我们将讨论这两种类型以及它们如何管理和处理数据。

1. 事务处理架构

公司一般将各种应用程序用于日常业务活动,例如企业资源规划系统,客户关系管理(CRM)软件和基于Web的应用程序。 这些系统通常设计有单独的层,用于数据处理(应用程序本身)和数据存储(事务数据库系统)。

                                                       图1.传统事务处理架构

像这样,客户管理,订单业务,web应用程序分别由单独的层编写,并公用后台一个数据库。

正如我们在微服务架构中讲的那样,当应用程序需要发展或扩展时,此应用程序设计可能会导致问题。由于多个应用程序可能在同一数据表示上工作或共享相同的基础结构,因此更改表的模式或扩展数据库系统需要仔细规划和大量工作。克服紧密捆绑应用程序的最新方法是微服务设计模式。

微服务被设计为小型,独立且独立的应用程序。他们遵循UNIX的理念,即做一件事并做得很好。通过将几个微服务相互连接来构建更复杂的应用程序,这些微服务仅通过标准化接口(例如RESTful HTTP连接)进行通信。由于微服务严格地彼此分离并且仅通过明确定义的接口进行通信,因此每个微服务可以用包括编程语言,库和数据存储的不同技术堆栈来实现。微服务和所有必需的软件和服务通常捆绑在一起并部署在独立的容器中。

                                                               图2.微服务架构

2. 数据分析处理架构

分析数据可以给公司业务提供很大帮助,例如,可以分析订单处理系统的数据以获得随时间的销售增长,识别延迟装运的原因,或预测未来销售以便调整库存。但是,事务数据通常分布在多个断开连接的数据库系统中,并且在可以联合分析时更有价值。而且,数据通常需要转换为通用格式。
这些数据通常被复制到数据仓库,而不是直接在事务数据库上运行分析查询,数据仓库是分析查询工作负载的专用数据存储。为了填充数据仓库,需要将事务数据库系统管理的数据复制到它。将数据复制到数据仓库的过程称为extract-transform-load(ETL)。 ETL过程从事务数据库中提取数据,将其转换为可能包括验证,值规范化,编码,重复数据删除和模式转换的公共表示,最后将其加载到分析数据库中。 ETL过程可能非常复杂,并且通常需要技术复杂的解决方案来满足性能要求。 ETL过程需要定期运行以保持数据仓库中的数据同步。
将数据导入数据仓库后,可以查询和分析数据。通常,在数据仓库上执行两类查询。第一种类型是定期报告查询,用于计算与业务相关的统计信息,如收入,用户增长或生产输出。这些指标汇总到报告中,帮助管理层评估业务的整体健康状况。第二种类型是即席查询,旨在提供特定问题的答案并支持关键业务决策,例如收集收入数字和在广播商业广告上花费的查询,以评估营销活动的有效性。这两种查询都由数据仓库以批处理方式执行。

                                             图3.用于数据处理的数据仓库架构

3. 流处理架构

与前两种架构不同,由于任何处理事件流并且不仅仅执行琐碎的一次记录转换的应用程序都需要是有状态的,能够存储和访问中间数据。当应用程序收到事件时,它可以执行涉及从状态读取数据或向该状态写入数据的任意计算。原则上,可以在许多不同的地方存储和访问状态,包括程序变量,本地文件或嵌入式或外部数据库。
Apache Flink将应用程序状态本地存储在内存或嵌入式数据库中。由于Flink是一个分布式系统,因此需要保护本地状态以防止在应用程序或计算机故障时数据丢失。 Flink通过定期将应用程序状态的一致检查点写入远程且持久的存储来保证这一点。

                                           图4. 流处理状态运算结构

有状态流处理是一种通用且灵活的设计架构,可用于许多不同的用例。 一般我们提供了三部分通常使用有状态流处理:(1)事件驱动的应用程序-->被事件进程驱动,对应事务处理架构,(2)数据管道应用程序--->分布式事务集中处理,对应ETL进程,以及(3)数据分析应用程序--->对应数据仓库进程。

                                                         图5.Flink工程流处理架构

有状态流处理应用程序通常从事件日志中提取其传入事件。 事件日志存储和分发事件流。 事件被写入持久的仅附加日志,这意味着无法更改写入事件的顺序。 写入事件日志的流可以由相同或不同的使用者多次读取。 由于日志的仅附加属性,事件始终以完全相同的顺序发布给所有使用者。 有几种事件日志系统可用作开源软件,Apache Kafka是其中最受欢迎的,或者是云计算提供商提供的集成服务。

二,Apache Kafka

1. 基本概念

Kafka是一个基于分布式流处理平台的消息系统,支持以下应用场景:
(1) 具有高吞吐量支持实时日志的大规模事件流,可以处理流数据
(2) 能够周期性加载离线数据进行处理,很好处理积压数据
(3) 能够低延迟处理传统消息应用场景,可以用作应用监控
(4) 持久化日志,具有容错机制

2. Apache Kafka结构

                                                               图6.Kafka基本结构

                                                             图7.topic的生产与消费

3. Kafka基本概念

kafka运行在集群上,集群包含一个或多个服务器。kafka把消息存在topic中,每一条消息包含键值(key),值(value)和时间戳(timestamp)。

kafka有以下一些基本概念:

Producer - 消息生产者,就是向kafka broker发消息的客户端。

Consumer - 消息消费者,是消息的使用方,负责消费Kafka服务器上的消息。

Topic - 主题,由用户定义并配置在Kafka服务器,用于建立Producer和Consumer之间的订阅关系。生产者发送消息到指定的Topic下,消息者从这个Topic下消费消息。

Partition - 消息分区,一个topic可以分为多个 partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。

Broker - 一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。

Consumer Group - 消费者分组,用于归组同类消费者。每个consumer属于一个特定的consumer group,多个消费者可以共同消息一个Topic下的消息,每个消费者消费其中的部分消息,这些消费者就组成了一个分组,拥有同一个分组名称,通常也被称为消费者集群。

Offset - 消息在partition中的偏移量。每一条消息在partition都有唯一的偏移量,消息者可以指定偏移量来指定要消费的消息。

zookeeper - 保存元数据信息,动态维护副本列表,能更方便地对kafka进行数据迁移和水平扩展。

参考资料:

stream-processing-with-flink O'reilly

猜你喜欢

转载自blog.csdn.net/wannuoge4766/article/details/94484263