杠上|杠上 Spark、Flink(Kafka 为何转型流数据平台)
1. 消息系统的演化历史
文章图片
消息系统作为一个核心的基础架构组件由来已久,而且运用广泛。整个消息系统的演化进程,大致可以分为三个阶段:
1.0 时代:JMS 以及各种 MQ
2.0 时代:Kafka 的实时管道时代
3.0 时代:流数据平台时代 (Kafka 和 Pulsar)
1.0 - MQ 时代
消息系统作为一个基础机构的组件,通常用于连接不同的软件服务。这些服务可以相互连接,形成一个更大的服务。或者,它也用于将用户设备和后台服务进行连接。消息系统通过将消息的分发和接收分离来实现应用服务的异步和解耦。我这里给大家推荐下我自己创建的大数据资料分享群834325294,这是大数据学习交流的地方,不管你是小白还是大牛,小编都欢迎,不定期分享干货,包括我整理的一份适合大数据零基础学习大数据进阶资料。
或许你正在考虑进行数据投递、非阻塞操作,或者推送通知;或者你想要实现发布 / 订阅,异步处理,或者工作队列。所有这些都属于消息系统的模式。这些消息系统通过 JMS 或者 AMQP 的消息规范或者协议进行通讯。比如 RabbitMQ 就是 AMQP 的一个消息系统实现。它可以为你的应用服务提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。
举个例子,对于一个大型的系统来说,它通常会由很多不同的组件或者子系统构成。如果这些子系统直接使用传统的 IPC 或者 Socket 网络通讯构建,那么模块和子系统之间的耦合性会很大,并不适合进行扩展;而且它同时需要考虑各种问题——比如数据的发送方和接收方怎么进行容错处理,如何做负载均衡,如何处理系统扩展等。而一个消息系统就可以解决上述所有问题。
在这个时代,消息系统主要以围绕 JMS、AMQP 等标准化的消息规范和消息协议设计的系统实现为代表,比如 ActiveMQ,RabbitMQ 等。消息系统在这个时代主要用于在线业务,用来解耦系统的复杂度。
2.0 - 实时管道时代
消息系统演化的 2.0 时代,其实是一个实时管道的时代。而 Kafka 是这个时代的典型代表系统。Kafka 是 2010 年左右在 Linkedin 研发的一套分布式消息系统。当时的 Linkedin 和很多互联网公司一样,分很多的组,有很多的数据产品,每天需要采集非常多的数据。这些数据都是由不同数据源实时生成,比如用户活跃度、日志等。如果数据的生产者和消费者之间采用点对点的方式进行数据传输,那么运维的人力和物力成本就会很高。于是 Linkedin 需要一个集中式的数据管道,所有的业务方都只要跟这个数据管道打交道就可以,不再需要进行点对点的数据传输。
从 2010 年开始,Linkined 尝试了不同的消息系统。但是发现 1.0 时代的消息系统都有两个比较通用的缺陷:一是当消费者出现,无法及时消费数据的时候,消息数据可能会被丢弃;二是可扩展性上,并不能很好的配合互联网的数据规模。Kafka 就诞生在这样的背景下。
Kafka 的设计理念很简单,就是一个以 append-only 日志作为核心的数据存储结构。简单来说,就是 Kafka 把数据以日志的方式进行组织,所有的数据以追加日志的方式写到日志的最末端,对日志的读取按照顺序进行读取。这样尽可能讲数据的读写按照顺序进行操作,这样可以做到比传统 MQ 更高的吞吐。此外,数据以 Topic 为单位作为粒度,按照分区进行切分,存储在不同的服务器上。数据的发布和订阅都基于 Topic,数据更新时,消费端的客户端会把它们从服务器上拉去下来。
Kafka 变得流行,并且成为那个时代的数据管道,得益于 Storm 的流行。Storm 的兴起和 Lambda 架构的引入弥补了 Hadoop 大数据生态在速度和时延上的短板。大量的互联网公司比如 Twitter 等,开始使用 Storm 和 Lambda 架构,Kafka 的实时管道特性,配合 Storm 的流计算,使之开始变得流行。
3.0 - 流数据平台时代
消息系统演化的第三个阶段是流数据平台。这包含两方面的含义,其一是流数据,其二是平台化。流数据,广义上来讲,是相对于批处理时代的静态数据而言的。这其中包括微服务、事件驱动架构(Event-Driven-Architecture)的流行,物联网的兴起等。而平台化意味着消息系统需要能够作为一个平台系统去支撑不同的业务服务、不同的租户管理,而不再是一个简单的数据管道。Apache Pulsar 就是新一代消息系统的代表。
这些系统的诞生,主要与以下几个因素有关:
首先,传统的消息系统比如各种 MQ 和 Kafka 并不能很好地支持平台化,或者随着数据规模的增长,业务负载多样性的增加,这些系统开始暴露大量问题:基本上传统的消息系统都是以分区为主的架构设计,紧耦合了消息服务(计算)和消息存储,而且存储模型都过于简单或者太依赖于文件系统。随着 Topics 数据量的增加,或者数据重要性(不丢数据)的加强,这些系统的性能会急剧下降。
其次,基础架构的容器化。从 2012 年开始,Mesos 的流行、Docker 的兴起,到现在 Kubernetes 一统天下,整个基础架构正在全面往容器化发展。任何紧耦合计算和存储的架构并不能很好地使用新的容器化架构。消息系统需要一个计算和存储相互分离的架构设计去更好地适应容器化的变革。
第三,基础架构的云化。云化是一种新的思维方式。首先,不论是公有云还是私有云,架构设计都需要考虑平台化,也就是多租户、IO 隔离、流控、配额以及安全开始变成消息系统的标配;其次,架构设计需要考虑如何去使用云资源(比如云存储等)。
第四,计算框架的批流一体化。无论是 Flink 还是 Spark,流计算还是批计算的边界已经变得模糊。用户真正关心的是如何更好更快地使用数据,如何从数据中更快地挖掘出其中的价值。而这其中最核心的思维转变是,流数据和静态数据不再是不同的数据,它们其实是同一份数据的两种不同表征方式。
第五,计算轻量化,Serverless 和事件驱动架构带来的变革。
2. Kafka 的挑战
正如上文所述,Kafka 基本上是当下实时管道的第一选择。在 Kafka 0.8 之后,Kafka 也在往平台化的方向发展。现在的 Kafka 除了最核心的消息发布和订阅之外,还包括了以下一些新兴组件,比如:
Kafka Connect:用来从 Kafka 导入和导出数据
Kafka Streams:轻量化的流计算库,用于编写一些简单的计算任务处理 Kafka 的数据。
此外,还包含 Schema Registry、KSQL 等组件。
但是,Kafka 在平台化的过程中,最核心的挑战在于其架构如何适应云原生的挑战。
首先,Kafka 以分区为中心的架构设计是面向物理机时代的架构设计。它紧耦合了消息服务(计算)和消息存储,Kafka 的分区跟一台或者一组物理机强绑定。强绑定带来的问题是,当处理机器失效或者扩容的过程中,Kafka 需要进行昂贵且缓慢的分区数据重新均衡的过程。这个过程十分漫长,而且容易出错。一旦出错,可能带来服务的不可用性。
其次,Kafka 以分区为粒度的存储设计,导致其并不能很好地利用已有的云存储资源。
最后,Kafka 的存储设计过于简单,导致其进行多租户管理、IO 隔离以及平台化转型过程中,需要解决架构上的很多缺陷。
3. Pulsar 的云原生之路
而近一年多崛起并渐渐被更多开发者了解的 Apache Pulsar,与 Apache Kafka 的不同也正好体现在云原生架构设计上。Apache Kafka 在设计上的一些并不能很好地适应于云原生环境的缺陷,比如消息服务和消息存储的紧耦合、IO 并不隔离、基于物理分区的存储模型等,Apache Pulsar 在设计之初就很好地避开了——比如计算和存储分离、分层分片、IO 隔离、多租户管理等。
Apache Pulsar 是 2012 年在 Yahoo 内部启动的项目。其最初的设计,就是奔着做 Yahoo 内部的消息云去做的。所以 Pulsar 从写第一行代码开始,就把租户的概念做进去了,并吸取了以前系统的经验和教训,避免了以前的系统设计上的缺陷。Pulsar 在生产线上成功运行了 4 年后,在 2016 年九月由 Yahoo 开源,并在 2017 年六月捐献给 Apache 软件基金会。Pulsar 在今年九月成功毕业成为顶级项目。从开始孵化到最终毕业,总共经历了 9 个 releases,目前社区总共有 23 位 committers,30 多家公司将 Pulsar 运行在生产线上。
Apache Pulsar 作为新兴的消息流数据平台,除了拥有丰富的特性(比如多租户管理,IO 隔离,多机房复制等)之外,它跟传统的消息系统最大的不同是,Pulsar 是一个面向容器化设计的云原生的流数据系统。怎么来理解这个问题呢?
首先,整个 IT 的基础设施是从传统的物理机模型往容器化模型迁移。容器化对于架构设计的直接影响,就是将原来一体化(Monolithic)的架构按照处理逻辑拆分成小的逻辑单元,并进行容器化。对于分布式系统的设计的影响,通常体现在计算和存储的分离。存储和计算的分离通常应用在一些新型的数据库系统,比如 TiDB。Pulsar 正是在这种容器化进程中诞生的。Pulsar 将系统分为两层,一层是无状态的消息服务(计算)层——Brokers,另外一层是持久化的消息存储层——Bookies (via Apache BookKeeper)。计算和存储分离之后,两层可以相互独立扩展,如果需要存储更多的数据,只需要添加存储节点;如果需要支持更多的生产者和消费者,只需要添加 Brokers。此外,因为 Brokers 变成了一个无状态的服务组件,容错处理变得更加容易,从而能够极速扩容。
其次,基础架构的云化,使得用户更加容易在云上得到弹性的计算资源和存储资源。以存储资源为例,AWS 有 S3,Azure 有 Blob Store,而 GCP 有 GCS。传统的面向物理分区模型设计的系统,并不能很好地利用云存储资源。而 Pulsar 在存储上做了一个降维的处理。Pulsar 把物理分区变成了逻辑分区,而将存储粒度从粗粒度的分区变成了细粒度的分片(Segment)。因此 Pulsar 可以将消息以分片的粒度存储在不同的云存储中,而向外部使用者依然提供统一的消息模型。这种分片的架构,更加原生地利用云存储资源。
再次,计算框架的批流一体化,意味着消息和存储之间是共性的。消息的数据是流入系统的最新数据,而这些数据落到存储上就变成了”历史“数据,并用于批量计算。而 Pulsar 将数据的消息和存储共性体现在分层和分片的处理上,消息服务层(Brokers)用来提供消息的 Pub-Sub,用于流式计算;而消息落地到存储层,按照分片存储,则可以进行批式计算。而这种消息和存储的共性,让用户不在需要区分这个数据是消息数据还是历史数据,从而做到真正意义上的批流一体化。
最后,基础架构的演变从物理机,到虚拟机,再到容器,以及到现在的 Serverless。计算资源的粒度变得越来越细,用户在使用计算资源的过程中,变得越来越关注于计算的本身。这也是所谓计算轻量化的发展之道。Pulsar 在 2.0 之后,将 Serverless 的概念引入了流数据平台,变成了所谓的 Pulsar Functions。Functions 的诞生就是为了让用户更加专注于编写事件处理逻辑。
4. 轻量化计算和 Spark、Flink
在大数据计算的领域,Spark 和 Flink 都是通用的能够支持超大规模数据处理、支持各种处理类型的计算引擎。Spark 从 2014 年左右开始流行,除了在某些场景比 Hadoop MapReduce 带来几十到上百倍的性能提升之外,还提出了用一个统一的引擎支持批处理、流处理、交互性查询、机器学习等常见的数据处理场景。而 Flink 则是在 2016 年左右开始进入大众的视野,并凭借其更优的流处理引擎,批流一体计算等逐渐广为人知,同时也支持各种处理场景,成为 Spark 的有利挑战者。
但是,随着微服务的兴起,以及事件驱动架构的流行,大家慢慢发现,为了编写一些简单计算而去部署一套 Flink 或者 Spark,代价有点大,有种杀鸡用牛刀的感觉。于是,大家开始琢磨怎么能够更加简化这些计算,并开始在消息系统上添加轻量化计算。Kafka 引入了 KStreams,使用了传统的流计算的概念,只是将计算变得轻量化,不再依赖于某个计算平台,用户可以选择自己最适合的部署方式;而 Pulsar 则走了截然不同的一条路径,它跳脱出了传统流计算的模型,而借鉴了 Serverless 的概念,将 Serverless Function 引入了消息系统内部。用户可以通过编写原生的 Function 来进行任意逻辑的计算。以 Function 为主导的轻量化计算让用户更加关注于计算逻辑本身,适用于一些简单计算,比如 Filtering、Aggregation、Routing 等。
数据处理的意义就是挖掘蕴含在数据内部的价值,而且 Spark 和 Flink 是通用计算引擎的两个巨头,基于消息系统衍生出来的轻量化计算并不是一种通用计算,不能与已有的通用计算引擎抗衡。但轻量化计算是对于通用计算的一种补充,让一些微服务的构建以及事件驱动架构的设计变得更加容易。这些消息流平台在通用计算方面,还是需要跟 Spark 和 Flink 更加紧密地结合。
5. 未来展望
消息系统作为大数据基础架构的一个环节,起着至关重要的作用它们也随着基础设施的演化而不断进步。如何更好地使用云化和容器化的基础设施,将是每个消息系统面临的挑战。批流一体化和统一的数据表征,也是下一台数据平台需要支持的特性。
【杠上|杠上 Spark、Flink(Kafka 为何转型流数据平台)】作为数据平台,如何更好地跟已有的计算框架比如 Flink 和 Spark 结合,进行批流一体的计算?如何权衡轻量化计算和复杂计算的边界?不论是 Kafka 还是 Pulsar,都还任重而道远。
推荐阅读
- 一个人的碎碎念
- 野营记-第五章|野营记-第五章 讨伐梦魇兽
- Shell-Bash变量与运算符
- 清明,是追思、是传承、是感恩。
- 牛人进化+|牛人进化+ 按自己的意愿过一生
- 七老修复好敏感、角质层薄、红血丝
- 华为旁!大社区、地铁新盘,佳兆业城市广场五期!
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 螃蟹和这些食物同吃,轻则腹泻、重则中毒!要小心哦~
- 八、「料理风云」