欢迎光临
我们一直在努力

CentOS 7环境下Hadoop高可用(HA)集群部署完全指南

虚拟机版本:centos7

Hadoop的安装与配置:

1.设置静态IP

1.1进入虚拟机终端

方法一:

1. cd /etc/sysconfig/networkscripts –> vi ifcfgens33

方法二:

1. vi /etc/sysconfig/networkscripts/ifcfgens33

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端口ip192.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/CentOSBase.repo /etc/yum.repos.d/CentOSBase.repo.backup

    2.下载阿里云 CentOS 7 镜像源配置文件

    1. sudo wget O /etc/yum.repos.d/CentOSBase.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 settimezone 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/CentOSBase.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. sshcopyid i ~/.ssh/id_rsa.pub slave2@slave2

    slave2@slave2:这里的第一个slave2表示是slave2这个用户,第二个表示虚拟机

    密钥文件说明

    authorized_keys: 用户认证的公钥文件

    known_hosts: 已知主机IP映射文件

    免密登录配置

    复制公钥到远程主机:

    1. sshcopyid ~/.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. sshcopyid 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 jdk8u451linuxx64.tar.gz master@192.168.183.130:/usr/local/src/jdk

    2.在master解压jdk压缩包

    进入目录/usr/local/src/jdk

    1. tar zxvf jdk8u451linuxx64.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 hadoop2.7.1.tar.gz master@192.168.183.130:/usr/local/src/hadoop2.7/

    1. scp .\\zookpeer\\zookeeper3.3.5.tar.gz master@192.168.183.130:/usr/local/src/tmp/

    2.解压压缩包:

    tar -zxvf +压缩包 +-C(指定目标路径) tar –help可以查找这个命令的用法

    1. tar zxvf zookeeper3.3.5.tar.gz c /usr/local/src/tmp/ 2. tar zxvf hadoop2.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 hadoopenv.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 coresite.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 hdfssite.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 mapredsite.xml.template或者 mapredsite.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 yarnsite.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(或者其他slave1slave2))下才能运行成功命令

    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. hadoopdaemon.sh start journalnode

    停止journalnode

    1. hadoopdaemon.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 hadoopmasternamenodemaster.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

    startdfs.sh stopdfs.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

    startall.sh命令相当于都执行了startdfs.shstartyarn.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/hdfssite.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 初始化、权限、配置问题后会自动消失。
  • 赞(0)
    未经允许不得转载:171主机测评 » CentOS 7环境下Hadoop高可用(HA)集群部署完全指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址