Hadoop大数据仓库完整知识点详解

知识点1:集群的最主要瓶颈 ⭐⭐⭐

核心结论

磁盘IO是集群的最主要瓶颈

详细分析

为什么是磁盘IO?

  1. 硬件性能对比
    • CPU运算速度:GHz级别(10^9次/秒)
    • 内存访问速度:纳秒级别(10^-9秒)
    • 网络传输速度:Gbps级别
    • 磁盘IO速度:毫秒级别(10^-3秒),相对最慢
  2. 大数据场景特点
    • 数据量巨大:TB、PB级别数据
    • 频繁读写:MapReduce需要大量磁盘读写操作
    • 随机访问:数据分布在不同磁盘块,产生随机IO

磁盘IO瓶颈的表现

  • 任务等待磁盘读写时间长
  • CPU利用率不高(等待IO完成)
  • 网络带宽利用率不饱和
  • 整体作业执行时间主要消耗在磁盘操作上

优化策略

  1. 硬件层面
    • 使用SSD替代机械硬盘
    • 增加内存容量,减少磁盘访问
    • 使用RAID技术提高IO并发能力
  2. 软件层面
    • 数据压缩减少IO量
    • 合理设置缓冲区大小
    • 优化数据布局和访问模式

知识点2:Hadoop运行模式 ⭐⭐⭐

三种运行模式详解

1. 单机版(Standalone Mode)

特点描述

  • 所有Hadoop组件运行在单个Java进程中
  • 不使用HDFS,直接操作本地文件系统
  • 没有分布式特性,主要用于调试

配置特点

<!-- core-site.xml -->
<configuration>
    <!-- 不配置fs.defaultFS,默认使用file:// -->
</configuration>

<!-- mapred-site.xml -->
<configuration>
    <!-- 不配置mapreduce.framework.name,默认使用local -->
</configuration>

应用场景

  • 开发人员本地调试MapReduce程序
  • 学习Hadoop基本概念
  • 快速验证程序逻辑正确性

优缺点

  • 优点:配置简单,启动快速,便于调试
  • 缺点:无法体现分布式特性,性能有限

2. 伪分布式模式(Pseudo-Distributed Mode)

特点描述

  • 所有守护进程运行在单台机器上,但在不同Java进程中
  • 使用HDFS文件系统
  • 模拟分布式环境,但实际只有一个节点

核心配置

<!-- core-site.xml -->
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

<!-- hdfs-site.xml -->
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>  <!-- 单节点,副本数设为1 -->
    </property>
</configuration>

<!-- mapred-site.xml -->
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

<!-- yarn-site.xml -->
<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>localhost</value>
    </property>
</configuration>

启动进程

  • NameNode
  • DataNode
  • SecondaryNameNode
  • ResourceManager
  • NodeManager

应用场景

  • 学习分布式文件系统操作
  • 测试YARN资源调度功能
  • 验证集群配置的正确性

3. 完全分布式模式(Fully-Distributed Mode)

特点描述

  • 多台机器组成真正的集群
  • 各节点承担不同角色和职责
  • 具备完整的分布式特性和容错能力

典型架构

主节点(Master Node):
- NameNode
- SecondaryNameNode  
- ResourceManager

从节点(Slave Nodes):
- DataNode
- NodeManager

配置要点

<!-- core-site.xml -->
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://masternode:9000</value>
    </property>
</configuration>

<!-- hdfs-site.xml -->
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>  <!-- 生产环境通常设为3 -->
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>secondarynamenode:50090</value>
    </property>
</configuration>

集群规划示例

节点角色 主机名 IP地址 部署组件
主节点 hadoop-master 192.168.1.100 NameNode, ResourceManager
辅助节点 hadoop-secondary 192.168.1.101 SecondaryNameNode
数据节点1 hadoop-slave1 192.168.1.102 DataNode, NodeManager
数据节点2 hadoop-slave2 192.168.1.103 DataNode, NodeManager
数据节点3 hadoop-slave3 192.168.1.104 DataNode, NodeManager

应用场景

  • 生产环境部署
  • 大规模数据处理
  • 企业级数据仓库建设

知识点3:Hadoop生态圈核心组件详解 ⭐⭐⭐⭐⭐

1. Zookeeper - 分布式协调服务

核心功能

定义:开源的分布式应用程序协调服务

三大核心服务

  1. 同步服务
    • 分布式锁机制
    • 分布式队列实现
    • 分布式屏障(barrier)
  2. 配置维护
    • 集中配置管理
    • 配置变更通知
    • 动态配置更新
  3. 命名服务
    • 分布式命名空间
    • 服务发现机制
    • 负载均衡支持

在Hadoop中的应用

  • HDFS高可用:管理Active/Standby NameNode状态
  • YARN高可用:ResourceManager故障转移
  • HBase:RegionServer状态管理
  • Kafka:Broker协调和Consumer分组

工作原理

Zookeeper集群(通常3或5个节点)
├── Leader节点:处理写请求
├── Follower节点:处理读请求,参与选举
└── Observer节点:处理读请求,不参与选举

数据模型:类似文件系统的树形结构

/
├── hadoop-ha
│   ├── mycluster
│   │   ├── ActiveStandbyElectorLock
│   │   └── ActiveBreadCrumb
├── hbase
│   ├── meta-region-server
│   └── backup-masters
└── yarn-leader-election
    └── mycluster
        └── ActiveStandbyElectorLock

2. Flume - 日志采集系统

系统特点

  • 高可用性:支持多种容错机制
  • 高可靠性:数据传输保证不丢失
  • 分布式架构:支持大规模集群部署

核心组件

  1. Source(源)
    • Spooldir Source:监控目录中的新文件
    • Taildir Source:监控文件变化
    • Kafka Source:从Kafka消费数据
    • HTTP Source:接收HTTP请求数据
  2. Channel(通道)
    • Memory Channel:内存缓存,速度快但可能丢数据
    • File Channel:文件缓存,可靠但速度较慢
    • Kafka Channel:使用Kafka作为缓存
  3. Sink(目标)
    • HDFS Sink:写入HDFS
    • HBase Sink:写入HBase
    • Elasticsearch Sink:写入ES
    • Kafka Sink:发送到Kafka

配置示例

# Agent配置
a1.sources = r1
a1.sinks = k1  
a1.channels = c1

# Source配置
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /opt/logs
a1.sources.r1.channels = c1

# Channel配置
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 1000

# Sink配置
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = /flume/logs/%Y/%m/%d
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.channel = c1

典型应用场景

  • 日志采集:Web服务器日志采集到HDFS
  • 实时数据流:实时数据传输到Kafka或HBase
  • 数据同步:数据库变更日志同步

3. HBase - 分布式NoSQL数据库

核心特点

  • 分布式:数据分布存储在多个节点
  • 面向列:按列族存储数据
  • 基于HDFS:底层存储依赖HDFS
  • 随机读写:支持快速随机访问

数据模型

Table(表)
├── Row(行)- 由RowKey标识
│   ├── Column Family 1(列族1)
│   │   ├── Column1:Timestamp1 -> Value1
│   │   └── Column2:Timestamp2 -> Value2
│   └── Column Family 2(列族2)
│       ├── Column3:Timestamp3 -> Value3
│       └── Column4:Timestamp4 -> Value4

系统架构

HBase架构
├── HMaster(主节点)
│   ├── 表的DDL操作
│   ├── Region分配管理
│   └── 负载均衡
├── RegionServer(区域服务器)
│   ├── 管理Region
│   ├── 处理读写请求
│   └── 数据压缩和分裂
└── Zookeeper集群
    ├── HMaster选举
    ├── RegionServer状态监控
    └── 元数据存储

应用场景

  • 实时查询:支持毫秒级随机查询
  • 大数据存储:TB到PB级数据存储
  • 时序数据:IoT设备数据、监控数据
  • 推荐系统:用户行为数据存储

4. Hive - 数据仓库工具

核心功能

定义:基于Hadoop的数据仓库工具,将SQL转换为MapReduce任务

主要特点

  • SQL接口:支持类SQL语言HiveQL
  • 数据抽象:将文件映射为数据库表
  • 批处理导向:适合大数据批量分析
  • 可扩展:支持自定义函数(UDF)

系统架构

Hive架构
├── CLI/Web Interface(客户端)
├── Driver(驱动程序)
│   ├── Compiler(编译器)
│   ├── Optimizer(优化器)
│   └── Executor(执行器)
├── Metastore(元数据存储)
│   ├── 表结构信息
│   ├── 分区信息
│   └── 存储位置信息
└── Hadoop Cluster
    ├── HDFS(数据存储)
    └── YARN(资源调度)

数据类型

基本数据类型

  • TINYINT, SMALLINT, INT, BIGINT
  • FLOAT, DOUBLE, DECIMAL
  • STRING, VARCHAR, CHAR
  • BOOLEAN, BINARY
  • TIMESTAMP, DATE

复杂数据类型

  • ARRAY: ARRAY<INT>
  • MAP: MAP<STRING,INT>
  • STRUCT: STRUCT<name:STRING, age:INT>
  • UNION: UNIONTYPE<INT,DOUBLE,STRING>

HiveQL示例

-- 创建表
CREATE TABLE user_behavior(
    user_id STRING,
    item_id STRING,
    category_id STRING,
    behavior_type STRING,
    timestamp STRING
)
PARTITIONED BY (dt STRING)
STORED AS TEXTFILE
LOCATION '/warehouse/user_behavior/';

-- 数据查询
SELECT 
    category_id,
    COUNT(*) as pv,
    COUNT(DISTINCT user_id) as uv
FROM user_behavior 
WHERE dt = '2023-01-01' 
    AND behavior_type = 'pv'
GROUP BY category_id
ORDER BY pv DESC
LIMIT 10;

优化技术

  1. 分区表:按时间、地区等维度分区
  2. 分桶表:数据分桶存储,提高Join效率
  3. 列式存储:ORC、Parquet格式
  4. 向量化执行:批量处理提高性能
  5. CBO优化:基于成本的查询优化

5. Sqoop - 数据传输工具

核心功能

定义:关系型数据库与Hadoop之间的数据传输工具

双向传输

  • Import:关系型数据库 → HDFS/Hive/HBase
  • Export:HDFS/Hive/HBase → 关系型数据库

支持的数据库

  • MySQL, PostgreSQL, Oracle
  • SQL Server, DB2, Teradata
  • Mainframe databases

工作原理

Sqoop工作流程
1. 连接数据库获取元数据信息
2. 生成MapReduce作业
3. 启动多个Mapper并行传输数据
4. 数据格式转换和存储

命令示例

导入数据

# 从MySQL导入到HDFS
sqoop import \
    --connect jdbc:mysql://localhost:3306/retail_db \
    --username root \
    --password cloudera \
    --table customers \
    --target-dir /user/cloudera/customers \
    --num-mappers 4 \
    --fields-terminated-by ','

# 导入到Hive表
sqoop import \
    --connect jdbc:mysql://localhost:3306/retail_db \
    --username root \
    --password cloudera \
    --table orders \
    --hive-import \
    --hive-table retail.orders \
    --num-mappers 2

导出数据

# 从HDFS导出到MySQL
sqoop export \
    --connect jdbc:mysql://localhost:3306/retail_db \
    --username root \
    --password cloudera \
    --table customers_hadoop \
    --export-dir /user/cloudera/customers \
    --fields-terminated-by ','

高级特性

  1. 增量导入:支持增量数据同步
  2. 并行处理:多Mapper并行提高效率
  3. 数据压缩:支持多种压缩格式
  4. 数据验证:导入后数据校验
  5. 作业调度:与Oozie集成支持定时任务

知识点4:Hadoop与Hadoop生态系统概念区别 ⭐⭐⭐

概念界定

Hadoop狭义定义

Hadoop核心指Hadoop框架本身,包含三个核心组件:

  1. HDFS(Hadoop Distributed File System)
    • 分布式文件系统
    • 提供高容错性的数据存储
    • 设计用于运行在普通硬件上
  2. MapReduce
    • 分布式计算框架
    • 简化并行程序开发
    • 自动处理任务调度和容错
  3. YARN(Yet Another Resource Negotiator)
    • 资源管理系统
    • 作业调度和集群资源管理
    • 支持多种计算框架

Hadoop广义定义(生态系统)

Hadoop生态系统是一个更大的概念,包括:

核心框架

  • Hadoop Core(HDFS + MapReduce + YARN)

数据存储

  • HBase:NoSQL数据库
  • Cassandra:分布式数据库
  • MongoDB:文档数据库

数据处理

  • Hive:数据仓库
  • Pig:数据流语言
  • Spark:内存计算框架
  • Storm:实时计算框架

数据传输

  • Sqoop:关系型数据库数据传输
  • Flume:日志采集系统
  • Kafka:消息队列系统

集群管理

  • Zookeeper:分布式协调服务
  • Ambari:集群管理工具
  • Cloudera Manager:企业级管理平台

工作流调度

  • Oozie:工作流调度器
  • Azkaban:批处理工作流调度器

关系图解

Hadoop生态系统
├── 核心层(Hadoop Core)
│   ├── HDFS(存储层)
│   ├── MapReduce(计算层)
│   └── YARN(资源管理层)
├── 存储扩展层
│   ├── HBase(实时数据库)
│   └── Kudu(列式存储)
├── 计算扩展层
│   ├── Spark(内存计算)
│   ├── Storm(流计算)
│   └── Flink(流批统一)
├── 数据接入层
│   ├── Flume(日志采集)
│   ├── Sqoop(数据同步)
│   └── Kafka(消息队列)
├── 数据分析层
│   ├── Hive(数据仓库)
│   ├── Pig(数据流)
│   └── Impala(实时查询)
├── 协调服务层
│   └── Zookeeper(分布式协调)
├── 管理监控层
│   ├── Ambari(集群管理)
│   └── Ganglia(监控系统)
└── 工作流层
    ├── Oozie(工作流调度)
    └── Airflow(现代工作流)

发展演进

第一代:Hadoop 1.x

  • 核心:HDFS + MapReduce
  • 限制:JobTracker单点故障,资源利用率低

第二代:Hadoop 2.x

  • 引入:YARN资源管理框架
  • 改进:解决单点故障,支持多种计算框架

第三代:Hadoop 3.x

  • 增强:支持多NameNode,纠删码支持
  • 优化:性能提升,云原生支持

知识点5:Hadoop集群核心进程详解 ⭐⭐⭐⭐⭐

HDFS相关进程

1. NameNode - 文件系统主节点

核心职责

  • 命名空间管理:维护文件系统的目录树
  • 元数据存储:文件到数据块的映射关系
  • 数据块管理:数据块位置信息和副本策略
  • 客户端访问:处理客户端的读写请求

存储的元数据信息

元数据类型
├── 文件系统树结构
│   ├── 目录层次关系
│   ├── 文件名称和权限
│   └── 文件大小和修改时间
├── 数据块映射
│   ├── 文件到Block的映射
│   ├── Block ID和大小信息
│   └── 数据块副本数量
└── DataNode信息
    ├── 活跃DataNode列表
    ├── 数据块位置映射
    └── 心跳状态监控

内存结构

  • FSImage:文件系统镜像,存储文件系统快照
  • EditLog:编辑日志,记录所有变更操作
  • 工作流程:先写EditLog,再更新内存,定期合并生成新的FSImage

高可用机制

  • Active/Standby模式:双NameNode热备
  • 共享存储:通过QJM(Quorum Journal Manager)同步EditLog
  • 自动故障转移:ZKFC监控并自动切换

2. SecondaryNameNode - 辅助节点

重要说明:不是NameNode的备份或冗余

核心功能

  • 检查点操作:定期合并FSImage和EditLog
  • 减少启动时间:避免NameNode启动时处理大量EditLog
  • 内存压力缓解:帮助NameNode减少内存使用

工作流程

SecondaryNameNode检查点流程
1. 请求NameNode停止使用当前EditLog
2. NameNode创建新的EditLog继续服务
3. SecondaryNameNode下载FSImage和EditLog
4. 在本地合并FSImage和EditLog
5. 生成新的FSImage上传给NameNode
6. NameNode用新FSImage替换旧的

配置参数

<!-- 检查点时间间隔(秒) -->
<property>
    <name>dfs.namenode.checkpoint.period</name>
    <value>3600</value>
</property>

<!-- EditLog事务数阈值 -->
<property>
    <name>dfs.namenode.checkpoint.txns</name>
    <value>1000000</value>
</property>

3. DataNode - 数据存储节点

主要职责

  • 数据存储:实际存储HDFS数据块
  • 数据服务:响应客户端读写请求
  • 心跳报告:定期向NameNode报告状态
  • 数据完整性:数据块校验和维护

存储结构

DataNode存储目录
├── current/
│   ├── BP-随机ID/(Block Pool)
│   │   ├── current/
│   │   │   ├── finalized/(已完成的数据块)
│   │   │   ├── rbw/(正在写入的数据块)
│   │   │   └── tmp/(临时数据块)
│   │   └── scanner.cursor
│   └── VERSION
├── in_use.lock
└── storage

心跳机制

  • 心跳间隔:默认3秒向NameNode发送心跳
  • 心跳内容:节点状态、存储容量、数据块报告
  • 超时处理:10分30秒未收到心跳,标记为Dead节点

数据完整性

  • 校验和:每个数据块都有对应的校验和文件
  • 定期扫描:DataNode定期扫描数据块验证完整性
  • 损坏处理:发现损坏数据块立即报告NameNode

4. ResourceManager - 资源管理器

YARN架构核心组件,替代Hadoop 1.x的JobTracker

主要功能

  • 资源分配:集群资源的统一调度和分配
  • 应用管理:应用程序生命周期管理
  • 容错处理:ApplicationMaster故障恢复

内部组件

ResourceManager组件
├── ResourceScheduler(资源调度器)
│   ├── CapacityScheduler(容量调度器)
│   ├── FairScheduler(公平调度器)
│   └── FifoScheduler(先进先出调度器)
├── ApplicationsManager(应用管理器)
│   ├── 接收作业提交
│   ├── 启动ApplicationMaster
│   └── 监控ApplicationMaster
└── ResourceTrackerService(资源跟踪服务)
    ├── 注册NodeManager
    ├── 接收心跳信息
    └── 监控节点状态

资源抽象

<!-- 内存资源配置 -->
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>8192</value>
</property>

<!-- CPU资源配置 -->
<property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>4</value>
</property>

5. NodeManager - 节点管理器

主要职责

  • 本地资源管理:管理单个节点的CPU、内存等资源
  • Container管理:Container生命周期管理
  • 任务执行:启动和监控任务进程
  • 日志管理:收集和管理应用日志

Container概念

  • YARN中资源分配的基本单位
  • 包含CPU、内存、磁盘、网络等资源
  • 类似于操作系统中的进程概念

工作流程

NodeManager工作流程
1. 启动时向ResourceManager注册
2. 定期发送心跳汇报资源使用情况
3. 接收ResourceManager的Container分配
4. 启动Container并监控其运行状态
5. Container结束后清理资源和日志

高可用相关进程

6. DFSZKFailoverController(ZKFC)

高可用架构专用组件

核心功能

  • 状态监控:监控本地NameNode的健康状态
  • 状态同步:将状态信息及时写入ZooKeeper
  • 自动切换:检测到故障时触发主备切换

工作原理

ZKFC工作机制
1. 通过独立线程周期性调用NameNode健康检查接口
2. 将NameNode状态(Active/Standby/Failed)写入ZK
3. 竞争ZK中的锁节点决定哪个NameNode为Active
4. 检测到Active NameNode故障时,触发故障转移

选主策略

  • 先到先得:最先在ZK中创建锁节点的成为Active
  • 轮换机制:故障恢复后可能发生主备轮换

7. JournalNode

QJM(Quorum Journal Manager)的核心组件

作用

  • 共享存储:为NameNode HA提供共享的EditLog存储
  • 数据一致性:通过Quorum机制保证数据一致性
  • 故障容错:支持部分节点故障的情况下正常工作

Quorum机制

  • 通常部署奇数个JournalNode(如3个或5个)
  • 写操作需要多数节点成功才算成功
  • 3个节点可容忍1个故障,5个节点可容忍2个故障

存储结构

JournalNode存储
├── 命名空间目录/
│   ├── current/
│   │   ├── edits_inprogress_xxx(进行中的EditLog)
│   │   ├── edits_xxx-yyy(已完成的EditLog)
│   │   └── seen_txid(已见事务ID)
│   └── committed-txid(已提交事务ID)

写入流程

EditLog写入流程
1. Active NameNode向所有Journal