大数据领域必备:Hadoop集群搭建全流程

目录
1. 引言:Hadoop与大数据时代2. Hadoop核心架构详解
2.1 HDFS分布式文件系统2.2 YARN资源管理器2.3 MapReduce计算框架2.4 Hadoop 3.x新特性 3. 集群规划与环境准备
3.1 硬件配置建议3.2 操作系统选择3.3 网络规划3.4 软件依赖与版本兼容性 4. 基础环境搭建
4.1 操作系统配置4.2 JDK安装与配置4.3 网络配置4.4 SSH免密登录配置4.5 防火墙与SELinux配置4.6 时间同步服务4.7 磁盘挂载与文件系统优化 5. Hadoop集群搭建实战
5.1 Hadoop下载与解压5.2 Hadoop环境变量配置5.3 Hadoop核心配置文件详解5.4 集群分发与部署5.5 集群初始化5.6 集群启动与验证 6. 集群验证与基准测试
6.1 集群状态检查6.2 HDFS分布式文件系统测试6.3 MapReduce作业提交测试6.4 YARN资源管理器验证6.5 基准测试工具与方法 7. Hadoop生态系统集成
7.1 Hive数据仓库集成7.2 HBase分布式数据库集成7.3 Spark计算引擎集成7.4 Flume数据采集集成7.5 Sqoop数据迁移工具集成 8. 集群管理与监控
8.1 Hadoop Web UI详解8.2 命令行工具使用8.3 Ambari集群管理平台搭建8.4 Prometheus + Grafana监控方案8.5 日志收集与分析 9. 高可用集群配置
9.1 HDFS HA原理与配置9.2 YARN HA配置9.3 ZooKeeper集群部署9.4 故障自动转移配置 10. 安全配置
10.1 HDFS权限控制10.2 Kerberos认证配置10.3 数据加密传输10.4 审计日志 11. 性能优化策略
11.1 HDFS性能优化11.2 YARN资源配置优化11.3 MapReduce作业优化11.4 JVM参数调优11.5 网络与磁盘I/O优化 12. 企业级最佳实践
12.1 集群扩容策略12.2 数据备份与恢复12.3 集群迁移方案12.4 多租户资源隔离12.5 自动化部署与运维 13. 常见问题与解决方案
13.1 集群启动故障排查13.2 性能瓶颈分析13.3 数据一致性问题13.4 节点故障处理 14. Hadoop未来发展趋势
14.1 云原生Hadoop14.2 与AI/ML的融合14.3 存储计算分离架构14.4 性能与效率优化 15. 总结与展望附录:常用命令参考
1. 引言:Hadoop与大数据时代
在数字经济蓬勃发展的今天,数据已成为企业最宝贵的资产之一。根据IDC预测,到2025年全球数据圈将增长至175ZB,如此海量的数据蕴含着巨大的商业价值,但也带来了前所未有的存储和处理挑战。
Hadoop作为Apache软件基金会的开源项目,自2006年诞生以来,已成为大数据处理的事实标准。它提供了一个分布式系统基础架构,能够在廉价的通用硬件上搭建起可靠、高效的大数据处理平台。
Hadoop的核心优势在于:
高容错性:通过数据副本机制,在节点故障时自动恢复数据高吞吐量:专为大规模数据处理设计,可高效处理PB级数据可扩展性:支持从单个集群扩展到数千个节点成本效益:可运行在廉价的商用硬件上,降低基础设施成本
本指南将带领您从理论到实践,全面掌握Hadoop集群的搭建与运维,为您的大数据之旅奠定坚实基础。无论您是数据工程师、系统管理员,还是希望进入大数据领域的技术人员,这篇文章都将成为您不可或缺的参考资料。
2. Hadoop核心架构详解
Hadoop生态系统就像一个精密的交响乐团,各个组件协同工作,共同完成大数据的存储、处理和分析任务。让我们深入了解这个”乐团”的核心成员。
2.1 HDFS分布式文件系统
HDFS(Hadoop Distributed File System)是Hadoop的分布式文件系统,专为存储超大文件和高吞吐量访问而设计。
2.1.1 HDFS核心架构
HDFS采用主从(Master/Slave)架构,包含以下关键组件:
NameNode:主节点,管理文件系统命名空间和元数据DataNode:从节点,存储实际数据块并执行数据块的读写操作Secondary NameNode:辅助NameNode,定期合并编辑日志,并非热备份JournalNode:在HA架构中,用于共享编辑日志,支持自动故障转移

2.1.2 HDFS数据存储原理
HDFS将文件分割成固定大小的数据块(Block)进行存储,默认块大小为128MB(Hadoop 2.x)或256MB(Hadoop 3.x)。这种大文件块设计有以下优势:
减少元数据信息量,提高NameNode效率减少数据块寻址时间,提高I/O效率有利于数据顺序读取,这是大数据处理的典型场景
HDFS采用副本机制保证数据可靠性,默认副本数为3。副本放置策略如下:
第一个副本:放置在客户端所在节点(如果客户端在集群外,则随机选择)第二个副本:放置在与第一个副本不同机架的节点第三个副本:放置在与第二个副本相同机架的不同节点
这种策略在可靠性和网络带宽之间取得了平衡。
2.1.3 HDFS读写流程
读取流程:
客户端向NameNode请求读取文件NameNode返回文件的数据块位置信息客户端直接从DataNode读取数据块客户端将数据块组合成完整文件
写入流程:
客户端向NameNode请求创建文件NameNode检查权限并确定数据块存储位置客户端将数据写入本地缓存,达到块大小时上传DataNode接收数据并复制到其他节点所有副本写入完成后返回成功确认
2.2 YARN资源管理器
YARN(Yet Another Resource Negotiator)是Hadoop的集群资源管理系统,负责调度和管理集群中的计算资源。
2.2.1 YARN核心组件
ResourceManager (RM):全局资源管理器,负责资源分配和调度NodeManager (NM):每个节点上的资源管理器,负责容器管理和监控ApplicationMaster (AM):每个应用程序的”管家”,负责向RM申请资源并与NM协调任务执行Container:资源分配的基本单位,包含CPU、内存等资源

2.2.2 YARN工作流程
客户端提交应用程序到ResourceManagerResourceManager分配第一个容器并启动ApplicationMasterApplicationMaster向ResourceManager注册并申请资源ResourceManager根据调度策略分配资源ApplicationMaster与NodeManager通信,启动任务容器NodeManager监控容器资源使用情况并向ResourceManager汇报任务完成后,ApplicationMaster向ResourceManager注销并释放资源
2.2.3 YARN调度器
YARN提供多种调度策略,满足不同场景需求:
FIFO Scheduler:先进先出调度器,简单但可能导致大作业阻塞小作业Capacity Scheduler:容量调度器,为不同组织分配资源容量,支持资源共享Fair Scheduler:公平调度器,根据需求动态分配资源,确保所有应用获得公平的资源份额
2.3 MapReduce计算框架
MapReduce是Hadoop的分布式计算框架,基于”分而治之”思想,将复杂问题分解为可并行处理的任务。
2.3.1 MapReduce核心思想
MapReduce将计算过程分为两个主要阶段:
Map阶段:将输入数据分割成独立的块,由Map任务并行处理Reduce阶段:将Map阶段的输出汇总并进一步处理,得到最终结果
MapReduce的核心在于将问题转化为Map和Reduce函数,框架负责处理分布式执行、容错、数据分发等复杂问题。
2.3.2 MapReduce工作流程

InputSplit:将输入数据分割成逻辑分片Mapper:处理每个分片,生成键值对中间结果Combiner:可选的本地聚合步骤,优化网络传输Partition:将Map输出分配到不同Reduce任务Shuffle & Sort:将相同键的Map输出合并排序Reducer:处理排序后的中间结果,生成最终输出
2.3.3 MapReduce示例代码
以下是经典的WordCount示例,展示MapReduce的基本编程模型:
// Mapper类
public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
// Reducer类
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);
}
}
// 主类
public class WordCount {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(WordCountMapper.class);
job.setCombinerClass(WordCountReducer.class);
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
2.4 Hadoop 3.x新特性
Hadoop 3.x带来了多项重要改进,提升了性能、可靠性和安全性:
2.4.1 HDFS改进
纠删码(Erasure Coding):相比传统副本机制,提供相同可靠性的同时减少50%存储空间。默认支持RS-6-3-1024k编码方案(6个数据块+3个校验块)
多NameNode支持:允许一个集群中有多个NameNode,每个NameNode管理自己的命名空间,共享DataNode存储资源
DataNode内部卷平衡:支持单个DataNode内不同存储卷(磁盘)之间的块平衡
2.4.2 YARN改进
YARN Federation:支持多个ResourceManager协同工作,提高集群扩展性和可用性
GPU和FPGA支持:增强对异构计算资源的支持,适应AI/机器学习场景
增强的Docker容器支持:允许YARN容器运行Docker镜像,提高环境一致性
2.4.3 性能优化
默认块大小增加:从128MB增加到256MB,减少元数据开销,提高大文件处理效率
MapReduce性能优化:改进Shuffle过程,减少内存使用和GC压力
NN向量化:优化NameNode处理RPC请求的方式,提高吞吐量
3. 集群规划与环境准备
在搭建Hadoop集群之前,充分的规划和准备工作至关重要。一个合理的集群规划可以避免后期不必要的调整和性能瓶颈。
3.1 硬件配置建议
Hadoop集群的硬件配置应根据数据量、处理需求和预算综合考虑。以下是不同规模集群的推荐配置:
3.1.1 小型测试集群 (3-5节点)
适用于学习、开发和小型项目:
| 组件 | 配置 |
|---|---|
| CPU | 4-8核 |
| 内存 | 16-32GB |
| 磁盘 | 4-8块 1-2TB SATA硬盘 |
| 网络 | 1Gbps以太网 |
3.1.2 中型生产集群 (10-50节点)
适用于中小型企业数据处理需求:
| 组件 | 配置 |
|---|---|
| CPU | 8-16核 |
| 内存 | 64-128GB |
| 磁盘 | 8-12块 2-4TB SATA硬盘 |
| 网络 | 10Gbps以太网 |
3.1.3 大型生产集群 (50+节点)
适用于大型企业或互联网公司的大规模数据处理:
| 组件 | 配置 |
|---|---|
| CPU | 16-32核 |
| 内存 | 128-256GB |
| 磁盘 | 12-24块 4-8TB SATA/NVMe硬盘 |
| 网络 | 25/100Gbps以太网,考虑RDMA技术 |
3.1.4 关键节点特殊配置
NameNode: 应配置更高性能的硬件,特别是内存和磁盘I/O
CPU: 16-32核内存: 128-512GB (根据数据量和块数量)磁盘: 企业级SSD,提高元数据操作性能
JournalNode: 对可靠性要求高,建议使用冗余存储
至少3个节点,跨机架部署使用RAID保护本地存储
3.2 操作系统选择
Hadoop官方推荐并主要测试在Linux操作系统上运行。以下是几种常见选择:
3.2.1 推荐操作系统
CentOS/RHEL: 企业级首选,稳定性好,社区支持完善。推荐版本:CentOS 7.x或8.x
Ubuntu Server: 对于开发和测试环境,配置简单,软件包更新及时。推荐版本:20.04 LTS或更高
SUSE Linux Enterprise Server: 适合企业环境,提供商业支持
3.2.2 不推荐选择
Windows: 虽然Hadoop提供Windows支持,但生产环境很少使用,存在兼容性和性能问题桌面版Linux发行版: 缺乏服务器优化,可能有不必要的服务和组件
3.3 网络规划
Hadoop集群对网络架构有较高要求,合理的网络规划可以避免性能瓶颈:
3.3.1 网络拓扑
单机架集群: 适合小型测试集群,所有节点连接到同一交换机多机架集群: 生产环境推荐,节点分布在多个机架,通过核心交换机互联
3.3.2 IP地址规划
为确保集群稳定,建议使用静态IP地址分配。典型规划方式:
NameNode: 192.168.1.10
DataNode1: 192.168.1.11
DataNode2: 192.168.1.12
...
ZooKeeper1: 192.168.1.21
ZooKeeper2: 192.168.1.22
ZooKeeper3: 192.168.1.23
3.3.3 主机名规划
采用有意义的主机名命名规范,便于管理和故障排查:
nn1.hadoop.cluster (NameNode主节点)
nn2.hadoop.cluster (NameNode备用节点)
dn1.hadoop.cluster (DataNode节点1)
dn2.hadoop.cluster (DataNode节点2)
...
jn1.hadoop.cluster (JournalNode节点1)
zk1.hadoop.cluster (ZooKeeper节点1)
3.3.4 端口规划
Hadoop各组件需要特定端口通信,确保端口不冲突且安全组配置正确:
| 组件 | 端口 | 用途 |
|---|---|---|
| NameNode | 9870 | HDFS Web UI (Hadoop 3.x) |
| NameNode | 8020 | HDFS RPC端口 |
| DataNode | 9864 | DataNode Web UI |
| DataNode | 9866 | DataNode IPC端口 |
| ResourceManager | 8088 | YARN Web UI |
| NodeManager | 8042 | NodeManager Web UI |
| HistoryServer | 19888 | MapReduce历史服务器 |
3.4 软件依赖与版本兼容性
Hadoop生态系统组件众多,版本兼容性至关重要。以下是搭建Hadoop 3.3.x集群的推荐依赖版本:
3.4.1 核心依赖
| 软件 | 推荐版本 | 用途 |
|---|---|---|
| Java | OpenJDK 8/11 | Hadoop运行环境 |
| ZooKeeper | 3.6.x | 分布式协调服务(用于HA) |
| MySQL/PostgreSQL | MySQL 8.0/PostgreSQL 12 | 元数据存储(Hive等组件) |
3.4.2 Hadoop生态组件
| 组件 | 推荐版本 | 与Hadoop 3.3.x兼容性 |
|---|---|---|
| Hive | 3.1.x+ | 兼容 |
| HBase | 2.4.x+ | 兼容 |
| Spark | 3.1.x+ | 兼容 |
| Flume | 1.9.x+ | 兼容 |
| Sqoop | 1.4.7+ | 兼容 |
| Kafka | 2.8.x+ | 兼容 |
兼容性检查工具:Apache提供了Hadoop兼容性矩阵,建议在搭建前查阅最新兼容性信息。
3.4.3 版本选择策略
稳定版本优先:选择经过充分测试的稳定版本,避免使用最新发布但未经广泛验证的版本长期支持版本:优先考虑提供长期支持的版本,减少频繁升级带来的风险生态一致性:确保所有生态组件版本相互兼容,可参考CDH、HDP等商业发行版的版本组合
4. 基础环境搭建
在安装Hadoop之前,需要先配置好基础系统环境。这部分工作需要在集群的所有节点上执行。
4.1 操作系统配置
4.1.1 禁用透明大页(Transparent Huge Pages)
透明大页可能导致Hadoop性能问题,特别是在内存密集型操作中:
# 临时禁用
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 永久禁用(CentOS/RHEL)
cat <<EOF >> /etc/rc.d/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
EOF
chmod +x /etc/rc.d/rc.local
4.1.2 调整文件描述符限制
Hadoop需要大量文件描述符,默认限制可能不足:
# 临时调整
ulimit -n 65535
# 永久调整
cat <<EOF >> /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
* soft memlock unlimited
* hard memlock unlimited
EOF
4.1.3 关闭Swap
Swap可能导致Hadoop性能严重下降,应禁用:
# 临时禁用
swapoff -a
# 永久禁用(注释掉swap行)
sed -i '/swap/s/^/#/' /etc/fstab
4.1.4 配置Linux性能参数
优化内核参数以适应Hadoop工作负载:
cat <<EOF >> /etc/sysctl.conf
# 网络优化
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 600000
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
# 文件系统优化
vm.swappiness = 0
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_writeback_centisecs = 360000
vm.page-cluster = 3
EOF
# 应用配置
sysctl -p
4.2 JDK安装与配置
Hadoop需要Java运行环境,推荐使用OpenJDK 8或11。
4.2.1 安装OpenJDK 11
# CentOS/RHEL
yum install -y java-11-openjdk-devel
# Ubuntu
apt-get install -y openjdk-11-jdk
4.2.2 手动安装(如需特定版本)
# 下载JDK(从OpenJDK官网获取最新版本)
wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
# 解压
tar -zxvf openjdk-11.0.2_linux-x64_bin.tar.gz -C /usr/local/
# 重命名
mv /usr/local/jdk-11.0.2 /usr/local/jdk11
4.2.3 配置环境变量
cat <<EOF >> /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/jdk11 # 根据实际安装路径调整
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EOF
# 使配置生效
source /etc/profile.d/java.sh
# 验证安装
java -version
4.3 网络配置
正确的网络配置是集群通信的基础。
4.3.1 配置静态IP
以CentOS 7为例:
# 编辑网络配置文件(根据实际网卡名称调整)
vi /etc/sysconfig/network-scripts/ifcfg-eth0
# 配置内容示例
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.10 # 节点IP地址
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=8.8.4.4
# 重启网络服务
systemctl restart network
4.3.2 配置主机名
# 设置主机名
hostnamectl set-hostname nn1.hadoop.cluster
# 验证
hostname
4.3.3 配置hosts文件
在所有节点配置hosts文件,实现主机名解析:
cat <<EOF >> /etc/hosts
192.168.1.10 nn1.hadoop.cluster nn1
192.168.1.11 nn2.hadoop.cluster nn2
192.168.1.12 dn1.hadoop.cluster dn1
192.168.1.13 dn2.hadoop.cluster dn2
192.168.1.14 dn3.hadoop.cluster dn3
192.168.1.21 zk1.hadoop.cluster zk1
192.168.1.22 zk2.hadoop.cluster zk2
192.168.1.23 zk3.hadoop.cluster zk3
EOF
4.4 SSH免密登录配置
Hadoop管理脚本需要在节点间无密码SSH访问,特别是NameNode到所有DataNode的免密登录。
4.4.1 生成SSH密钥
在主节点(如NameNode)执行:
# 生成SSH密钥,一路回车使用默认值
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 生成后会在~/.ssh目录下创建id_rsa(私钥)和id_rsa.pub(公钥)
ls ~/.ssh/
4.4.2 配置免密登录到所有节点
# 将公钥复制到本地(便于管理)
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 设置权限(非常重要,权限过松会导致SSH免密失败)
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh/
# 复制公钥到所有其他节点
ssh-copy-id -i ~/.ssh/id_rsa.pub dn1.hadoop.cluster
ssh-copy-id -i ~/.ssh/id_rsa.pub dn2.hadoop.cluster
# ... 其他节点
4.4.3 验证免密登录
ssh dn1.hadoop.cluster date
ssh dn2.hadoop.cluster date
如果不需要输入密码就能看到日期,则配置成功。
4.4.4 简化SSH配置(可选)
创建~/.ssh/config文件,简化SSH命令:
cat <<EOF >> ~/.ssh/config
Host nn1
HostName nn1.hadoop.cluster
User root
IdentityFile ~/.ssh/id_rsa
StrictHostKeyChecking no
Host dn*
User root
IdentityFile ~/.ssh/id_rsa
StrictHostKeyChecking no
Host zk*
User root
IdentityFile ~/.ssh/id_rsa
StrictHostKeyChecking no
EOF
# 设置权限
chmod 600 ~/.ssh/config
配置后,可以直接使用登录节点。
ssh dn1
4.5 防火墙与SELinux配置
为确保Hadoop各组件间通信畅通,需要配置防火墙或临时关闭防火墙(生产环境建议精细配置防火墙规则)。
4.5.1 关闭防火墙(测试环境)
# CentOS/RHEL 7+
systemctl stop firewalld
systemctl disable firewalld
# Ubuntu
ufw disable
4.5.2 配置防火墙规则(生产环境)
# 开放Hadoop所需端口(以NameNode为例)
firewall-cmd --permanent --add-port=9870/tcp
firewall-cmd --permanent --add-port=8020/tcp
firewall-cmd --permanent --add-port=9000/tcp
# 重新加载防火墙规则
firewall-cmd --reload
# 查看已开放端口
firewall-cmd --list-ports
4.5.3 配置SELinux
# 临时设置为Permissive模式
setenforce 0
# 永久禁用(重启后生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 验证状态
sestatus
4.6 时间同步服务
分布式系统对节点间时间一致性要求较高,建议配置NTP服务保持时间同步。
4.6.1 配置NTP客户端
# CentOS/RHEL
yum install -y ntp
# Ubuntu
apt-get install -y ntp
# 编辑配置文件,设置合适的NTP服务器
vi /etc/ntp.conf
# 添加或修改服务器配置(选择就近的NTP服务器)
server ntp.aliyun.com iburst
server time1.cloud.tencent.com iburst
server cn.ntp.org.cn iburst
# 启动并设置开机自启
systemctl start ntpd
systemctl enable ntpd
# 验证同步状态
ntpq -p
4.6.2 配置本地NTP服务器(大型集群)
对于大型集群,建议搭建本地NTP服务器,避免所有节点同时访问外部NTP服务:
# 在主NTP服务器上安装ntp
yum install -y ntp
# 配置文件修改
vi /etc/ntp.conf
# 添加本地时间源(当外部不可用时使用)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
# 允许集群内其他节点同步
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# 启动服务
systemctl start ntpd
systemctl enable ntpd
# 其他节点配置指向本地NTP服务器
vi /etc/ntp.conf
server nn1.hadoop.cluster iburst
4.7 磁盘挂载与文件系统优化
Hadoop DataNode需要高性能的磁盘存储,合理的磁盘配置对性能至关重要。
4.7.1 磁盘分区
使用或
fdisk工具对数据磁盘进行分区:
parted
# 查看磁盘
lsblk
# 分区示例(以/dev/sdb为例)
fdisk /dev/sdb
# 在fdisk交互界面输入: n -> p -> 1 -> 回车 -> 回车 -> w
# 格式化(使用ext4或xfs文件系统,推荐xfs)
mkfs.xfs /dev/sdb1
4.7.2 挂载磁盘
# 创建挂载点
mkdir -p /data/hadoop/hdfs/dn
# 获取UUID(推荐使用UUID挂载,避免设备名变动问题)
blkid /dev/sdb1
# 编辑fstab,实现开机自动挂载
vi /etc/fstab
# 添加如下行(替换UUID为实际值)
UUID=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data/hadoop/hdfs/dn xfs defaults,noatime,nodiratime,inode64 0 0
# 挂载所有文件系统
mount -a
# 验证挂载
df -h
4.7.3 多磁盘配置
DataNode节点通常配置多块磁盘,每块磁盘单独挂载:
# 创建挂载点
mkdir -p /data/hadoop/hdfs/dn1
mkdir -p /data/hadoop/hdfs/dn2
# ... 根据磁盘数量创建
# 在fstab中添加所有磁盘挂载信息
# ...
# 挂载所有磁盘
mount -a
4.7.4 磁盘性能测试
挂载完成后,测试磁盘性能确保符合要求:
# 测试顺序写入性能
dd if=/dev/zero of=/data/hadoop/hdfs/dn/test bs=1G count=10 oflag=direct
# 测试顺序读取性能
dd if=/data/hadoop/hdfs/dn/test of=/dev/null bs=1G count=10 iflag=direct
# 删除测试文件
rm /data/hadoop/hdfs/dn/test
性能参考:SATA硬盘顺序读写应达到100-200MB/s,SSD应达到300MB/s以上。
5. Hadoop集群搭建实战
经过前面的准备工作,我们终于可以开始搭建Hadoop集群了。本章节将详细介绍从下载Hadoop到集群启动验证的完整流程。
5.1 Hadoop下载与解压
5.1.1 获取Hadoop安装包
从Apache官方镜像下载稳定版本的Hadoop:
# 创建下载目录
mkdir -p /opt/downloads && cd /opt/downloads
# 下载Hadoop 3.3.4(当前最新稳定版)
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
# 验证文件完整性(可选但推荐)
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz.asc
gpg --verify hadoop-3.3.4.tar.gz.asc hadoop-3.3.4.tar.gz
5.1.2 解压并创建软链接
# 解压到安装目录
tar -zxvf hadoop-3.3.4.tar.gz -C /usr/local/
# 创建软链接,便于版本管理和升级
ln -s /usr/local/hadoop-3.3.4 /usr/local/hadoop
# 查看目录结构
ls -l /usr/local/hadoop
Hadoop目录结构说明:
: Hadoop命令行工具
bin/: 配置文件目录
etc/hadoop/: 辅助脚本
libexec/: 集群启动停止脚本
sbin/: 文档和示例
share/: 依赖库
lib/: 默认日志目录(可配置)
logs/
5.2 Hadoop环境变量配置
配置Hadoop环境变量,便于在任何位置执行Hadoop命令。
5.2.1 设置Hadoop环境变量
cat <<EOF >> /etc/profile.d/hadoop.sh
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_LOG_DIR=/var/log/hadoop
export HADOOP_PID_DIR=/var/run/hadoop
export YARN_LOG_DIR=$HADOOP_LOG_DIR
export YARN_PID_DIR=$HADOOP_PID_DIR
EOF
# 使配置生效
source /etc/profile.d/hadoop.sh
# 验证
echo $HADOOP_HOME
hadoop version
5.2.2 创建日志和PID目录
# 创建目录
mkdir -p $HADOOP_LOG_DIR $HADOOP_PID_DIR
# 设置权限(如果使用非root用户运行Hadoop)
# chown -R hadoop:hadoop $HADOOP_LOG_DIR $HADOOP_PID_DIR
5.3 Hadoop核心配置文件详解
Hadoop配置主要通过目录下的XML文件完成。让我们逐一配置关键文件。
$HADOOP_HOME/etc/hadoop
5.3.1 hadoop-env.sh
设置Hadoop运行环境变量,最重要的是Java路径:
vi $HADOOP_CONF_DIR/hadoop-env.sh
# 设置Java_HOME
export JAVA_HOME=/usr/local/jdk11
# 设置Hadoop PID目录
export HADOOP_PID_DIR=${HADOOP_PID_DIR}
# 设置Hadoop日志目录
export HADOOP_LOG_DIR=${HADOOP_LOG_DIR}
# 设置NameNode堆大小(根据服务器内存调整)
export HADOOP_NAMENODE_OPTS="-Xmx4G -Dhadoop.security.logger=INFO,RFAS ${HADOOP_NAMENODE_OPTS}"
# 设置DataNode堆大小
export HADOOP_DATANODE_OPTS="-Xmx2G ${HADOOP_DATANODE_OPTS}"
5.3.2 core-site.xml
Hadoop核心配置文件,设置HDFS地址和端口等:
vi $HADOOP_CONF_DIR/core-site.xml
<configuration>
<!-- HDFS namenode地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://nn1.hadoop.cluster:8020</value>
</property>
<!-- Hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/var/lib/hadoop/tmp</value>
</property>
<!-- IO文件缓冲区大小 -->
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<!-- 垃圾回收延迟(分钟) -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<!-- 支持LZO压缩 -->
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec</value>
</property>
</configuration>
5.3.3 hdfs-site.xml
HDFS特定配置,包括副本数量、块大小、存储路径等:
vi $HADOOP_CONF_DIR/hdfs-site.xml
<configuration>
<!-- NameNode元数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/hadoop/hdfs/nn</value>
</property>
<!-- DataNode数据存储目录,多磁盘用逗号分隔 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/hadoop/hdfs/dn1,file:///data/hadoop/hdfs/dn2</value>
</property>
<!-- 副本数量,根据集群规模调整 -->
<property>
<name>dfs.replication</name>
<value>3</value>

