跳到主要内容

大数据生态系统

大数据生态系统由众多组件构成,各组件协同工作,共同完成数据的采集、存储、计算、分析和应用。本章介绍大数据生态中的核心组件及其协作关系。

生态系统全景

大数据生态系统可以分为以下几个层次:

数据采集层

负责从各种数据源收集数据,并传输到存储系统。

组件类型说明
Flume日志采集分布式日志收集系统,支持多种数据源
Sqoop数据迁移关系数据库与Hadoop之间的数据传输
Kafka消息队列高吞吐分布式消息系统,支持数据缓冲
Canal数据同步MySQL binlog实时同步工具
DataX数据同步阿里开源的离线数据同步工具
Maxwell数据同步MySQL实时数据同步工具

数据存储层

负责海量数据的持久化存储。

组件类型说明
HDFS文件系统分布式文件存储,大文件顺序读写
HBaseNoSQL列式存储,实时随机读写
Hive数据仓库基于HDFS的数据仓库,SQL查询
Kudu存储支持实时读写的列式存储
ClickHouseOLAP高性能列式OLAP数据库
DorisOLAP百度开源的MPP分析数据库

计算引擎层

负责数据的处理和分析计算。

组件类型说明
MapReduce批处理Hadoop原生计算框架
Spark通用计算内存计算引擎,批流一体
Flink流处理实时流处理引擎,低延迟
Presto交互查询分布式SQL查询引擎
Impala交互查询基于Hive的MPP查询引擎

资源调度层

负责集群资源的统一管理和调度。

组件说明
YARNHadoop资源管理器
Mesos通用集群资源管理器
Kubernetes容器编排平台

协调服务

负责分布式系统的协调和管理。

组件说明
ZooKeeper分布式协调服务,配置管理、选举、分布式锁

核心组件详解

Kafka 消息队列

Kafka是分布式流处理平台,核心概念包括:

基本概念

概念说明
Producer消息生产者
Consumer消息消费者
BrokerKafka服务节点
Topic消息主题,消息的逻辑分类
Partition分区,Topic的物理分片
Consumer Group消费者组,实现消息广播和单播

生产者使用

import org.apache.kafka.clients.producer.*;

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(props);

// 发送消息
ProducerRecord<String, String> record = new ProducerRecord<>("topic", "key", "value");
producer.send(record, (metadata, exception) -> {
if (exception == null) {
System.out.println("Sent to partition " + metadata.partition());
}
});

producer.close();

消费者使用

import org.apache.kafka.clients.consumer.*;

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("auto.offset.reset", "earliest");

Consumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("topic"));

while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
System.out.println("Received: " + record.value());
}
}

ZooKeeper 协调服务

ZooKeeper是分布式协调服务,提供配置管理、命名服务、分布式同步等功能。

数据模型

ZooKeeper使用树形目录结构,每个节点称为ZNode:

/
├── zookeeper
├── hbase
│ ├── meta-region-server
│ └── rs
├── kafka
│ └── brokers
└── consumers

常用操作

import org.apache.zookeeper.*;

// 创建连接
ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, event -> {
System.out.println("Event: " + event.getType());
});

// 创建节点
zk.create("/path", "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

// 获取数据
byte[] data = zk.getData("/path", false, null);

// 设置数据
zk.setData("/path", "new-data".getBytes(), -1);

// 删除节点
zk.delete("/path", -1);

// 监听节点变化
zk.exists("/path", event -> {
System.out.println("Node changed: " + event.getType());
});

典型应用

  1. 配置管理:集中存储和管理配置信息
  2. 命名服务:提供统一的命名注册和发现
  3. 分布式锁:实现分布式环境下的互斥访问
  4. 集群选举:实现Master选举

Flume 日志采集

Flume是分布式日志收集系统,由Source、Channel、Sink三部分组成。

架构模型

Source -> Channel -> Sink
  • Source:数据源,接收数据
  • Channel:通道,暂存数据
  • Sink:目的地,发送数据

配置示例

# 定义组件
agent.sources = src1
agent.channels = ch1
agent.sinks = sink1

# 配置Source
agent.sources.src1.type = exec
agent.sources.src1.command = tail -F /var/log/app.log

# 配置Channel
agent.channels.ch1.type = memory
agent.channels.ch1.capacity = 1000

# 配置Sink
agent.sinks.sink1.type = hdfs
agent.sinks.sink1.hdfs.path = hdfs://namenode:8020/flume/events

# 绑定组件
agent.sources.src1.channels = ch1
agent.sinks.sink1.channel = ch1

Sqoop 数据迁移

Sqoop用于在Hadoop和关系数据库之间传输数据。

导入数据

# 从MySQL导入到HDFS
sqoop import \
--connect jdbc:mysql://localhost:3306/db \
--username root \
--password password \
--table users \
--target-dir /user/hadoop/users \
--fields-terminated-by ','

# 从MySQL导入到Hive
sqoop import \
--connect jdbc:mysql://localhost:3306/db \
--username root \
--password password \
--table users \
--hive-import \
--hive-table default.users

导出数据

# 从HDFS导出到MySQL
sqoop export \
--connect jdbc:mysql://localhost:3306/db \
--username root \
--password password \
--table users \
--export-dir /user/hadoop/users \
--input-fields-terminated-by ','

数据湖与湖仓一体

数据湖概念

数据湖是一个集中存储各种格式原始数据的存储库:

  • 特点:存储原始数据、支持多种格式、Schema-on-Read
  • 优势:灵活性高、成本低、支持各种分析

湖仓一体

湖仓一体结合了数据湖和数据仓库的优点:

特性数据湖数据仓库湖仓一体
数据格式原始格式结构化两者兼容
Schema读时定义写时定义写时定义
事务支持ACIDACID
成本
查询性能一般

主流技术方案

方案说明
Delta LakeDatabricks开源,Spark生态
Apache IcebergNetflix开源,多引擎支持
Apache HudiUber开源,支持增量处理

实时数仓架构

Lambda 架构

Lambda架构是经典的实时数仓架构,包含三层:

  1. 批处理层(Batch Layer):处理全量数据,保证准确性
  2. 加速层(Speed Layer):处理实时数据,保证低延迟
  3. 服务层(Serving Layer):合并两层结果,提供查询
         ┌─────────────┐
│ Batch Layer │
└──────┬──────┘

数据源 ─────────┼─────────> 服务层 ──> 查询

┌──────┴──────┐
│ Speed Layer │
└─────────────┘

Kappa 架构

Kappa架构简化了Lambda,只保留流处理层:

数据源 -> Kafka -> Flink -> 服务层 -> 查询

优势:架构简单、维护成本低、数据一致性更好

数据治理

元数据管理

工具说明
Apache Atlas企业级元数据管理和治理
DataHubLinkedIn开源的元数据平台
AmundsenLyft开源的数据发现平台

数据质量

工具说明
Apache Griffin大数据质量监控平台
DeequAWS开源的数据质量库
Great ExpectationsPython数据质量框架

数据血缘

数据血缘追踪数据的来源和去向:

  • 字段级血缘:追踪字段级别的转换关系
  • 表级血缘:追踪表之间的依赖关系
  • 任务级血缘:追踪ETL任务的依赖关系

小结

本章介绍了大数据生态系统的核心组件:

  1. 数据采集:Flume、Sqoop、Kafka、Canal
  2. 数据存储:HDFS、HBase、Hive、Kudu
  3. 计算引擎:MapReduce、Spark、Flink
  4. 资源调度:YARN、Kubernetes
  5. 协调服务:ZooKeeper
  6. 数据湖:Delta Lake、Iceberg、Hudi
  7. 实时架构:Lambda、Kappa
  8. 数据治理:元数据管理、数据质量、数据血缘

大数据生态系统庞大复杂,实际项目中需要根据业务需求选择合适的组件组合。理解各组件的定位和协作关系,是构建大数据平台的基础。