Hadoop大数据仓库完整知识点详解
知识点1:集群的最主要瓶颈 ⭐⭐⭐
核心结论
磁盘IO是集群的最主要瓶颈
详细分析
为什么是磁盘IO?
- 硬件性能对比
- CPU运算速度:GHz级别(10^9次/秒)
- 内存访问速度:纳秒级别(10^-9秒)
- 网络传输速度:Gbps级别
- 磁盘IO速度:毫秒级别(10^-3秒),相对最慢
- 大数据场景特点
- 数据量巨大:TB、PB级别数据
- 频繁读写:MapReduce需要大量磁盘读写操作
- 随机访问:数据分布在不同磁盘块,产生随机IO
磁盘IO瓶颈的表现
- 任务等待磁盘读写时间长
- CPU利用率不高(等待IO完成)
- 网络带宽利用率不饱和
- 整体作业执行时间主要消耗在磁盘操作上
优化策略
- 硬件层面
- 使用SSD替代机械硬盘
- 增加内存容量,减少磁盘访问
- 使用RAID技术提高IO并发能力
- 软件层面
- 数据压缩减少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 - 分布式协调服务
核心功能
定义:开源的分布式应用程序协调服务
三大核心服务:
- 同步服务:
- 分布式锁机制
- 分布式队列实现
- 分布式屏障(barrier)
- 配置维护:
- 集中配置管理
- 配置变更通知
- 动态配置更新
- 命名服务:
- 分布式命名空间
- 服务发现机制
- 负载均衡支持
在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 - 日志采集系统
系统特点
- 高可用性:支持多种容错机制
- 高可靠性:数据传输保证不丢失
- 分布式架构:支持大规模集群部署
核心组件
- Source(源):
- Spooldir Source:监控目录中的新文件
- Taildir Source:监控文件变化
- Kafka Source:从Kafka消费数据
- HTTP Source:接收HTTP请求数据
- Channel(通道):
- Memory Channel:内存缓存,速度快但可能丢数据
- File Channel:文件缓存,可靠但速度较慢
- Kafka Channel:使用Kafka作为缓存
- 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;
优化技术
- 分区表:按时间、地区等维度分区
- 分桶表:数据分桶存储,提高Join效率
- 列式存储:ORC、Parquet格式
- 向量化执行:批量处理提高性能
- 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 ','
高级特性
- 增量导入:支持增量数据同步
- 并行处理:多Mapper并行提高效率
- 数据压缩:支持多种压缩格式
- 数据验证:导入后数据校验
- 作业调度:与Oozie集成支持定时任务
知识点4:Hadoop与Hadoop生态系统概念区别 ⭐⭐⭐
概念界定
Hadoop狭义定义
Hadoop核心指Hadoop框架本身,包含三个核心组件:
- HDFS(Hadoop Distributed File System)
- 分布式文件系统
- 提供高容错性的数据存储
- 设计用于运行在普通硬件上
- MapReduce
- 分布式计算框架
- 简化并行程序开发
- 自动处理任务调度和容错
- 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
Comments