Hadoop 技术详解
目录
Hadoop 概述
什么是 Hadoop
提示
Hadoop 是一个开源的分布式存储和计算框架,专门用于处理大规模数据集。它基于 Google 的 MapReduce 和 GFS 论文设计,能够以可靠、高效、可伸缩的方式处理海量数据。
Hadoop 核心特点
- 高可靠性:数据自动保存多个副本,容错能力强
- 高扩展性:可扩展到数千个节点,处理 PB 级数据
- 高效性:数据并行处理,提高处理效率
- 高容错性:自动检测和处理硬件故障
- 低成本:基于普通硬件构建,成本低廉
Hadoop 发展历程
- 2003 年:Google 发布 GFS 论文
- 2004 年:Google 发布 MapReduce 论文
- 2006 年:Doug Cutting 创建 Hadoop 项目
- 2008 年:Hadoop 成为 Apache 顶级项目
- 2011 年:Hadoop 1.0 正式发布
- 2013 年:Hadoop 2.0 发布,引入 YARN
- 2017 年:Hadoop 3.0 发布,支持纠删码
Hadoop 核心组件
1. HDFS (Hadoop Distributed File System)
HDFS 是 Hadoop 的分布式文件系统,具有以下特点:
- 大文件存储:适合存储 GB、TB 级别的大文件
- 流式数据访问:适合批量处理,不适合低延迟访问
- 简单一致性模型:一次写入,多次读取
- 移动计算而非移动数据:将计算任务分发到数据所在节点
2. MapReduce
MapReduce 是 Hadoop 的分布式计算框架:
- Map 阶段:将输入数据分割并并行处理
- Reduce 阶段:对 Map 阶段的输出进行汇总
- 自动并行化:自动处理任务调度和容错
- 数据本地性:尽量在数据所在节点执行计算
3. YARN (Yet Another Resource Negotiator)
YARN 是 Hadoop 2.0 引入的资源管理系统:
- 资源管理:统一管理集群资源
- 应用调度:支持多种计算框架
- 高可用性:支持 ResourceManager 高可用
- 多租户:支持多用户、多应用共享集群
HDFS 分布式文件系统
HDFS 架构
HDFS 采用主从架构:
┌─────────────────┐ ┌─────────────────┐
│ NameNode │ │ DataNode │
│ (主节点) │ │ (从节点) │
│ │ │ │
│ • 元数据管理 │ │ • 数据块存储 │
│ • 文件系统树 │ │ • 心跳报告 │
│ • 客户端访问 │ │ • 数据块复制 │
└─────────────────┘ └─────────────────┘
HDFS 核心概念
1. 数据块 (Block)
- 默认大小:128MB (Hadoop 2.x+),64MB (Hadoop 1.x)
- 副本数量:默认 3 个副本
- 容错机制:副本分布在不同机架
2. NameNode
- 职责:管理文件系统命名空间
- 存储内容:文件元数据、数据块位置信息
- 内存要求:每个文件约占用 150 字节内存
3. DataNode
- 职责:存储实际数据块
- 心跳机制:每 3 秒向 NameNode 发送心跳
- 数据块报告:定期报告存储的数据块信息
HDFS 文件操作
文件写入流程
- 客户端向 NameNode 请求创建文件
- NameNode 检查权限和文件是否存在
- NameNode 返回 DataNode 列表
- 客户端向 DataNode 写入数据
- DataNode 之间进行数据复制
- 写入完成后通知 NameNode
文件读取流程
- 客户端向 NameNode 请求文件位置
- NameNode 返回数据块位置信息
- 客户端直接从 DataNode 读取数据
- 如果读取失败,自动切换到其他副本
HDFS 高可用性
NameNode 高可用 (HA)
- Active NameNode:处理客户端请求
- Standby NameNode:热备份,快速切换
- JournalNode:存储元数据变更日志
- ZooKeeper:协调故障转移
数据块复制策略
机架1: 副本1
机架2: 副本2, 副本3
- 第一个副本:本地机架任意节点
- 第二个副本:不同机架任意节点
- 第三个副本:与第二个副本相同机架
MapReduce 编程模型
MapReduce 工作原理
1. Map 阶段
// Map 函数示例
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
String[] words = line.split(" ");
for (String word : words) {
this.word.set(word);
context.write(this.word, one);
}
}
}
2. Reduce 阶段
// Reduce 函数示例
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
MapReduce 执行流程
- Input Split:输入数据分片
- Map Task:并行执行 Map 函数
- Shuffle & Sort:数据排序和分组
- Reduce Task:执行 Reduce 函数
- Output:输出最终结果
MapReduce 优化策略
1. 数据本地性优化
- 数据本地性:尽量在数据所在节点执行任务
- 机架本地性:同一机架内执行任务
- 网络本地性:通过网络传输数据
2. 内存优化
<!-- mapred-site.xml -->
<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
</property>
3. 并行度优化
// 设置 Map 任务数量
job.setNumMapTasks(10);
// 设置 Reduce 任务数量
job.setNumReduceTasks(5);
YARN 资源管理
YARN 架构组件
1. ResourceManager (RM)
- 全局资源管理:管理整个集群资源
- 应用调度:调度应用程序
- 高可用性:支持主备模式
2. NodeManager (NM)
- 节点资源管理:管理单个节点资源
- 容器管理:启动和监控容器
- 资源报告:向 RM 报告资源使用情况
3. ApplicationMaster (AM)
- 应用管理:管理单个应用程序
- 资源请求:向 RM 请求资源
- 任务监控:监控任务执行状态
YARN 工作流程
- 应用提交:客户端提交应用程序
- 资源请求:AM 向 RM 请求资源
- 资源分配:RM 分配资源给 AM
- 容器启动:NM 启动容器执行任务
- 任务监控:AM 监控任务执行
- 应用完成:清理资源并报告结果
YARN 调度器
1. FIFO 调度器
- 特点:先进先出,简单但不够灵活
- 适用场景:单用户环境
2. Capacity 调度器
- 特点:支持多队列,按容量分配资源
- 适用场景:多用户共享集群
3. Fair 调度器
- 特点:公平分配资源,支持动态调整
- 适用场景:多用户、多应用环境
Hadoop 生态系统
数据存储组件
1. HBase
- 特点:分布式列族数据库
- 适用场景:实时读写、随机访问
- 架构:基于 HDFS,支持水平扩展
2. Hive
- 特点:数据仓库软件,SQL 接口
- 适用场景:离线数据分析、数据挖掘
- 优势:降低学习成本,提高开发效率
数据处理组件
1. Spark
- 特点:内存计算,比 MapReduce 快 10-100 倍
- 适用场景:批处理、流处理、机器学习
- 优势:支持多种编程语言,丰富的 API
2. Flink
- 特点:真正的流处理引擎
- 适用场景:实时数据处理、复杂事件处理
- 优势:低延迟、高吞吐量
数据采集组件
1. Flume
- 特点:分布式日志收集系统
- 适用场景:日志数据采集、数据传输
- 架构:Agent、Collector、Storage
2. Sqoop
- 特点:关系数据库与 Hadoop 之间的数据传输工具
- 适用场景:数据导入导出、ETL 处理
- 支持:MySQL、Oracle、PostgreSQL 等
数据可视化组件
1. Hue
- 特点:Hadoop 用户界面
- 功能:文件浏览、作业监控、SQL 查询
- 优势:降低使用门槛,提高用户体验
Hadoop 安装配置
环境准备
1. 系统要求
- 操作系统:Linux (CentOS、Ubuntu)
- Java 版本:JDK 8 或更高版本
- 内存要求:至少 4GB RAM
- 磁盘空间:至少 10GB 可用空间
2. 网络配置
# 配置主机名
hostnamectl set-hostname hadoop-master
# 配置 hosts 文件
echo "192.168.1.100 hadoop-master" >> /etc/hosts
echo "192.168.1.101 hadoop-slave1" >> /etc/hosts
echo "192.168.1.102 hadoop-slave2" >> /etc/hosts
Hadoop 安装步骤
1. 下载 Hadoop
# 下载 Hadoop 3.3.4
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
# 解压到指定目录
tar -xzf hadoop-3.3.4.tar.gz -C /opt/
mv /opt/hadoop-3.3.4 /opt/hadoop
2. 配置环境变量
# 编辑 ~/.bashrc
export HADOOP_HOME=/opt/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
3. 配置 Hadoop
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/datanode</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-master</value>
</property>
</configuration>
4. 启动 Hadoop
# 格式化 NameNode
hdfs namenode -format
# 启动 HDFS
start-dfs.sh
# 启动 YARN
start-yarn.sh
# 检查服务状态
jps
Hadoop 实践案例
案例 1:日志分析系统
业务场景
分析 Web 服务器访问日志,统计:
- 访问量最高的页面
- 访问量最高的 IP 地址
- 不同时间段的访问趋势
实现方案
1. 数据采集
# 使用 Flume 采集日志
agent.sources = r1
agent.sources.r1.type = spooldir
agent.sources.r1.spoolDir = /var/log/nginx
agent.sources.r1.channels = c1
agent.sinks = k1
agent.sinks.k1.type = hdfs
agent.sinks.k1.hdfs.path = /logs/nginx
agent.sinks.k1.channel = c1
2. 数据处理
// Map 阶段:解析日志行
public class LogMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
public void map(LongWritable key, Text value, Context context) {
String line = value.toString();
String[] fields = line.split(" ");
String page = fields[6]; // 页面路径
String ip = fields[0]; // IP 地址
context.write(new Text(page), new IntWritable(1));
context.write(new Text(ip), new IntWritable(1));
}
}
// Reduce 阶段:统计访问次数
public class LogReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context) {
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
context.write(key, new IntWritable(sum));
}
}
案例 2:用户行为分析
业务场景
分析电商网站用户行为数据:
- 用户购买偏好分析
- 商品推荐算法
- 用户流失预警
技术架构
数据源 → Kafka → Spark Streaming → HBase → 推荐系统
1. 实时数据处理
// Spark Streaming 处理用户行为数据
val stream = KafkaUtils.createDirectStream[String, String](
ssc,
LocationStrategies.PreferConsistent,
ConsumerStrategies.Subscribe[String, String](topics, kafkaParams)
)
stream.map(record => {
val userBehavior = parseUserBehavior(record.value())
// 实时计算用户偏好
calculateUserPreference(userBehavior)
}).foreachRDD(rdd => {
// 存储到 HBase
rdd.foreachPartition(partition => {
saveToHBase(partition)
})
})
案例 3:数据仓库建设
业务场景
构建企业级数据仓库:
- 多源数据整合
- 数据质量管控
- 主题域建模
技术方案
1. 数据分层架构
ODS层 (原始数据层)
├── 用户行为数据
├── 订单交易数据
└── 商品信息数据
DWD层 (数据明细层)
├── 用户行为明细表
├── 订单明细表
└── 商品明细表
DWS层 (数据服务层)
├── 用户画像表
├── 商品画像表
└── 交易汇总表
ADS层 (应用数据层)
├── 用户推荐表
├── 商品推荐表
└── 营销活动表
2. 数据质量监控
-- 数据质量检查
SELECT
'user_behavior' as table_name,
COUNT(*) as total_records,
COUNT(DISTINCT user_id) as unique_users,
COUNT(CASE WHEN user_id IS NULL THEN 1 END) as null_users
FROM ods.user_behavior
WHERE dt = '2024-01-01';
Hadoop 最佳实践
1. 集群规划
硬件配置建议
| 组件 | CPU | 内存 | 磁盘 | 网络 |
|---|---|---|---|---|
| NameNode | 4 核+ | 8GB+ | SSD 100GB+ | 千兆+ |
| DataNode | 8 核+ | 16GB+ | 机械硬盘 2TB+ | 千兆+ |
| ResourceManager | 4 核+ | 8GB+ | SSD 100GB+ | 千兆+ |
集群规模规划
- 小规模集群:3-10 节点,适合学习和测试
- 中等规模集群:10-100 节点,适合中小企业
- 大规模集群:100+ 节点,适合大型企业
2. 性能优化
HDFS 优化
<!-- hdfs-site.xml 优化配置 -->
<property>
<name>dfs.blocksize</name>
<value>268435456</value> <!-- 256MB -->
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>10</value>
</property>
MapReduce 优化
<!-- mapred-site.xml 优化配置 -->
<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1638m</value>
</property>
3. 监控和运维
监控指标
HDFS 监控
- NameNode 内存使用率
- DataNode 磁盘使用率
- 数据块复制状态
- 文件系统健康状态
YARN 监控
- ResourceManager 资源使用率
- NodeManager 节点状态
- 应用程序执行状态
- 队列资源分配情况
运维工具
1. Ambari
- 集群管理界面
- 服务监控和告警
- 配置管理
- 日志查看
2. Cloudera Manager
- 企业级集群管理
- 性能监控
- 故障诊断
- 自动化运维
4. 安全配置
认证和授权
<!-- core-site.xml 安全配置 -->
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
数据加密
<!-- hdfs-site.xml 加密配置 -->
<property>
<name>dfs.encryption.key.provider.uri</name>
<value>kms://http@kms-server:16000/kms</value>
</property>
<property>
<name>hadoop.security.key.provider.path</name>
<value>kms://http@kms-server:16000/kms</value>
</property>
5. 故障处理
常见问题及解决方案
1. NameNode 故障
# 检查 NameNode 状态
hdfs dfsadmin -report
# 恢复 NameNode
hdfs namenode -recover
# 检查元数据完整性
hdfs fsck /
2. DataNode 故障
# 检查 DataNode 状态
hdfs dfsadmin -report
# 重新平衡数据
hdfs balancer -threshold 10
# 检查数据块完整性
hdfs fsck / -blocks
3. 作业执行失败
# 查看作业日志
yarn logs -applicationId application_xxx
# 检查资源使用情况
yarn node -list
# 重启 ResourceManager
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh start resourcemanager
总结
Hadoop 作为大数据处理的核心技术,提供了完整的分布式存储和计算解决方案。通过合理配置和优化,可以构建高效、稳定的大数据处理平台。在实际应用中,需要根据业务需求选择合适的组件和架构,并持续进行性能调优和运维监控。
学习建议
- 理论学习:深入理解分布式系统原理
- 实践操作:搭建实验环境,动手实践
- 项目实战:参与实际项目,积累经验
- 持续学习:关注新技术发展,不断更新知识
