用Apache Kafka构建流数据平台的建议
在《流数据平台构建实战指南》第一部分中,Confluent联合创始人Jay Kreps介绍了如何构建一个公司范围的实时流数据中心。InfoQ前期对此进行过报道。本文是根据第二部分整理而成。在这一部分中,Jay给出了一些构建数据流平台的具体建议。
限制集群数量
Kafka集群数量越少,系统架构就越简单,也就意味着集成点更少,新增应用程序的增量成本更低,数据流推理更简单。但出于以下几个方面的考虑,再少也不可能只有一个集群:
- 将活动限制在本地数据中心。Jay建议将所有的应用程序都连接到本地数据中心的集群。
- 安全方面的原因。Kafka没有安全控制,通常,这意味着要实现网络级安全和数据类型的物理隔离。
- SLA控制方面的原因。Kafka有一些多租户特性,但并不完善。
简化数据流
以单个基础设施平台为中心实现数据交换可以极大地简化数据流。如果所有系统直接互连,会是下面的样子:

如果有一个数据流平台作为中心,则会是下面的样子:

在第一幅图中,每两个系统之间需要建立两条数据管道,而在第二幅图中,只需要为每个系统创建一个输入和输出连接器来连接流数据管道。系统较多时,这两种情况下的管道数量会有很大差别。
不仅如此,不同的系统可能会有不同的数据模型。点对点集成时,每个系统都需要处理不同系统提供的不同的数据格式,而以数据流平台为中心进行集成的话,每个系统都只需要处理流数据平台的数据格式。这样可以尽量减少价值不高的语法转换。
指定一种数据格式
Kafka并不强制事件数据采用任何特定的格式,使用JSON、XML或Avro都可以。但为事件指定一种在公司范围内通用的数据格式非常关键。数据遵循类似的规范,数据生产者和消费者就不用针对不同的格式编写不同的适配器。这在实现流数据平台之初是最重要的事情。
根据经验,Jay建议选择Apache Avro作为统一的数据格式。Avro是一种类似JSON的数据模型,可以用JSON或二进制形式进行表示。它有如下优点:
- 可以与JSON直接映射;
- 有一个非常紧凑的格式;
- 效率非常高;
- 提供了到多种编程语言的绑定;
- 是一个用纯JSON定义的、可扩展的模式语言;
- 有最好的兼容性理念。
这在保证数据质量和易用性方面非常关键。Avro可以为数据定义一个“模式(schema)”,后者会带来如下好处:
- 增强架构健壮性:在以流数据平台为中心的架构中,应用程序之间是松耦合的,如果没有任何模式,那么系统间极易出现数据不一致的情况。
- 明确语义:模式中每个字段的doc属性明确定义了字段的语义。
- 兼容性:模式处理数据格式变化,使像Hadoop或Cassandra这样的系统可以跟踪上游数据变化,只将有变化的数据传给它们自己的存储,而不必进行重新处理。
- 减少了数据科学家的体力劳动:模式使得数据非常规范,使他们不再需要进行低级的数据再加工。
除了上述建议外,Jay还介绍了他们在LinkedIn的一些做法。
共享事件模式
当一项活动在多个系统中都比较常见,就应该为它指定一个通用的模式。一个常见的例子是应用程序错误,它可以以一种非常通用的方式建模,让ErrorEvent流捕获整个企业的错误。
具体数据类型建模
Kafka数据模型是构建来表示数据流的。在Kafka中,一个流被建模成一个topic,即数据的逻辑名称。每条消息都包含一个用于在集群上进行数据划分的键和一个包含Avro数据记录的数据体。Kafka会根据SLA(如保留7天)或大小(如保留100GB)或键来维护流的历史记录。
- 纯事件流:纯事件流描述企业内发生的活动。比如,在一家Web企业里,这些活动是点击、显示页面和其它各种用户行为。每种行为类型的事件可以表示为一个单独的逻辑流。为了简单起见,建议Avro模式和topic使用相同的名称。纯事件流将总是按时间或大小来保留。单个topic中混合多种事件会导致不必要的复杂性。
- 应用程序日志:结构化日志可以像上文描述的其它事件那样同等对待,这里说的日志是指半结构化应用程序日志。在LinkedIn,所有的应用程序日志都通过自定义的log4j输出源发布到Kafka。
- 系统指标:收集Unix性能数据及应用程序定义的指标等统计数据,然后使用一个通用的格式发布成一个统计数据流,供企业中的监控平台使用。
- Hadoop数据加载:最重要的是实现数据加载过程的自动化,不需要任何自定义设置或者在Kafka topic和Hadoop数据集之间作映射。LinkedIn专门为此开发了一个名为Camus的系统。
- Hadoop数据发布:将由Hadoop计算生成的派生流发布到流数据平台。
- 数据库变更:由于轮询可能会丢失中间状态,因此,LinkedIn选择直接集成数据库日志。对于纯事件数据,Kafka通常只保留一个较短的时间。但对于数据库变更流,系统可能需要从Kafka变更日志实现完全恢复。Kafka特性Log Compaction可以帮助实现这种需求。
- 按原样抽取数据库数据,然后转换:把数据清理后再发布给客户不是一个好主意,因为可能会有许多要求各不相同的消费者,导致清理工作需要针对不同的消费者做许多次,而且清理过程本身可能会丢失信息。所以,发布原始数据流,然后基于它创建一个完成清理工作的派生流。
流处理
流数据平台的一个目标是在数据系统之间以流的方式传递数据,另一个目标是在数据到达时进行数据流处理。在流数据平台中,流处理可以简单地建模成流之间的转换,如下图所示:

在流处理过程中,将处理结果重新发布到Kafka有诸多好处。它将流处理的各部分解耦,不同的处理任务可以由不同的团队使用不同的技术实现,下游处理过程缓慢不会对上游过程造成反压,Kafka起到了缓冲区的作用。
实现流处理最基本的方法是使用Kafka API读取输入数据流进行处理,并产生输出数据流。这个过程可以用任何编程语言实现。这种方法比较简单,易于操作,适应于任何有Kafka客户端的语言。不过,有些流处理系统提供了额外的功能,使用它们构建复杂实时流处理会更简单。常见的流处理框架包括Storm、Samza和Spark Streaming。关于它们之间的差别,感兴趣的读者可以查看这里、这里和这里。
用Apache Kafka构建流数据平台的建议的更多相关文章
- 用Apache Kafka构建流数据平台
近来,有许多关于“流处理”和“事件数据”的讨论,它们往往都与像Kafka.Storm或Samza这样的技术相关.但并不是每个人都知道如何将这种技术引入他们自己的技术栈.于是,Confluent联合创始 ...
- Apache Kafka分布式流处理平台及大厂面试宝典v3.0.0
概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Apache Kafka官网地址 http://kafka.apache.org/ 最新版本为 3.0.0 Apach ...
- 重磅开源 KSQL:用于 Apache Kafka 的流数据 SQL 引擎 2017.8.29
Kafka 的作者 Neha Narkhede 在 Confluent 上发表了一篇博文,介绍了Kafka 新引入的KSQL 引擎——一个基于流的SQL.推出KSQL 是为了降低流式处理的门槛,为处理 ...
- 大数据 -- Cloudera Manager(简称CM)+CDH构建大数据平台
一.Cloudera Manager介绍 Cloudera Manager(简称CM)是Cloudera公司开发的一款大数据集群安装部署利器,这款利器具有集群自动化安装.中心化管理.集群监控.报警等功 ...
- 《基于Apache Kylin构建大数据分析平台》
Kyligence联合创始人兼CEO,Apache Kylin项目管理委员会主席(PMC Chair)韩卿 武汉市云升科技发展有限公司董事长,<智慧城市-大数据.物联网和云计算之应用>作者 ...
- CDH构建大数据平台-使用自建的镜像地址安装Cloudera Manager
CDH构建大数据平台-使用自建的镜像地址安装Cloudera Manager 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.搭建CM私有仓库 详情请参考我的笔记: http ...
- CDH构建大数据平台-配置集群的Kerberos认证安全
CDH构建大数据平台-配置集群的Kerberos认证安全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当平台用户使用量少的时候我们可能不会在一集群安全功能的缺失,因为用户少,团 ...
- CDH构建大数据平台-Kerberos高可用部署【完结篇】
CDH构建大数据平台-Kerberos高可用部署[完结篇] 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装Kerberos相关的软件包并同步配置文件 1>.实验环境 ...
- kafka实时流数据架构
初识kafka https://www.cnblogs.com/wenBlog/p/9550039.html 简介 Kafka经常用于实时流数据架构,用于提供实时分析.本篇将会简单介绍kafka以及它 ...
随机推荐
- java核心技术记录之java术语
术语名 缩写 解释 Java Development Kit JDK 编写java程序的程序员使用的软件 Java Runtime Environment JRE 运行java程序的用户使用的软件 S ...
- java基础知识回顾之javaIO类--java序列化和反序列化
/** * * 一:理解序列化反序列化及其应用 * 序列化:把堆内存的对象转化成字节流的过程. * 反序列化:把字节流序列恢复重构成对象的过程. * 对象的序列化的用途:1.把对象的字节序列持久化, ...
- 对于linux下system()函数的深度理解(整理)
原谅: http://blog.sina.com.cn/s/blog_8043547601017qk0.html 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同 ...
- HTML5 编辑 API 之 Range 对象(二)
1.Range.cloneContents()The Range.cloneContents() returns a DocumentFragment copying the objects of t ...
- iOS 使用COPY声明NSSTRING属性
使用COPY声明NSSTRING属性 2014/05/29 JACE 发表回复 声明一个NSString属性使用copy要优于使用strong.这同样适用于遵守NSCoding协议的不可变类(immu ...
- HTTP长连接实现“服务器推”的技术
HTTP长连接实现“服务器推”的技术快速入门及演示示例 在我的印象里HTTP是一种“无状态的协议”,也就是不知道以前请求的历史,无法保留上一次请求的结果.Cookie的诞生,弥补了这个不足,浏览器可以 ...
- 基于Jws的WebService项目
基于Jws的WebService项目 1.服务器端建立 1.1.创建接口 [java] view plaincopy @WebService public interface IWebServi ...
- 使用XSSFWork创建的xlsx后缀Excel文件无法打开
使用XSSFWork创建的xlsx后缀Excel文件无法打开 标签: POIExcelmicrosoftxlsx 2015-04-21 10:49 1170人阅读 评论(2) 收藏 举报 分类: Ja ...
- HDU 4483 Lattice triangle(欧拉函数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4483 题意:给出一个(n+1)*(n+1)的格子.在这个格子中存在多少个三角形? 思路:反着想,所有情 ...
- iOS学习笔记:frame,bound,center, anchorPoint
frame: View在它的Super View坐标系里的坐标 bound: 用来定义View自身坐标系和边界的Rect,Rect的原点表示View自身坐标系的原点坐标.举个例子: 一般情况下boun ...