CentOS 7环境下Hadoop高可用(HA)集群部署完全指南
虚拟机版本:centos7
Hadoop的安装与配置:
1.设置静态IP
1.1进入虚拟机终端
方法一:
1. cd /etc/sysconfig/network–scripts
–> vi ifcfg–ens33
方法二:
1. vi /etc/sysconfig/network–scripts/ifcfg–ens33
1.2进入编辑模式
输入i
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=ens33
UUID=38645ad3-7a97-4a34-8a21-77cfcfb3f761
DEVICE=ens33
ONBOOT=yes
NETMASK=255.255.255.0
GATEWAY=192.168.183.2
IPADDR=192.168.183.130
DNS1=192.168.183.2
***
主要修改内容:
BOOTPROTO="static"
NETMASK=255.255.255.0 GATEWAY=192.168.183.2 IPADDR=192.168.183.130
DNS1=192.168.183.2(这里的内容和GATEWAY一致)
说明
(ONBOOT=yes –>网卡开关打开
子网掩码:NETMASK=“255.255.255.0
网关:"GATEWAY=(在NAT模式中)
ip地址:IPADDR = ((NAT模式章的DHCP设置中))
1.3重启网络配置
命令:
1. systemctl restart network
测试:
1.ping www.baidu.com
2.或者ping端口ip:192.168.183.130
2.关闭防火墙
命令:
- systemctl stop firewalld –>关闭防火墙
- systemctl disable firewalld –>永久关闭防火墙
查看防火墙状态:
1. systemctl status firewalld
3.配置国内Yum镜像源(CentOS 7)
3.1目的
替换默认Yum源为国内镜像源(阿里云),提升软件包下载速度。
3.2操作步骤
1.备份原有仓库配置文件
1. sudo cp /etc/yum.repos.d/CentOS–Base.repo /etc/yum.repos.d/CentOS–Base.repo.backup
2.下载阿里云 CentOS 7 镜像源配置文件
1. sudo wget –O /etc/yum.repos.d/CentOS–Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3.清理并重建 Yum 缓存
1. sudo yum clean all # 清除原有缓存
2. sudo yum makecache # 生成新的镜像源缓存
4.验证(可选)执行以下命令测试源是否生效
(以安装 ntpdate 为例)
1. sudo yum install ntpdate –y
3.3同步系统时区
操作步骤
- 查看当前时区状态
1. timedatectl
- 设置时区为上海时区
1. timedatectl set–timezone Asia/Shanghai
- 同步网络时间(校准时间)
1. sudo ntpdate –u ntp.ntsc.ac.cn
3.4补充说明
- 命令中sudo适配普通用户操作,若已切换至root用户,可去掉sudo直接执行;
- 若wget命令未安装,可先执行yum install wget -y安装;
- 除阿里云外,也可替换为清华源(替换步骤2的命令即可):
1. sudo wget –O /etc/yum.repos.d/CentOS–Base.repo https://mirrors.tuna.tsinghua.edu.cn/repo/Centos-7.repo
4.修改主机名(HOSTNAME)
1.输入命令
1. vi /etc/hostname
2.按i进入编辑模式
将内容改成master或者其他你需要设置的主机名
5.配置主机名与IP映射
1.输入命令
1. vi /etc/hosts
2.输入i进入编辑模式,在最后一行映射自己的虚拟机ip和虚拟机名字
192.168.183.130 master
192.168.183.131 slave1
192.168.183.132 slave2
6.设置SSH免密登录
密钥生成
- 生成RSA密钥: ssh-keygen -t rsa
- 每个用户独立生成自己的密钥
- 每个用户独立生成自己的密钥
密钥拷贝
1. ssh–copy–id –i ~/.ssh/id_rsa.pub slave2@slave2
slave2@slave2:这里的第一个slave2表示是slave2这个用户,第二个表示虚拟机
密钥文件说明
authorized_keys: 用户认证的公钥文件
known_hosts: 已知主机IP映射文件
免密登录配置
复制公钥到远程主机:
1. ssh–copy–id ~/.ssh/id_rsa.pub master@mater
指定用户连接: 用户@IP/主机名
特定用户免密配置
解决ssh免密登录时候必须用@才能精准登录用户的操作问题
~ 等于 主目录–> /home/当前目录
- 进入目录之下 .ssh
1. vim ~/.ssh/config
-
Host slave1
HostName slave1
User slave1
IdentityFile ~/.ssh/id_rsa
Host slave2
HostName slave2
User slave2
IdentityFile ~/.ssh/id_rsa
- 修改权限,这一步最好修改为600
1. chmod 600 /home/master/.ssh/config # -rw
2. chmod 700 /home/master/.ssh/config #「读、写、执行」权限(rwx——)
如果要分发的话得将权限改成700,才能分发,假如是从master节点到slave1节点就需要将master节点的config文件改成700
- 此时即可输入ssh + 用户名,不需要加@
1. ssh slave1
报错:出现还得输入密码
解决方案:
检查无法登录的节点 假如是master节点登录slave1节点出错,则再slave1节点下去检查
- 检查known_hosts(当前目录是/home/slave1/.ssh)(master节点)
1. cat known_hosts
- 检查authorized_keys(slave1节点)
1. cat authorized_keys
- 发现是slave1的authorized_keys中没有master节点的签名(相关内容),分发公钥到slave1(从master节点分发)
1. ssh–copy–id –i id_rsa.pub slave1
从节点上看看.ssh 目录的权限是不是 700,authorized_keys 文件权限是不是 600。如果不是的话,就用 chmod 命令改一下,目录改成 chmod 700 ~/.ssh,文件改成 chmod 600 ~/.ssh/authorized_keys。改完再试试登录,应该就没问题了。
7.配置java环境
注意这里的jdk版本必须时jdk8版本 因为这个版本对应后面的hadoop2x版本
第一步、先查看自己的虚拟机上面有没有jdk版本
在运行后的虚拟中的终端中输入
1. java –version # 若出现版本号,则进行删除
第二步、删除原本虚拟机种的jdk
1. 输入which java
出现一个路径可能是 /usr/java
2. 删除rm -rf
1. rm –rf 空格 后面跟上which java找出来的路径
3. 检查java -version
1. 再次用java –version检查是否有jdk版本号
第三步、上传本地jdk包
1.在本地的资源管理器
按住shift 在空白处右键,进入powershell
1. scp jdk–8u451–linux–x64.tar.gz master@192.168.183.130:/usr/local/src/jdk
2.在master解压jdk压缩包
进入目录/usr/local/src/jdk
1. tar –zxvf jdk–8u451–linux–x64.tar.gz –c /usr/local/src/jdk/jdk1.8.0_451
3.配置系统环境
切换到root用户输入
1. vim /etc/profile
进入vi配置页面后在文件最后添加:
export JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_451
export PATH=$JAVA_HOME/bin:$PATH
配置完毕后:Esc 然后输入:wq 保存并退出
4.配置文件生效
root用户
1. source /etc/profile # 配置文件生效
5.检验是否配置成功
jps # 出现1101 Jps或者其他数字即成功
java -version #查看java版本号
8.传输zookeeper和hadoop到虚拟机
1.创建文件夹(tmp和hadoop):
在:/usr/local/src/中(注意是在root用户下)
mkdir tmp
mkdir hadoop2.7
2.修改文件夹的权限:
结尾/带斜杠:表示文件和文件夹的内容全部都属于master
结尾不带斜杠:仅仅表示这个文件属于master,但是文件的其他内容不是
1. chown –R master:master /usr/local/src/hadoop2.7/
2. chown –R master:master /usr/local/src/tmp/
查看用户组权限
1. groups master
其他命令
less /etc/passwd:查看用户所有信息
pwd查看当前目录
ip addr:查看ip地址
3.传输zookper和hadoop文件压缩包:
到tmp和hadoop文件夹中 1.首先进入到本机然后打开powershell,然后输入命令:
1. scp hadoop–2.7.1.tar.gz master@192.168.183.130:/usr/local/src/hadoop2.7/
1. scp .\zookpeer\zookeeper–3.3.5.tar.gz master@192.168.183.130:/usr/local/src/tmp/
2.解压压缩包:
tar -zxvf +压缩包 +-C(指定目标路径) tar –help可以查找这个命令的用法
1. tar –zxvf zookeeper–3.3.5.tar.gz –c /usr/local/src/tmp/
2. tar –zxvf hadoop–2.7.1.tar.gz –c /usr/local/src/hadoop2.7/
9.配置zookper文件
zoo.cfg 配置的核心就是两件事:
- 告诉 Zookeeper “我的数据存在哪”(dataDir);
- 告诉 Zookeeper“我在哪个集群里,和谁通信、用哪个端口通信”(server.xxx)。
1.准备
配置文件路径:
1. /usr/local/src/tmp/zookeeper3.3.5/conf
1.先将解压后的zookper文件进行修改名字方便后期使用** mv:更改名字之前先进行备份 1.1先创建文件夹zoo_sample20250919这个文件夹
1. mkdir zoo_sample20250919
1.2进入conf这个文件,先copy一份zoo_sample.cfg到zoo_sample20250919文件夹中,再更改名字
1. cp zoo_sample.cfg /usr/local/src/tmp/zookeeper3.3.5/conf/zoo_sample20250919.cfg
2. mv zoo_sample.cfg zoo.cfg #修改名字
2.配置修改后的zoo.cfg文件
1.创建zkdata文件在/usr/local/src/tmp/zookeeper3.3.5/这个文件中
- 配置的是啥:指定 Zookeeper 存放 “核心数据” 的文件夹路径(就是 zkdata 文件夹)。
- 作用
- Zookeeper 运行时的 “账本”(比如集群的状态、节点信息、日志)都存在这个文件夹里。 “健康信息” 也是其中一部分,没有这个路径,Zookeeper 不知道该把自己的核心数据存在哪,启动就会报错。
zkdata:存放健康信息
1. cd /usr/local/src/tmp/zookeeper3.3.5/
2. mkdir zkdata
2.将路径复制到zoo.cfg文件的dataDir
其中zoo.cfg这个文件夹路径是:/usr/local/src/tmp/zookeeper3.3.5/conf
1. dataDir=/usr/local/src/tmp/zookeeper3.3.5/zkdata
3.配置监听端口和心跳端口在文件的末尾
3888:数据监听端口
2888:心跳端口
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
- 配置的是啥
- Zookeeper 节点 “集群里有哪些小伙伴”,以及和小伙伴通信的端口。
- 数字:数字是每个节点的 “唯一编号”(比如 1=master,2=slave1),相当于给集群里的每个机器贴个身份证;
- :是集群里机器的名字(或 IP),Zookeeper 知道该找谁;
- (心跳端口):集群里机器之间 “报平安” 用的 —— 比如 master 每隔一会儿给 slave1 发个消息 “我还活着”,slave1 也回 “我也活着”,确保集群里机器都在线;
- (数据监听端口):集群里 “选老大”+“同步数据” 用的 —— 比如 master 挂了,slave 之间通过这个端口商量谁当新老大;平时也通过这个端口同步数据(比如 master 新增了一个节点,通过 3888 告诉 slave1、slave2)。
- 3888 端口被占用 / 堵死,哪怕所有节点都活着(2888 正常),选举也完全没法进行 —— 老大连不上了,新老大选不出来,集群就瘫痪了。
|
端口 |
|
|
|
2888 |
|
|
|
3888 |
|
|
3.创建myid文件
1.在zkdata文件夹中创建
1. touch myid
2.将1,2,3指Zookeeper集群各节点的编号,保存到一个名称为myid的文件
echo加编号然后> 加文件梭在路径
">":是覆盖文件
">>":在文件中追加
1. echo 1 > /usr/local/src/tmp/zookeeper3.3.5/zkdata/myid
4.配置zookeeper环境变量
1.将master节点配置好的zookeeper用scp命令传输到另外两个节点(slave1和slave2)
scp -r zookeeper3.3.5 master@master:/usr/local/src/tmp
2.配置zookeeper环境变量(切换到root用户su root)
1.vi /etc/profile #然后输入i
2.export PATH=$PATH:/usr/local/src/tmp/zookeeper3.3.5/bin
3.source /etc/profile #
3.测试是否成功(启动)
必须在zookeeper安装的bin目录下
1.zkServer.sh start #这一步是三个虚拟机都进行运行
2.zkServer.sh status #这一步是上一步做完分别在各自节点运行
3.zkServer.sh stop #这一步可以省略
4.日志查看
1.主节点master
[master@master /]# zkServer.sh start JMX enabled by default Using config: /usr/local/src/tmp/zookeeper3.3.5/bin/../conf/zoo.cfg Starting zookeeper … STARTED
[master@master /]# zkServer.sh status JMX enabled by default Using config: /usr/local/src/tmp/zookeeper3.3.5/bin/../conf/zoo.cfg Mode: follower
2.子节点slave2或者slave1
[slave1@slave1 bin]# zkServer.sh start JMX enabled by default Using config: /usr/local/src/tmp/zookeeper3.3.5/bin/../conf/zoo.cfg Starting zookeeper … STARTED
[slave1@slave1 bin]# zkServer.sh status JMX enabled by default Using config: /usr/local/src/tmp/zookeeper3.3.5/bin/../conf/zoo.cfg Mode: leader
10.Hadoop搭建
配置路径:
/usr/local/src/hadoop2.7/hadoop2.7.1/etc/hadoop
1.配置hadoop-env.sh和yarn-env.sh
1. vim hadoop–env.sh
添加
1. export JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_451
修改yarn-env.sh
同样再这个文件中添加
1. export JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_451
2.配置core-site.xml
1. vim core–site.xml
<configuration>
<!–指定hdfs的nameservice的名称为ns –>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!–指定zookeeper地址,主要在zookeeper文件的conf的clientPort这个值 –>
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!–指定hadoop临时文件存放 –>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/src/hadoop2.7/hadoop2.7.1/metadata</value>
</property>
</configuration>
其中file:/usr/local/src/hadoop2.7/hadoop2.7.1/etc/hadoopdata表示存的是临时数据路径
3.配置hdfs-site.xml (保存副本数量)
1. vim hdfs–site.xml
<configuration>
<!–1. 副本数配置 –>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!–2. 命名服务(Nameservice)配置 –>
<!–指定 hdfs 的 nameservice 为 ns,需要和 core-site.xml 中的保持一致 –>
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!– 3. NameNode 节点列表配置–>
<!– ns 下面有两个 NameNode,分别是 nn1,nn2 –>
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!– 4.NameNode 通信地址配置(nn1)–>
<!– nn1 的 RPC 通信地址 –>
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>master:8020</value>
</property>
<!– nn1 的 http 通信地址 –>
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>master:50070</value>
</property>
<!–5. NameNode 通信地址配置(nn2) –>
<!– nn2 的 RPC 通信地址 –>
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>slave1:8020</value>
</property>
<!– nn2 的 http 通信地址 –>
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>slave1:50070</value>
</property>
<!–6. JournalNode 共享编辑日志配置 –>
<!– 指定 NameNode 的元数据在 JournalNode 上的存放位置 –>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/ns</value><!– 节点间用;隔开 –>
</property>
<!– 新增:JournalNode 本地数据存储路径(必须是本地路径) –>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/src/hadoop2.7/hadoop2.7.1/data/journalnode</value>
</property>
<!– 新增:NameNode 本地元数据存储路径(必须是本地路径) –>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/src/hadoop2.7/hadoop2.7.1/data/namenode</value>
</property>
<!– 可选补充:DataNode 本地数据存储路径(避免默认路径冲突) –>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/src/hadoop2.7/hadoop2.7.1/data/datanode</value>
</property>
</configuration>
readmed.txt:里面网址可以寻找默认端口wiki和
4.配置mapred-site.xml使用YARN进行资源调度和任务管理
1. vim mapred–site.xml.template或者 mapred–site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!– MapReduce JobHistory Server 地址 –>
<property>
<!–JobHistory Server 的 RPC 地址 用于支撑开发环节–>
<name>mapreduce.jobhistory.address</name>
<value>node0:10020</value>
</property>
<property>
<!–JobHistory Server 的 Web UI 地址 http–>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node0:19888</value>
</property>
</configuration>
5.配置yarn-site.xml (集群资源管理系统参数)
1. vim yarn–site.xml
<configuration>
<!– 指定 nodemanager 启动时加载 server 的方式为 shuffle server –>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!– 指定 resourcemanager 地址 –>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
6.配置:slaves(workers)
1. vim slaves(workers)
slave1
master
slave2
7.将master节点配置的hadoop文件传输到slave1和slave2中
1. scp –r /usr/local/src/hadoop2.7/ slave1@slave1:/usr/local/src/
2. scp –r /usr/local/src/hadoop2.7/ slave2@slave2:/usr/local/src/
8.配置hadoop的系统环境变量(所有节点都配置)
1. vim .bash_profile #注意必须在根目录(home/master(或者其他slave1、slave2))下才能运行成功命令
export JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_451
export HADOOP_HOME=/usr/local/src/hadoop2.7/hadoop2.7.1
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
启动环境变量
1. source .bash_profile
配置环境变量
1. vim /etc/prifile
export JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_451
export ZOOKEEPER_HOME=/usr/local/src/tmp/zookeeper3.3.5
export HADOOP_HOME=/usr/local/src/hadoop2.7/hadoop2.7.1
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
启动环境变量
1. source /etc/profile
总结配置文件
|
配置文件 |
核心作用 |
你配置的关键内容 |
常见报错影响 |
|
hadoop-env.sh & yarn-env.sh |
配置 Hadoop/YARN 环境变量(核心指定 JDK 路径) |
export JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_451(原配置多 1 个/,需修正) |
JDK 路径错误 / 不存在时,启动报JAVA_HOME is not set,进程启动失败 |
|
core-site.xml |
Hadoop 核心配置(文件系统入口、临时目录、高可用依赖) |
1. fs.defaultFS=hdfs://ns(HDFS 入口)2. ha.zookeeper.quorum=master:2181,slave1:2181,slave2:2181(ZK 集群地址)3. hadoop.tmp.dir=/usr/local/src/hadoop2.7/hadoop2.7.1/metadata(临时文件路径) |
1. 与 hdfs-site.xml 的 nameservice 不一致,报Invalid configuration;2. ZK 地址错误 / 未启动,报Connection refused to ZooKeeper;3. 临时目录无权限 / 不存在,报Permission denied或No such file or directory |
|
hdfs-site.xml |
HDFS 核心配置(副本数、高可用节点、数据存储路径) |
1. dfs.replication=2(副本数)2. dfs.nameservices=ns(命名服务,与 core-site.xml 对应)3. 2 个 NameNode(nn1=master,nn2=slave1)4. JournalNode 共享日志路径 + 本地存储路径(namenode/datanode/journalnode) |
1. nameservice 与 core-site.xml 不一致,报Unknown nameservice 'ns';2. 存储路径无权限 / 不存在,报Cannot create directory;3. JournalNode 地址错误,报Could not initialize shared edits dir;4. 副本数 > DataNode 数量,报Not enough datanodes available |
|
mapred-site.xml |
MapReduce 配置(指定调度框架、JobHistory 地址) |
1. mapreduce.framework.name=yarn(YARN 调度)2. mapreduce.jobhistory.address=node0:10020(RPC 地址)3. mapreduce.jobhistory.webapp.address=node0:19888(Web 地址) |
1. 调度框架非 yarn,报No such framework: xxx;2. JobHistory 地址错误,报Connection refused to JobHistory Server |
|
yarn-site.xml |
YARN 资源管理配置(NodeManager 服务、ResourceManager 地址、日志聚合) |
1. yarn.nodemanager.aux-services=mapreduce_shuffle(Shuffle 服务)2. yarn.resourcemanager.hostname=node0(RM 地址)3. yarn.log-aggregation-enable=true(开启日志聚合) |
1. 未配置 mapreduce_shuffle,报Shuffle error;2. RM 地址错误,报Could not connect to ResourceManager;3. 日志聚合配置错误,报Log aggregation failed |
|
slaves(workers) |
指定 Hadoop 集群从节点(DataNode、NodeManager 所在机器) |
错误格式:slave1@slave1、master@master、slave2@slave2(需修正为每行 1 个主机名,如 slave1) |
格式错误 / 主机名无法解析,启动时报Unknown host: slave1@slave1,从节点进程无法启动 |
11.启动hadoop集群
1.配置防脑裂:
1.进入hdfs-site.xml目录下添加(注意这里面的#的注释是需要消除的)
<!– 故障转移代理 –>
<property>
<name>dfs.client.failover.proxy.provider.ns</name> #注意这里的ns是之前我们在hdfs-site.xml的
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!– SSH fencing配置 权限移交 –>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/master/.ssh/id_rsa</value>
#注意这个地方的master在其他节点的时候需要改成slave1或者slave2
</property>
<!– 启用 HDFS 自动故障转移(ZKFC 必须依赖这个配置,之前漏了!) –>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
2.启动zookeerper和journalnode以及格式化
- 启动zookeeper (../../usr/local/src/tmp/zookeeper3.3.5/bin)
1.zkServer.sh start #这一步是三个虚拟机都进行运行(需要在zookeeper文件的bin目录下)
2.zkServer.sh status #这一步是上一步做完分别在各自节点运行
2. 停止zookeeper
3.zkServer.sh stop
- 启动journalnode 再hadoop的sbin目录下启动(usr/local/src/hadoop2.7/hadoop2.7.1/sbin)
1. hadoop–daemon.sh start journalnode
停止journalnode
1. hadoop–daemon.sh stop journalnode
- 格式化Hadoop(在主节点中)在hadoop的bin目录下
1. hdfs namenode –format
日志status 0 则成功
注意关于格式化:
格式化不需要经常启动,如果后期出现问题才可以进行启动,但是启动之后需要分发其他节点
格式化之后需要又一个操作就是同步
1. hdfs namenode –bootstrapStandby
查看报错日志:
在hadoop文件下logs目录下即/usr/local/src/hadoop2.7/hadoop2.7.1/logs
1. cat hadoop-<用户名>-journalnode-<主机名>.log
2. tail –500 hadoop–master–namenode–master.log # 表示查看后300行
3. cat hadoop-<用户名>-journalnode-<主机名>.log |grep FATAL #类似于文档中的查找功能
注意在朝错误的时候应该关注有FATAL文字提示的地方,哪里会有报错提示
tree查看
1.这个命令必须在root用户下进行下载
1. yum install tree
# 你的元数据目录(显式配置在 hdfs-site.xml 中)
1. tree /usr/local/src/hadoop2.7/hadoop2.7.1/data/namenode/
格式化成功
data/namenode/
└── current
├── fsimage_0000000000000000000 # 元数据镜像文件
├── fsimage_0000000000000000000.md5 # 校验文件
├── seen_txid # 记录最新事务ID
└── VERSION # 集群版本/ID信息
3.启动ZKFC
主节点(master)的 bin 目录执行
cd /usr/local/src/hadoop2.7/hadoop2.7.1/bin
./hdfs zkfc –formatZK
4.启动守护进程:再sbin目录
cd /usr/local/src/hadoop2.7/hadoop2.7.1/sbin
start–dfs.sh
stop–dfs.sh #停止启动守护进程
启动之后的jps日志
[master@master hadoop]$ jps
3911 JournalNode
4187 NameNode
5467 Jps
4316 DataNode
3373 QuorumPeerMain
5.启动yarn在sbin目录下
start-yarn.sh
启动成功的日志:
[master@master sbin]$ start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /usr/local/src/hadoop2.7/hadoop2.7.1/logs/yarn-master-resourcemanager-master.out
slave2: starting nodemanager, logging to /usr/local/src/hadoop2.7/hadoop2.7.1/logs/yarn-slave2-nodemanager-slave2.out
slave1: starting nodemanager, logging to /usr/local/src/hadoop2.7/hadoop2.7.1/logs/yarn-slave1-nodemanager-slave1.out
master: starting nodemanager, logging to /usr/local/src/hadoop2.7/hadoop2.7.1/logs/yarn-master-nodemanager-master.out
start–all.sh命令相当于都执行了start–dfs.sh、start–yarn.sh
6.启动成功的日志-jps
启动成功之后,master节点的jps
[master@master ~]$ jps
2593 JournalNode
4021 NodeManager
3399 DataNode
3880 ResourceManager
4616 Jps
3753 DFSZKFailoverController
3277 NameNode
2479 QuorumPeerMain
slave1和slave2的日志:
[slave1@slave1 ~]$ jps
2624 JournalNode
3302 NodeManager
3208 DFSZKFailoverController
3897 Jps
2490 QuorumPeerMain
3053 DataNode
[slave2@slave2 ~]$ jps
2593 JournalNode
3057 NodeManager
2483 QuorumPeerMain
2900 DataNode
3240 Jps
启动命令总结
1.
|
命令 |
执行位置 |
说明 |
|
|
start-dfs.sh |
只在主节点 |
会自动通过 SSH 启动所有节点的 HDFS 服务 |
|
|
start-yarn.sh |
只在主节点 |
会自动通过 SSH 启动所有节点的 YARN 服务 |
|
|
start-all.sh |
只在主节点 |
会自动启动所有节点的所有服务stop-all.sh |
|
|
jps |
所有节点 |
需要在每个节点单独执行来检查进程 |
|
|
命令用途 |
核心命令 |
执行目录 |
执行节点 |
|
启动 ZK |
./zkServer.sh start |
ZK 的 bin 目录 |
所有节点 |
|
启动 JournalNode |
./hadoop-daemon.sh start journalnode |
Hadoop 的 sbin 目录 |
所有节点 |
|
HDFS 格式化(首次) |
./hdfs namenode -format |
Hadoop 的 bin 目录 |
master |
|
ZKFC 格式化(首次) |
./hdfs zkfc -formatZK |
Hadoop 的 bin 目录 |
master |
|
启动 HDFS |
./start-dfs.sh |
Hadoop 的 sbin 目录 |
master |
|
启动 YARN |
./start-yarn.sh |
Hadoop 的 sbin 目录 |
master |
启动步骤总结
|
步骤顺序 |
操作名称 |
执行节点 |
执行目录(绝对路径) |
核心命令 |
关键说明 |
|
1 |
停止所有残留进程(清空环境) |
所有节点(master/slave1/slave2) |
参考「停止流程」表格 |
确保旧进程不干扰,必须执行 |
|
|
2 |
启动 ZooKeeper 集群 |
所有节点 |
cd /usr/local/src/tmp/zookeeper3.3.5/bin |
./zkServer.sh start |
启动后执行 ./zkServer.sh status,确保 1 个 leader、2 个 follower |
|
3 |
启动 JournalNode 集群 |
所有节点 |
cd /usr/local/src/hadoop2.7/hadoop2.7.1/sbin |
./hadoop-daemon.sh start journalnode |
所有节点必须启动,否则 HDFS 无法同步元数据 |
|
4 |
HDFS 首次格式化(仅 1 次) |
master 节点(主节点) |
/usr/local/src/hadoop2.7/hadoop2.7.1/bin |
./hdfs namenode -format |
日志显示 status 0 为成功,生成 data/namenode/current 目录 |
|
5 |
ZKFC 格式化(仅 1 次) |
master 节点(主节点) |
/usr/local/src/hadoop2.7/hadoop2.7.1/bin |
./hdfs zkfc -formatZK |
向 ZK 注册 HA 元数据,成功提示 Successfully created /hadoop-ha/ns |
|
6 |
启动 HDFS 集群 |
master 节点(主节点) |
/usr/local/src/hadoop2.7/hadoop2.7.1/sbin |
./start-dfs.sh |
自动启动 NameNode、ZKFC、DataNode,无需手动启动单个进程 |
|
7 |
启动 YARN 集群 |
master 节点(主节点) |
/usr/local/src/hadoop2.7/hadoop2.7.1/sbin |
./start-yarn.sh |
自动启动 ResourceManager(master)、NodeManager(所有节点) |
|
8 |
验证启动成功 |
所有节点 |
– |
jps |
查看进程是否符合「成功标准」表格 |
停止步骤总结
|
操作名称 |
执行节点 |
执行目录(绝对路径) |
核心命令 |
说明 |
|
停止 YARN 集群 |
master 节点(主节点) |
/usr/local/src/hadoop2.7/hadoop2.7.1/sbin |
./stop-yarn.sh |
先停计算服务,避免任务冲突 |
|
停止 HDFS 集群 |
master 节点(主节点) |
/usr/local/src/hadoop2.7/hadoop2.7.1/sbin |
./stop-dfs.sh |
再停存储服务,自动停止 NN、DN、ZKFC、JN |
|
停止 ZooKeeper 集群 |
所有节点 |
/usr/local/src/tmp/zookeeper3.3.5/bin |
./zkServer.sh stop |
独立停止 ZK,stop-dfs.sh 不会处理 |
|
验证停止干净 |
所有节点 |
– |
jps |
无 NN、DN、JN、ZKFC、QuorumPeerMain、RM、NM 进程 |
地址:
http://192.168.183.130:50070
http://192.168.183.130:8088
报错总结
1.http://192.168.183.130:50070运行之后全部都是0的状态
之前的图片没了,先暂时用这个作为全0的报错(假设图中全部都是0的状态)

原因:
因为格式化操作之后datanode的uID和namenode的uID不一致
如何一致?
查看网页中的Cluster ID,并且复制这个ID,进入到存放datanode的位置修改文件crrent
我的具体路径:/usr/local/src/hadoop2.7/hadoop2.7.1/data/datanode/current
进入这个crrent文件后执行vim VERSION,然后修改文件中的Cluster ID为网页中的Cluster ID,以防万一可以也查看一下namenode的current文件下的VERSION
注意:修改之后要将文件再分发到slave1和slave2节点
2. 网页中的Live nodes存活节点只出现一个
2.1 检查日志的报错:
检查的日志主要是:
hadoop-master-namenode-master.log
hadoop-master-datanode-master.log
hadoop-slave1-datanode-slave1.log
hadoop-slave1-namenode-slave1.log
hadoop-slave2-datanode-slave2.log
adoop-slave2-namenode-slave2.log
[master@master logs]$ cat hadoop-master-namenode-master.log |grep ERROR
2025-11-28 10:14:16,792 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: RECEIVED SIGNAL 15: SIGTERM
[master@master logs]$ cat hadoop-master-datanode-master.log |grep ERROR
2025-11-26 10:43:27,861 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to master/192.168.183.130:8020 All specified directories are failed to load.
2025-11-26 10:50:29,878 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to master/192.168.183.130:8020 All specified directories are failed to load.
2025-11-26 10:50:34,909 ERROR org.apache.hadoop.hdfs.server.datanode.Data
28 08:12:27,007 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to master/192.168.183.130:8020 All specified directories are failed to load.
2025-11-28 08:12:34,545 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: RECEIVED SIGNAL 15: SIGTERM
[slave1@slave1 logs]$ cat hadoop-slave1-datanode-slave1.log |grep ERROR
2025-11-28 10:14:00,130 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: RECEIVED SIGNAL 15: SIGTERM
[slave1@slave1 logs]$ cat hadoop-slave1-namenode-slave1.log |grep ERROR
2025-11-28 10:14:00,134 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: RECEIVED SIGNAL 15: SIGTERM
[slave2@slave2 logs]$ cat hadoop-slave2-datanode-slave2.log |grep ERROR
2025-11-28 10:14:21,763 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: RECEIVED SIGNAL 15: SIGTERM
[slave2@slave2 logs]$ cat hadoop-slave2-namenode-slave2.log |grep ERROR
cat: hadoop-slave2-namenode-slave2.log: No such file or directory
|
报错内容 |
报错类型 |
核心含义 |
关联节点 |
严重程度 |
|
Initialization failed for Block pool <registering> service to master/192.168.183.130:8020 All specified directories are failed to load. |
DataNode 初始化 |
DataNode 启动时,配置的存储数据块的目录(dfs.datanode.data.dir)加载失败,原因包括:1. 目录不存在;2. 目录权限不足(非 Hadoop 运行用户所属);3. 目录所在磁盘满;4. 配置路径写错;5. DataNode UUID 与 NameNode 不一致 |
master 节点 |
高(导致 DataNode 无法启动) |
|
RECEIVED SIGNAL 15: SIGTERM(NameNode/DataNode 均出现) |
进程终止信号 |
进程收到SIGTERM终止信号,属于 “结果型错误”,触发原因:1. 手动执行stop-dfs.sh停止 Hadoop;2. 进程因初始化失败被系统自动终止;3. 系统资源不足(内存 / CPU)被操作系统杀掉 |
master、slave1、slave2 |
中(是其他错误的衍生结果) |
|
cat: hadoop-slave2-namenode-slave2.log: No such file or directory |
日志文件不存在 |
slave2 节点未运行 NameNode 进程(Hadoop 集群中 NameNode 仅部署在 master 节点),因此无该日志文件 |
slave2 节点 |
无(正常现象,无需处理) |
2.2 核心问题定位
Live nodes 存活节点少的根因是:master 节点 DataNode 初始化失败(存储目录加载异常),slave1/slave2 节点的 DataNode/NameNode 因进程终止信号(SIGTERM)未正常运行,最终仅单个节点存活。
2.3 分阶段解决步骤
阶段 1:基础环境排查(SSH / 进程 / 端口)
- 检查 SSH 互通性:确认 master 与 slave1/slave2 节点 SSH 免密登录正常(未明确具体命令,核心是验证节点间无密码访问);
- 端口 / 进程占用排查
- ps -ef | grep 端口号/进程名(如 8020 端口、hadoop 进程),排查端口被占用 / 进程残留问题;
- kill -9 进程ID 强制杀死;
- rm -rf *.out*,清理无效日志避免资源占用;
- 权限批量赋权
- Hadoop 安装目录全量赋权,解决目录 / 文件权限不足问题:
- -R 777 /usr/local/src/hadoop2.7/hadoop2.7.1/
阶段 2:HDFS 配置文件修改(hdfs-site.xml)
- 修改 master 节点配置文件
- / 调整以下配置:
- 配置超级用户组,解决权限映射问题 –>
<property>
<name>dfs.permissions.superusergroup</name>
<value>supergroup</value>
</property>
<property>
<name>hadoop.security.group.mapping</name>
<value>org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback</value>
</property>
<!– 跳过ACL权限检查,简化权限管控 –>
<property>
<name>dfs.namenode.acls.enabled</name>
<value>false</value>
</property>
- 同步配置到从节点
- slave1(slave2 同理):
scp /usr/local/src/hadoop2.7/hadoop2.7.1/etc/hadoop/hdfs–site.xml slave1@slave1:/usr/local/src/hadoop2.7/hadoop2.7.1/etc/hadoop/
阶段 3:DataNode 目录 / UUID 问题修复
清理 DataNode 残留的 UUID 文件(解决目录加载失败、UUID 不一致问题):
- 删除 master 节点 DataNode 目录下的current/VERSION文件(路径为data/datanode/current/VERSION,需替换为实际 DataNode 存储目录);
- 若 slave 节点也有类似目录加载问题,同步执行该操作。
2.4 补充说明
- slave2 节点无hadoop-slave2-namenode-slave2.log为正常现象(NameNode 仅部署在 master 节点),无需处理;
- 所有操作完成后,需重启 Hadoop 集群(stop-all.sh → start-all.sh),验证 Live nodes 数量是否恢复正常;
- SIGTERM 信号错误是 “衍生问题”,解决 DataNode 初始化、权限、配置问题后会自动消失。