当前位置: 首页 > news >正文

【Note】《Kafka: The Definitive Guide》第7章 Building Data Pipelines

《Kafka: The Definitive Guide》第7章 Building Data Pipelines

一、什么是数据管道?

数据管道(Data Pipeline)指的是在分布式环境下,将数据从源端系统可靠、高效地 提取(Extract)转换(Transform)加载(Load) 到目标系统的全自动化流程。在大数据场景中,数据管道负责:

  1. 数据摄取:把事务型数据库、日志系统、消息队列、文件系统等各种异构数据源的变更或新增数据,实时或批量地写入 Kafka。
  2. 数据处理:对流经 Kafka 的消息进行清洗、聚合、衍生、过滤等操作。
  3. 数据分发:将处理结果写入下游存储或计算系统,如 Elasticsearch、HDFS、另一个 Kafka 集群、关系型数据库、实时 OLAP 引擎等。

Kafka 凭借高吞吐、持久化、可扩展的特性,天然适合成为 “流式数据总线”,构成大规模数据管道的中枢。


二、核心组件一览

在本章,作者介绍了三个构建流式管道的核心技术栈:

组件核心职责适用场景
Kafka Connect提供可插拔的 Source Connector 和 Sink Connector,实现各种系统与 Kafka 的无缝对接多源异构系统的简单接入
MirrorMaker 2在跨数据中心、跨集群环境下,进行高吞吐、低延迟的数据复制跨机房灾备、集群升级迁移
Kafka Streams轻量级库,直接在 JVM 内进行流式处理,支持丰富的转换、聚合、窗口语义应用内嵌入式流处理

下面逐一展开。


三、Kafka Connect:一站式源汇集成

1. Connect 架构

  • Worker:运行 Connector 的进程,可单机或集群部署。
  • Connector:DataSource → Kafka(Source)或 Kafka → DataSink(Sink)的插件。
  • Task:Connector 的执行单元,实际负责拉取/推送数据。一个 Connector 可并行启动多个 Task。

中心化的 分布式配置自动负载均衡故障切换,让开发者专注写 Connector,不必再手动维护大量脚本。

2. 快速上手:搭建一个 JDBC Source

以下示例演示如何将关系型数据库 users 表的新增行持续写入 Kafka topic db-users

# connect-jdbc-source.properties
name=jdbc-source-users
connector.class=io.confluent.connect.jdbc.JdbcSourceConnector
tasks.max=3
connection.url=jdbc:postgresql://db.example.com:5432/appdb
connection.user=appuser
connection.password=apppass
topic.prefix=db-
table.whitelist=users
mode=incrementing
incrementing.column.name=id

启动命令:

bin/connect-standalone.sh config/connect-standalone.properties \config/connect-jdbc-source.properties

👉 解析

  • mode=incrementing:按自增主键增量拉取。
  • topic.prefix:自动将 users 表数据写到 db-users 主题。
  • tasks.max=3:并行度,由 Connector 自动分配分区给 Task。

3. Sink Connector 配置示例

将 Kafka 中的订单数据写入 Elasticsearch:

name=es-sink-orders
connector.class=io.confluent.connect.elasticsearch.ElasticsearchSinkConnector
tasks.max=2
topics=orders
connection.url=http://es.example.com:9200
type.name=_doc
key.ignore=false
schema.ignore=true

启动同理,管道即搭建完成。


四、跨集群复制——MirrorMaker 2

对于多活架构、蓝绿升级或灾备需求,Kafka 提供了 MirrorMaker 2(MM2),它基于 Kafka Connect 扩展而来。

1. 工作原理

  • 在源集群部署一个 MirrorMaker 实例,配置 sourcetarget connector。
  • 利用内部消费者消费源集群所有指定 topics,再以生产者角色写入目标集群。
  • 支持双向复制,能自动识别和过滤回环(loop)。

2. 配置示例

# mm2.properties
clusters = A, BA.bootstrap.servers = source1:9092,source2:9092
B.bootstrap.servers = target1:9092,target2:9092A->B.enabled = true
A->B.topics = .*
A->B.sync.topic.configs = true
A->B.emit.heartbeats.enabled = true
A->B.emit.checkpoints.enabled = true
replication.policy.class = org.apache.kafka.connect.mirror.DefaultReplicationPolicy

启动:

bin/connect-mirror-maker.sh mm2.properties

3. 典型场景

  • 多 Region 数据分发:将业务数据同时复制到多个机房,降低跨区访问延迟。
  • 灾备切换:一旦主集群故障,可快速把消费者切换到备集群。
  • 集群升级迁移:渐进式迁移 Topic,实现零宕机迁移。

五、数据流处理——Kafka Streams

Kafka Streams 提供在 JVM 进程内的轻量级流式处理能力,无需独立集群。

1. 核心概念

  • 流(KStream):无限事件流。
  • 表(KTable):可更新的键值存储,代表数据快照。
  • 全局表(GlobalKTable):在每个实例都本地化完整数据。

2. 常见操作

  • map/filter:一条条消息级别转换与过滤
  • join:流与流、流与表的多种关联
  • aggregate:基于键的滚动聚合、窗口聚合

3. 简单示例:实时订单聚合

StreamsBuilder builder = new StreamsBuilder();
KStream<String, Order> orders = builder.stream("orders");KTable<Windowed<String>, Long> counts = orders.groupBy((k, order) -> order.getCustomerId()).windowedBy(TimeWindows.of(Duration.ofMinutes(5))).count();counts.toStream().map((windowedKey, count) -> new KeyValue<>(windowedKey.key(),new CustomerOrderCount(windowedKey.window(), count))).to("order-counts", Produced.with(Serdes.String(), /* serde for CustomerOrderCount */));
  • 窗口(Windowed):以 5 分钟为滚动窗口。
  • 结果写入:Topic order-counts,供实时仪表盘或告警系统消费。

六、最佳实践与设计模式

  1. 分层管道

    • 摄取层(Ingestion):Connect、MirrorMaker
    • 处理层(Processing):Streams、Flink、Spark Streaming
    • 服务层(Serving):Elasticsearch、Cassandra、ClickHouse 等
  2. 幂等与容错

    • Source/Sink Connector 配置 tasks.max>1 时,确保下游消费端具备幂等写入能力。
    • Streams 应用启用 processing.guarantee=exactly_once_v2
  3. 监控与度量

    • 利用 JMX 指标、Confluent Control Center 或 Prometheus + Grafana,监控 Connector 失败率、延迟、吞吐等。
    • 配置 Dead Letter Queue(DLQ),对转换失败的消息做落盘或告警。
  4. Schema 管理

    • 强烈建议使用 Schema Registry 管理 Avro/Protobuf/JSON Schema,保证数据兼容性与演进安全。

七、小结

  • Kafka Connect:无代码或少量配置即能对接异构数据源和目标系统;
  • MirrorMaker 2:跨集群、跨数据中心的高效数据复制方案;
  • Kafka Streams:在应用层快速构建实时数据处理流程。

本章主要介绍如何在生产环境里,以模块化、可运维、可扩展的方式,构建和管理自己的流式数据管道

http://www.lryc.cn/news/582220.html

相关文章:

  • 源哈希(sh)解析
  • etcd-cpp-apiv3 二次封装
  • [学习] C语言数学库函数背后的故事:`double erf(double x)`
  • 【数据分析】R语言基于虚弱指数的心血管疾病风险评估
  • JS实现基础算法与dom的结构
  • Spring MVC HandlerInterceptor 拦截请求及响应体
  • 【Netty高级】Netty的技术内幕
  • token非对称加密
  • AI的出现,是否能替代IT从业者
  • React19 新增Hooks:useOptimistic
  • 系统学习Python——并发模型和异步编程:进程、线程和GIL
  • 量子计算+AI芯片:光子计算如何重构神经网络硬件生态
  • 动手学深度学习13.7. 单发多框检测(SSD)-笔记练习(PyTorch)
  • Android 10 Gnss数据流程
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频质量评估与智能修复(337)
  • uniapp的navigator跳转功能
  • STEP 7 MicroWIN SMART V2.2 的详细安装步骤及注意事项
  • 【世纪龙科技】汽车钣金虚拟仿真教学实训软件
  • 源码推送到gitee码云仓库
  • 华为OD 二维伞的雨滴效应
  • JDBC 注册驱动的常用方法详解
  • Spring Data JPA基本方法调用规律
  • RK3588 Android SDK 实战全解析 —— 架构、原理与开发关键点
  • linux qt 使用log4cpp库
  • 对象存储-OSS
  • centos停止维护后更换yum源
  • Centos Docker 安装(100%成功)
  • 腾讯云 CDN 不支持 WebSocket 的现状与华为云 CDN 的替代方案-优雅草卓伊凡
  • 【DPDK应用篇】事件驱动架构:eventdev异步处理模型的设计与实现
  • 循环移位网络设计