Apache Kafka 用起来:一个构建流式数据平台的指导(Part 1)(译)

Sep 8, 2017


这些天你听到了许多关于“数据流处理”,“事件数据”和“实时数据”的技术,比如 kafka,Storm,Samza 和 Spark的数据流模块。虽然它们都一些非常激动人心地方,但是并不是每个人都知道如何用这些技术去适应你的技术栈或者或者在实际应用中使用。

这个指导将要讨论我们在处理实时数据流中的经验:如何在公司中为实时数据构建一个家和如何构建一个能够利用这些数据的应用。所有的这些都是基于我们真实的经验:我们花了过去五年时间构建Apache Kafka 将 Linkedin 转变成一个完全基于流式数据架构并且帮助了许多硅谷的企业干同样的事情。

指导的第一部分会在高层次视角我们所谓的流式数据平台,这是一个流式数据的总线。这个指导会给出这个平台是什么,我们为什么会有这样的想法。

指导的第二部分会给出具体的技术细节并且如何有效地将这些付诸实践。

但是,首先到底什么是流式数据平台?

流式数据平台:一个干净,明亮的存放数据的地方

我们是抱着非常明确的目标在LinkedIn构建着Apache Kafka:让它作为数据流的仓库。我们为什么这么做?我们有如下两个动机:

第一个问题是我们如何传输数据。我们拥有许多数据系统:关系型OLTP数据库,Hadoop,Teradata,搜索引擎,监控系统,OLAP 存储和KV存储。这些都需要稳定的从分布式环境中获取数据。我们称之为“数据集成”,当然我们也可以叫它ETL。

第二个问题是我们需要丰富的数据处理过程,这些过程一般发生在一个数据仓库或者Hadoop集群中,但是我们需要这些处理过程有比较短的延迟。我们称之为“数据流处理”,当然有些人称之为CEP或者其他类似的东西。

我将谈谈这些想法在LinkedIn如何发展的。一开始,我们根本没有意识到这些问题是相互关联的。我们的方法比较即时:我们按需地构建了一个偷工减料的管道,连接着系统和应用并且将所有的异步处理填充到请求-响应式的网页服务器之中。随着时间推移这变得越来越复杂,接着我们就停止了在不同的系统之间构建这样的管道:

每个这样的管道以不同的方式存在着问题。对于日志数据,我们的管道是可扩展且松散的和高延迟的。在Oracle实例之间是高速,精确和实时的,但是其他系统获取不到数据。在Oracle和Hadoop之间,数据是周期,高吞吐量和批次的CSV。在搜索服务,数据是低延迟,无法扩展,并且直接与数据绑定的。在消息系统中,这个管道的数据是低延迟但是不稳定和无法扩展的。

随着我们在全球各地部署着数据中心,我们必须为这些数据流构建不同的地理备份。随着系统的扩展,这些管道也需要扩展。构建一个简单的输送管道是非常简单的,但是扩展和运维这些管道是非常消耗精力的。我感觉到我们的分布式系统工程师真的非常像分布式系统管道工。

更糟糕的是,高复杂性意味着数据不再可靠。我们的报告不再可信,存储和索引存在着问题,所有每天面对着是各种各样的数据问题。我记得有一次我们遇到了一次事故,在这次事故中我们检查了两个系统中的相同的数据并且找到了一些不一致,我们尝试着找出那一份是正确的数据,但是最后我们发现哪一份数据都是不对的。

与此同时,我们不仅仅是要将数据从一个地方输送到另一个地方,我们还需要使用这些数据干些事情。Hadoop平台给了我们一种批量处理数据和即时处理数据的平台,这是一个空前的成功。但是我们却需要一个类似的低延迟的平台。许多的应用,尤其是监控系统,搜索引擎索引管道,分析,安全和错误分析,都需要低延迟数据。我们基础设施技术栈并不能为它们提供一个很好的平台。

所以,在2010年,我们决定致力于构建一个专门用于获取以流的方式捕获数据的系统,并将这个系统作为系统间集成的方式,以及允许能够实时处理这些流式数据。这就是Apacha Kafka的由来。

我们认为事情应该是这样的:

很长一段时间,我们都没有为我们所做的东西取一个名字(我们仅仅是叫它“Kafka的东西”或者“全局日志提交的东西”),后来我们称这类数据为“流数据”和有了中心化管理“流数据平台”的概念。

我们系统从乱的一团糟的管道变成了干净的以流数据为中心的系统:

一个现代的以数据流为中心的系统围绕着Apache Kafka 构建了起来。

在这种系统设置之下,Kafka扮演者全局数据管道的角色。所有系统可以为这个中心管道提供数据也可以从中消费数据。应用和流数据处理过程可以接入其中产生新的数据,这些数据可供其他系统使用。这种连续的结构良好的数据供给就像跨系统间,跨应用间和数据中心间的通用语。

比方说,一个用户更新了他的基本信息,这些基本信息流入了我们的流式数据处理层,在这里公司信息,地理信息和其他属性会被标准化。从那里,那些流式数据会流入搜索引擎和社交网络以供查询,还会流入推荐系统用于工作匹配。所有的这些都会发生在毫秒级。同样的数据流还会被导入Hadoop数据仓库。

这种使用方式在Linkdin逐渐地开始显著地普及起来。今天,在LinKedin Kafka 每天在多个数据中心处理这5000亿的事件。它变成了各系统的数据骨干,Hadoop的中心管道以及流处理过程的总线。

由于Kakfa是开源的软件,所以它不仅在Linkedin得到传播,同样也流行在所有做着同样事情的公司。

下面的文章我会介绍一些关于以流数据为中心的系统,它的工作原理,它解决了哪些问题。

流数据

(未完待续)