Hadoop面试题及详细答案 110题 (71-85)-- 集群部署与运维
《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。
文章目录
- 一、本文面试题目录
- 71. 如何搭建一个Hadoop集群?(单机、伪分布式、完全分布式)
- 72. Hadoop集群的硬件推荐配置是什么?
- 73. Hadoop集群部署前需要做哪些准备工作?(如SSH免密、JDK安装等)
- 74. 如何配置Hadoop的环境变量?
- 75. 如何启动和停止Hadoop集群?(命令行操作)
- 76. Hadoop集群的日志文件保存在哪里?如何查看?
- 77. 如何监控Hadoop集群的健康状态?(如使用Ambari、Ganglia等)
- 78. Hadoop集群中,NameNode或DataNode故障如何处理?
- 79. 如何扩容或缩容Hadoop集群?
- 80. Hadoop集群的安全配置有哪些?(如Kerberos认证)
- 81. 如何备份和恢复Hadoop集群的元数据?
- 82. Hadoop集群的常见故障有哪些?如何排查?
- 83. 如何升级Hadoop集群的版本?
- 84. Hadoop集群的性能调优有哪些方面?(如HDFS块大小、MapReduce并行度等)
- 85. 如何配置Hadoop的HA(高可用)集群?
- 二、110道Hadoop面试题目录列表
一、本文面试题目录
71. 如何搭建一个Hadoop集群?(单机、伪分布式、完全分布式)
Hadoop集群的搭建可分为单机模式、伪分布式模式和完全分布式模式,适用于不同场景(开发测试、生产环境等)。
-
单机模式(默认模式)
原理:Hadoop默认以单机模式运行,无需配置分布式文件系统,所有进程(如MapReduce任务)都在本地操作系统的JVM中运行,仅用于调试代码。
搭建步骤:- 安装JDK并配置环境变量(
JAVA_HOME
)。 - 下载Hadoop压缩包并解压(如
hadoop-3.3.6.tar.gz
)。 - 无需修改配置文件,直接运行
hadoop version
验证安装。
- 安装JDK并配置环境变量(
-
伪分布式模式
原理:在单台机器上模拟分布式集群,HDFS的NameNode、DataNode,YARN的ResourceManager、NodeManager等进程独立运行,但共用一台物理机,适用于开发和测试。
搭建步骤(以Hadoop 3.x为例):- 配置SSH免密登录(本地免密:
ssh-keygen -t rsa
,并将公钥加入~/.ssh/authorized_keys
)。 - 修改Hadoop配置文件(位于
$HADOOP_HOME/etc/hadoop
):core-site.xml
:配置HDFS默认路径<configuration><property><name>fs.defaultFS</name><value>hdfs://localhost:9000</value></property> </configuration>
hdfs-site.xml
:配置副本数(伪分布式设为1)<configuration><property><name>dfs.replication</name><value>1</value></property> </configuration>
mapred-site.xml
:指定MapReduce运行在YARN上<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property> </configuration>
yarn-site.xml
:配置YARN资源管理器<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.resourcemanager.hostname</name><value>localhost</value></property> </configuration>
- 格式化HDFS:
hdfs namenode -format
。 - 启动集群:
start-all.sh
(或分别启动start-dfs.sh
和start-yarn.sh
)。 - 验证:访问
http://localhost:9870
(HDFS Web界面)和http://localhost:8088
(YARN Web界面)。
- 配置SSH免密登录(本地免密:
-
完全分布式模式
原理:多台物理机组成集群,分别担任NameNode、DataNode、ResourceManager等角色,适用于生产环境。
搭建核心步骤:- 准备多台机器(如1台Master,2台Slave),配置静态IP和主机名(
/etc/hostname
和/etc/hosts
)。 - 所有机器安装JDK和Hadoop,保持路径一致,并配置Master到所有Slave的SSH免密登录。
- 修改配置文件(核心配置如下):
workers
(Hadoop 3.x):列出所有Slave节点的主机名。core-site.xml
:fs.defaultFS
设为hdfs://Master主机名:9000
。hdfs-site.xml
:dfs.replication
设为3(生产环境推荐),并指定dfs.namenode.name.dir
和dfs.datanode.data.dir
的存储路径。yarn-site.xml
:配置yarn.resourcemanager.hostname
为Master主机名。
- 格式化NameNode(仅首次):
hdfs namenode -format
。 - 启动集群:
start-all.sh
,通过jps
命令检查各节点进程是否正常。
- 准备多台机器(如1台Master,2台Slave),配置静态IP和主机名(
72. Hadoop集群的硬件推荐配置是什么?
Hadoop集群的硬件配置需根据数据规模、计算需求和预算综合考量,以下是不同场景的推荐配置:
-
开发/测试环境(单机或伪分布式)
- CPU:4核及以上(如Intel i5/i7)。
- 内存:8GB及以上(Hadoop进程对内存需求较高)。
- 硬盘:500GB SSD(提升本地文件操作效率)。
- 操作系统:Linux(如Ubuntu、CentOS)。
-
生产环境(完全分布式)
- NameNode节点(1-2台,HA架构需备用节点):
- 角色特点:存储元数据,IO密集型(需快速处理元数据请求)。
- 配置:
- CPU:8核及以上(处理并发请求)。
- 内存:32GB及以上(元数据缓存到内存,提升访问速度)。
- 硬盘:2块1TB SSD(做RAID 1,保障元数据可靠性)。
- DataNode节点(数量根据数据量扩展,通常10台以上):
- 角色特点:存储实际数据,计算任务主要运行节点,IO和CPU密集型。
- 配置:
- CPU:16核及以上(支持并行Map/Reduce任务)。
- 内存:64GB及以上(避免内存不足导致任务失败)。
- 硬盘:4-12块4TB SATA硬盘(HDD为主,成本低,适合大容量存储;无需RAID,依赖HDFS副本机制)。
- ResourceManager节点(1-2台,HA架构):
- 角色特点:调度资源,CPU和内存需求中等。
- 配置:
- CPU:8核及以上。
- 内存:16GB及以上。
- 网络:
- 节点间推荐10Gbps以太网(减少数据传输瓶颈),Master与Slave之间带宽优先。
- NameNode节点(1-2台,HA架构需备用节点):
73. Hadoop集群部署前需要做哪些准备工作?(如SSH免密、JDK安装等)
Hadoop集群部署前需完成以下准备工作,确保环境一致性和稳定性:
-
1. 操作系统与环境检查
- 所有节点安装Linux系统(推荐CentOS 7/8或Ubuntu 20.04,避免Windows,因Hadoop对Linux支持更完善)。
- 关闭防火墙(或配置端口开放,如HDFS的9000、9870,YARN的8088等):
# CentOS关闭防火墙 systemctl stop firewalld systemctl disable firewalld
- 禁用SELinux(避免权限限制):修改
/etc/selinux/config
,设置SELINUX=disabled
,重启生效。
-
2. JDK安装与配置
- Hadoop依赖Java环境,需安装JDK 8(推荐,部分Hadoop版本支持JDK 11)。
- 解压JDK包(如
jdk-8u361-linux-x64.tar.gz
)到指定路径(如/usr/local/jdk1.8
)。 - 配置环境变量(
/etc/profile
或~/.bashrc
):export JAVA_HOME=/usr/local/jdk1.8 export PATH=$JAVA_HOME/bin:$PATH
- 验证:
java -version
显示版本信息。
-
3. 网络配置
- 所有节点设置静态IP(如
/etc/sysconfig/network-scripts/ifcfg-eth0
)。 - 配置主机名:修改
/etc/hostname
(如Master节点设为hadoop-master
,Slave节点设为hadoop-slave1
)。 - 配置hosts文件:
/etc/hosts
中添加所有节点的IP与主机名映射:192.168.1.100 hadoop-master 192.168.1.101 hadoop-slave1 192.168.1.102 hadoop-slave2
- 所有节点设置静态IP(如
-
4. SSH免密登录配置
- 所有节点安装SSH服务:
yum install openssh-server
(CentOS)或apt install openssh-server
(Ubuntu)。 - Master节点生成SSH密钥:
ssh-keygen -t rsa
(一路回车,无需密码)。 - 将公钥分发到所有节点(包括自身):
ssh-copy-id hadoop-master ssh-copy-id hadoop-slave1 ssh-copy-id hadoop-slave2
- 验证:
ssh hadoop-slave1
无需输入密码即可登录。
- 所有节点安装SSH服务:
-
5. 时间同步
- 集群节点时间需一致,避免因时间差导致服务异常。
- 安装NTP服务:
yum install ntp
,配置与公共NTP服务器同步(如pool.ntp.org
),或搭建本地NTP服务器。 - 手动同步(临时):
ntpdate time.windows.com
。
-
6. 关闭Swap分区
- 禁用Swap(避免Hadoop进程使用swap影响性能):
swapoff -a # 临时关闭 # 永久关闭:注释/etc/fstab中swap相关行
- 禁用Swap(避免Hadoop进程使用swap影响性能):
74. 如何配置Hadoop的环境变量?
配置Hadoop环境变量可简化命令操作,确保系统能识别Hadoop相关命令,步骤如下:
-
编辑环境变量配置文件
推荐在全局配置文件(如/etc/profile
)中设置,确保所有用户可使用:vi /etc/profile
-
添加Hadoop环境变量
在文件末尾添加以下内容(路径需替换为实际Hadoop安装路径):# Hadoop环境变量 export HADOOP_HOME=/usr/local/hadoop-3.3.6 export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop # 配置文件路径 export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export HADOOP_YARN_HOME=$HADOOP_HOME export JAVA_HOME=/usr/local/jdk1.8 # 需与JDK配置一致
-
生效环境变量
执行以下命令使配置立即生效:source /etc/profile
-
验证配置
输入hadoop version
,若显示Hadoop版本信息,则环境变量配置成功:Hadoop 3.3.6 Source code repository https://github.com/apache/hadoop.git -r ...
75. 如何启动和停止Hadoop集群?(命令行操作)
Hadoop集群的启动/停止可通过脚本快速操作,需在Master节点执行(假设已配置HADOOP_HOME
环境变量)。
-
启动集群
- 启动HDFS:
start-dfs.sh # 启动NameNode、DataNode、Secondary NameNode
- 启动YARN:
start-yarn.sh # 启动ResourceManager、NodeManager
- 一键启动所有服务(包含HDFS和YARN):
start-all.sh
- 启动HDFS:
-
停止集群
- 停止YARN:
stop-yarn.sh
- 停止HDFS:
stop-dfs.sh
- 一键停止所有服务:
stop-all.sh
- 停止YARN:
-
验证服务状态
在各节点执行jps
命令,查看进程是否正常启动:- Master节点应包含:
NameNode
、ResourceManager
、SecondaryNameNode
(非HA架构)。 - Slave节点应包含:
DataNode
、NodeManager
。
- Master节点应包含:
76. Hadoop集群的日志文件保存在哪里?如何查看?
Hadoop集群的日志分为服务日志(如NameNode、DataNode)和应用日志(如MapReduce任务),存储路径和查看方式如下:
-
1. 服务日志(HDFS、YARN进程日志)
- 存储路径:默认位于
$HADOOP_HOME/logs
(可通过HADOOP_LOG_DIR
环境变量自定义)。 - 日志文件命名规则:
- NameNode日志:
hadoop-<用户名>-namenode-<主机名>.log
- DataNode日志:
hadoop-<用户名>-datanode-<主机名>.log
- ResourceManager日志:
yarn-<用户名>-resourcemanager-<主机名>.log
- NameNode日志:
- 查看方式:
# 查看NameNode实时日志 tail -f $HADOOP_HOME/logs/hadoop-root-namenode-hadoop-master.log # 搜索错误信息 grep "ERROR" $HADOOP_HOME/logs/hadoop-root-datanode-hadoop-slave1.log
- 存储路径:默认位于
-
2. 应用日志(MapReduce/YARN任务日志)
- 存储路径:
- 任务运行时:
$YARN_HOME/logs/userlogs/<ApplicationID>/
(每个Container对应一个日志文件)。 - 任务完成后:默认由
Log Aggregation
功能收集到HDFS(路径为/tmp/logs/<用户名>/logs/<ApplicationID>
,需在yarn-site.xml
中开启)。
- 任务运行时:
- 查看方式:
- 通过YARN Web界面(
http://<ResourceManager主机名>:8088
):找到对应Application,点击“Logs”查看。 - 命令行查看HDFS中的聚合日志:
yarn logs -applicationId application_1620000000000_0001
- 通过YARN Web界面(
- 存储路径:
77. 如何监控Hadoop集群的健康状态?(如使用Ambari、Ganglia等)
监控Hadoop集群需实时跟踪节点状态、资源使用率、任务进度等,常用工具如下:
-
1. 内置Web界面
- HDFS监控:访问
http://<NameNode主机名>:9870
,可查看集群总容量、已用空间、DataNode状态、块信息等。 - YARN监控:访问
http://<ResourceManager主机名>:8088
,可查看集群资源(CPU、内存)使用情况、运行中的应用、节点状态等。
- HDFS监控:访问
-
2. Ambari(推荐生产环境)
- 原理:Apache Ambari是开源的集群管理工具,支持Hadoop集群的部署、监控、告警和配置管理,提供可视化Web界面。
- 特点:
- 支持多组件监控(HDFS、YARN、Hive、Spark等)。
- 实时显示节点健康状态、资源使用率,并可设置告警(如节点宕机、磁盘满)。
- 使用步骤:
- 安装Ambari Server和Agent(需提前配置数据库,如MySQL)。
- 通过Ambari Web界面(默认
http://<Ambari主机名>:8080
)添加集群节点,选择需安装的服务。 - 在“Dashboard”查看集群概览,在“Hosts”查看节点详情。
-
3. Ganglia
- 原理:分布式监控系统,通过收集节点的CPU、内存、网络等指标,生成图表展示集群性能趋势。
- 组成:
gmond
(在每个节点运行,收集本地指标)。gmetad
(聚合所有gmond
的数据)。- Web界面(展示监控图表)。
- 特点:轻量级,适合监控大规模集群的资源使用趋势。
-
4. Nagios
- 原理:专注于告警的监控工具,可配置对Hadoop服务(如NameNode端口是否存活)、节点状态的检查,异常时通过邮件/短信告警。
- 特点:告警机制灵活,可自定义监控脚本(如检查HDFS副本完整性)。
78. Hadoop集群中,NameNode或DataNode故障如何处理?
NameNode和DataNode是HDFS的核心组件,故障处理需根据角色特点采取不同策略:
-
1. NameNode故障
- 影响:NameNode存储元数据,故障会导致整个HDFS集群不可用(无法读写文件)。
- 处理方法:
- 非HA架构(依赖Secondary NameNode):
- 停止所有HDFS服务:
stop-dfs.sh
。 - 从Secondary NameNode恢复元数据(Secondary NameNode定期合并edits和fsimage):
# 将Secondary NameNode的元数据复制到NameNode的数据目录 scp -r hadoop-secondary:/$HADOOP_HOME/dfs/namesecondary/* /$HADOOP_HOME/dfs/name/
- 重启HDFS:
start-dfs.sh
。
- 停止所有HDFS服务:
- HA架构(Active/Standby NameNode):
- 自动故障转移:通过ZooKeeper监测Active NameNode状态,故障时Standby自动切换为Active。
- 手动切换(若自动切换失败):
hdfs haadmin -failover --forcefence --forceactive active-nn standby-nn
- 非HA架构(依赖Secondary NameNode):
-
2. DataNode故障
- 影响:DataNode存储数据块,单节点故障不会导致数据丢失(依赖副本机制),但可能影响读写性能。
- 处理方法:
- 检查故障原因(如网络中断、磁盘损坏),修复后重启DataNode:
hdfs --daemon start datanode
- 若节点无法修复(如硬件报废):
- 从集群中移除节点:在
workers
文件中删除该节点主机名,重启HDFS。 - HDFS会自动检测缺失的块,在其他DataNode上重新复制副本(通过Balancer均衡数据):
hdfs balancer # 平衡数据分布
- 从集群中移除节点:在
- 检查故障原因(如网络中断、磁盘损坏),修复后重启DataNode:
79. 如何扩容或缩容Hadoop集群?
Hadoop集群支持动态扩容(增加节点)和缩容(移除节点),以适应数据量或计算需求的变化。
-
1. 扩容集群(增加DataNode节点)
步骤:- 准备新节点:按照“集群部署前准备工作”配置新节点(安装JDK、Hadoop、SSH免密、时间同步等),确保与现有集群环境一致。
- 在新节点上配置Hadoop:复制Master节点的
$HADOOP_HOME/etc/hadoop
目录到新节点(保持配置一致)。 - 在Master节点的
workers
文件(Hadoop 3.x)中添加新节点的主机名。 - 启动新节点的DataNode和NodeManager:
# 在新节点执行 hdfs --daemon start datanode yarn --daemon start nodemanager
- 验证:通过HDFS Web界面(
http://namenode:9870/datanode.html
)查看新节点是否加入。 - 平衡数据:新节点加入后,使用Balancer将数据均匀分布到所有节点:
hdfs balancer -threshold 10 # 数据不平衡率低于10%时停止
-
2. 缩容集群(移除DataNode节点)
步骤:- 在Master节点标记待移除的节点(避免数据丢失):
# 编辑hdfs-site.xml,添加待退役节点(临时生效) hdfs dfsadmin -decommission datanode-hostname start
- 监控退役进度:通过
hdfs dfsadmin -decommission datanode-hostname status
查看,当状态为“Decommissioned”时,节点上的数据已复制到其他节点。 - 停止待移除节点的服务:
hdfs --daemon stop datanode yarn --daemon stop nodemanager
- 在Master节点的
workers
文件中删除该节点的主机名,使配置永久生效。
- 在Master节点标记待移除的节点(避免数据丢失):
80. Hadoop集群的安全配置有哪些?(如Kerberos认证)
Hadoop集群默认安全性较低(如无认证机制),生产环境需配置以下安全措施:
-
1. Kerberos认证
- 原理:Kerberos是网络认证协议,通过密钥体系验证用户和服务身份,防止未授权访问。
- 配置步骤:
- 部署Kerberos服务器(KDC),创建管理员账户和数据库。
- 为Hadoop服务(如NameNode、ResourceManager)和用户创建Kerberos主体(Principal)。
- 在Hadoop配置文件中开启Kerberos认证:
core-site.xml
:<property><name>hadoop.security.authentication</name><value>kerberos</value> </property>
hdfs-site.xml
:<property><name>dfs.namenode.kerberos.principal</name><value>hdfs/_HOST@EXAMPLE.COM</value> </property>
- 生成密钥表(keytab)并分发到各节点,确保服务可自动登录Kerberos。
-
2. 授权控制(HDFS权限与ACLs)
- HDFS文件系统支持类Unix权限(用户、组、其他权限),可通过命令设置:
hdfs dfs -chmod 755 /user/data # 设置目录权限
- 高级授权:使用ACLs(访问控制列表)细化权限(如允许特定用户访问):
hdfs dfs -setfacl -m user:alice:rwx /user/data # 允许用户alice读写执行
- HDFS文件系统支持类Unix权限(用户、组、其他权限),可通过命令设置:
-
3. 数据加密
- 传输加密:启用SSL/TLS加密Hadoop组件间的通信(如NameNode与DataNode),配置
ssl-server.xml
和ssl-client.xml
。 - 存储加密:HDFS支持透明数据加密(TDE),对敏感数据在写入时加密,读取时解密,需配置密钥管理服务(如KMS)。
- 传输加密:启用SSL/TLS加密Hadoop组件间的通信(如NameNode与DataNode),配置
-
4. 审计日志
- 开启HDFS和YARN的审计日志,记录用户操作(如文件创建、删除,任务提交),便于追溯安全事件:
hdfs-site.xml
中配置dfs.audit.log.enabled
为true
。
- 开启HDFS和YARN的审计日志,记录用户操作(如文件创建、删除,任务提交),便于追溯安全事件:
81. 如何备份和恢复Hadoop集群的元数据?
HDFS的元数据(存储在NameNode)是集群的核心,需定期备份以防丢失,备份和恢复方法如下:
-
1. 元数据备份
元数据包含fsimage
(元数据快照)和edits
(操作日志),备份方式:- 利用Secondary NameNode:
Secondary NameNode定期合并edits
和fsimage
,生成新的fsimage
,默认存储在dfs.namenode.name.dir
配置的路径(如/hadoop/dfs/namesecondary
),可定期复制该目录到备份存储(如异地服务器)。 - 手动备份:
# 手动触发元数据合并 hdfs dfsadmin -saveNamespace # 复制合并后的元数据到备份目录 cp -r $HADOOP_HOME/dfs/name/current /backup/hdfs_metadata/$(date +%Y%m%d)
- 定时任务:通过
crontab
配置每日自动备份:0 0 * * * hdfs dfsadmin -saveNamespace && cp -r /hadoop/dfs/name/current /backup/hdfs_metadata/$(date +%Y%m%d)
- 利用Secondary NameNode:
-
2. 元数据恢复
当NameNode的元数据损坏或丢失时,恢复步骤:- 停止HDFS服务:
stop-dfs.sh
。 - 清除NameNode现有元数据目录(如
/hadoop/dfs/name/current
)。 - 复制备份的元数据到NameNode的数据目录:
cp -r /backup/hdfs_metadata/20240501/* /hadoop/dfs/name/current/
- 重启HDFS:
start-dfs.sh
。 - 验证:通过
hdfs dfs -ls /
检查文件目录是否恢复正常。
- 停止HDFS服务:
82. Hadoop集群的常见故障有哪些?如何排查?
Hadoop集群常见故障及排查方法如下:
-
1. NameNode无法启动
- 可能原因:元数据损坏、端口被占用、权限不足。
- 排查:
- 查看NameNode日志(
$HADOOP_HOME/logs/hadoop-*-namenode-*.log
),搜索“ERROR”关键词。 - 检查元数据目录权限:
ls -ld /hadoop/dfs/name
,确保Hadoop用户有读写权限。 - 检查端口9000(默认)是否被占用:
netstat -tunlp | grep 9000
, kill占用进程。
- 查看NameNode日志(
-
2. DataNode启动后自动关闭
- 可能原因:与NameNode通信失败、数据目录损坏、心跳超时。
- 排查:
- 检查DataNode日志,若显示“Invalid block pool ID”,可能是DataNode元数据与NameNode不一致,删除DataNode的数据目录(
/hadoop/dfs/data
)后重启。 - 验证网络:
ping namenode-host
和telnet namenode-host 9000
,确保通信正常。
- 检查DataNode日志,若显示“Invalid block pool ID”,可能是DataNode元数据与NameNode不一致,删除DataNode的数据目录(
-
3. YARN任务提交失败
- 可能原因:资源不足(CPU/内存)、NodeManager未启动、Shuffle服务异常。
- 排查:
- 查看YARN Web界面(
http://resourcemanager:8088
),检查节点是否正常(“Nodes”页面)。 - 查看任务日志:
yarn logs -applicationId <AppID>
,搜索失败原因(如“Container killed by YARN for exceeding memory limits”)。 - 调整YARN资源配置(
yarn-site.xml
),如增加yarn.nodemanager.resource.memory-mb
。
- 查看YARN Web界面(
-
4. HDFS读写文件失败
- 可能原因:副本不足、DataNode宕机、块损坏。
- 排查:
- 检查文件副本状态:
hdfs fsck /path/to/file
,若显示“MISSING”块,需修复:hdfs fsck /path/to/file -delete
(删除损坏块)或等待HDFS自动复制。 - 查看HDFS Web界面,确认DataNode是否正常在线。
- 检查文件副本状态:
-
5. 集群时间同步问题
- 可能原因:节点间时间差过大(超过30秒),导致Kerberos认证失败或任务调度异常。
- 排查:
- 检查各节点时间:
date
,若不一致,执行ntpdate ntp-server
同步。
- 检查各节点时间:
83. 如何升级Hadoop集群的版本?
Hadoop版本升级需谨慎操作,避免数据丢失或服务中断,推荐“滚动升级”(不停止整个集群):
-
前提条件
- 升级前备份元数据(
fsimage
和edits
)和配置文件。 - 确保集群处于健康状态:
hdfs dfsadmin -report
显示所有DataNode正常。
- 升级前备份元数据(
-
升级步骤(以2.x升级到3.x为例)
-
准备新Hadoop版本
下载目标版本(如hadoop-3.3.6.tar.gz
),解压到新目录(如/usr/local/hadoop-3.3.6
),复制旧版本的配置文件(etc/hadoop
)到新版本,并根据官方文档修改不兼容的配置(如3.x中部分配置项名称变更)。 -
滚动升级HDFS
- 升级NameNode:
# 停止旧版本NameNode hdfs --daemon stop namenode # 使用新版本启动NameNode(升级模式) export HADOOP_HOME=/usr/local/hadoop-3.3.6 $HADOOP_HOME/bin/hdfs --daemon start namenode -upgrade
- 升级DataNode(逐个节点,避免数据不可用):
# 停止旧版本DataNode hdfs --daemon stop datanode # 启动新版本DataNode $HADOOP_HOME/bin/hdfs --daemon start datanode
- 验证HDFS状态:
hdfs dfsadmin -upgradeProgress status
,确认所有DataNode升级完成。
- 升级NameNode:
-
滚动升级YARN
- 升级ResourceManager和NodeManager,步骤类似HDFS,先升级Master节点,再逐个升级Slave节点。
-
完成升级
- 确认所有组件正常运行后,提交升级:
hdfs dfsadmin -finalizeUpgrade
- 清理旧版本文件,更新环境变量
HADOOP_HOME
为新版本路径。
- 确认所有组件正常运行后,提交升级:
-
84. Hadoop集群的性能调优有哪些方面?(如HDFS块大小、MapReduce并行度等)
Hadoop集群性能调优需从HDFS、MapReduce、YARN等组件综合优化,关键方向如下:
-
1. HDFS调优
- 块大小(Block Size):默认128MB(Hadoop 3.x),大文件可增大至256MB,减少块数量和元数据开销;小文件多则保持默认或减小,避免块过多占用NameNode内存。
- 配置:
hdfs-site.xml
中dfs.blocksize
。
- 配置:
- 副本数(Replication):根据数据重要性和集群规模调整,生产环境通常设为3(默认),非重要数据可设为2以节省空间。
- DataNode缓存:将热点数据缓存到DataNode内存(
dfs.datanode.max.locked.memory
),提升读取速度。 - 平衡器(Balancer):定期运行
hdfs balancer
,避免数据集中在少数节点导致IO瓶颈。
- 块大小(Block Size):默认128MB(Hadoop 3.x),大文件可增大至256MB,减少块数量和元数据开销;小文件多则保持默认或减小,避免块过多占用NameNode内存。
-
2. MapReduce调优
- Map/Reduce并行度:
- Map数量:由输入文件的块数决定,可通过
mapreduce.job.maps
调整(建议每个Map处理128-256MB数据)。 - Reduce数量:默认1,根据输出数据量调整(通常设为集群节点数的1-2倍),通过
mapreduce.job.reduces
配置。
- Map数量:由输入文件的块数决定,可通过
- Shuffle优化:
- 增大Map端缓冲区(
mapreduce.task.io.sort.mb
,默认100MB),减少溢写次数。 - 启用压缩(如Snappy):
mapreduce.map.output.compress=true
,减少Shuffle阶段数据传输量。
- 增大Map端缓冲区(
- Combiner使用:对适合聚合的场景(如WordCount)启用Combiner,减少Map输出数据量。
- Map/Reduce并行度:
-
3. YARN资源调优
- 资源分配:根据节点硬件配置调整
yarn.nodemanager.resource.memory-mb
(节点总内存)和yarn.nodemanager.resource.cpu-vcores
(CPU核心数)。 - Container资源:设置单个Container的内存(
yarn.scheduler.minimum-allocation-mb
)和CPU(yarn.scheduler.minimum-allocation-vcores
),避免资源浪费。 - 调度器选择:生产环境推荐Capacity Scheduler或Fair Scheduler,而非默认的FIFO,以支持多队列资源隔离。
- 资源分配:根据节点硬件配置调整
-
4. 小文件处理
- 使用
HAR
(Hadoop Archive)合并小文件:hadoop archive -archiveName files.har -p /input /output
。 - 启用HDFS Federation,通过多个NameNode分担小文件元数据压力。
- 使用
85. 如何配置Hadoop的HA(高可用)集群?
Hadoop HA(High Availability)架构通过部署备用节点避免单点故障,以HDFS HA和YARN HA为例:
-
HDFS HA配置(基于QJM的共享存储)
原理:部署两个NameNode(Active和Standby),通过Quorum Journal Manager(QJM)共享edits日志,确保元数据一致,ZooKeeper负责故障检测和自动切换。配置步骤:
-
配置core-site.xml:指定HDFS命名服务(如
mycluster
)<property><name>fs.defaultFS</name><value>hdfs://mycluster</value> </property>
-
配置hdfs-site.xml:
- 定义NameNode节点:
<property><name>dfs.nameservices</name><value>mycluster</value> </property> <property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value> <!-- nn1:Active, nn2:Standby --> </property> <property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>node1:8020</value> </property> <property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>node2:8020</value> </property>
- 配置QJM共享存储(至少3个JournalNode节点):
<property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value> </property>
- 启用自动故障转移:
<property><name>dfs.ha.automatic-failover.enabled</name><value>true</value> </property>
- 定义NameNode节点:
-
配置ZooKeeper:部署ZooKeeper集群,HDFS通过ZKFC(ZooKeeper Failover Controller)监测NameNode状态。
-
初始化HA集群:
- 格式化NameNode:
hdfs namenode -format
,并复制元数据到Standby节点。 - 初始化ZKFC:
hdfs zkfc -formatZK
。 - 启动HDFS:
start-dfs.sh
,自动选举Active NameNode。
- 格式化NameNode:
-
-
YARN HA配置
原理:部署两个ResourceManager(Active和Standby),通过ZooKeeper实现状态同步和故障转移。配置步骤(yarn-site.xml):
<property><name>yarn.resourcemanager.ha.enabled</name><value>true</value> </property> <property><name>yarn.resourcemanager.cluster-id</name><value>yarncluster</value> </property> <property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value> </property> <property><name>yarn.resourcemanager.hostname.rm1</name><value>node1</value> </property> <property><name>yarn.resourcemanager.hostname.rm2</name><value>node2</value> </property> <property><name>yarn.resourcemanager.zk-address</name><value>node1:2181,node2:2181,node3:2181</value> </property>
启动YARN:
start-yarn.sh
,通过yarn rmadmin -getServiceState rm1
查看节点状态。
二、110道Hadoop面试题目录列表
文章序号 | Hadoop面试题110道 |
---|---|
1 | Hadoop面试题及详细答案110道(01-15) |
2 | Hadoop面试题及详细答案110道(16-35) |
3 | Hadoop面试题及详细答案110道(36-55) |
4 | Hadoop面试题及详细答案110道(56-70) |
5 | Hadoop面试题及详细答案110道(71-85) |
6 | Hadoop面试题及详细答案110道(86-95) |
7 | Hadoop面试题及详细答案110道(96-105) |
8 | Hadoop面试题及详细答案110道(106-110) |