Hadoop集群搭建

Hadoop集群搭建

这篇文章详细记录了如何在三台CentOS7服务器上搭建一个稳定运行的Hadoop集群。

首先,从环境准备开始,作者列举了完成集群部署所需的基础配置,包括关闭防火墙、配置免密登录、时钟同步以及安装JDK环境等操作,确保每台服务器都满足集群运行的条件。

接着,根据集群角色分配规则,作者对Hadoop的核心配置文件进行了详细的修改,包括core-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml。通过这些配置,实现了对集群内各节点的分工,如NameNode、ResourceManager以及DataNode和NodeManager等。

之后,文章介绍了Hadoop安装包的分发以及环境变量的配置,并说明了启动集群时需要进行的第一次格式化hdfs操作。随后,提供了具体的启动步骤,并引导用户通过Java进程检查和Web管理页面验证集群是否正常运行。

最后,文章还对常见问题进行了分析,如NameNode未启动的故障处理,结合日志排查进行了详细的指导,为集群问题提供了解决思路。无论是搭建、管理还是故障排查,本篇文章都提供了完整的流程与实用性技巧,是一份极其重要的参考文档。

环境要求

需要有三台 Centos7 服务器,并都需要完成下面的配置要求:

  • 关闭防火墙
  • 新建普通用户me
  • 阿里云时钟同步服务器
  • 配置免密登陆
  • 关闭selinux
  • 配置xsyncxcall同步脚本
  • 配置jdk8环境
  • 确保端口8020,50090,50070,10020,19888,8088端口没有被占用

环境准备可以参考我下面的博文:

centos防火墙常用命令

centos新建普通用户

centos系统时间同步

centos配置免密登录

centos关闭SElinux

centos配置xsync和xcall同步脚本

centos安装jdk8

集群规则

说明:

  1. 除特别说明外,本文的所有操作均在master节点、使用me这个非root用户执行
  2. 命令中出现的IP域名,均需要替换为自己集群中的IP域名【必须】
  3. 命令中出现的/home/lbs/software路径,可选择替换为自定义路径【可选】
服务器 IP域名 master node1 node2
HDFS NameNode
HDFS SecondaryNameNode
HDFS DataNode DataNode DataNode
YARN ResourceManager
YARN NodeManager NodeManager NodeManager
历史日志服务器 JobHistoryServer

安装集群

  1. 从百度云下载资源包hadoop-2.6.0-cdh5.14.2_after_compile.tar.gz,并上传到master服务器

    1
    https://pan.baidu.com/s/1nSUqi50p5u0skUAn4A-i-A?pwd=z8d7
  2. 解压hadoop-2.6.0-cdh5.14.2_after_compile.tar.gz到指定安装路径,并重命名目录为hadoop

    1
    2
    tar -zxvf hadoop-2.6.0-cdh5.14.2_after_compile.tar.gz -C /home/lbs/software
    mv /home/lbs/software/hadoop-2.6.0-cdh5.14.2 /home/lbs/software/hadoop
  3. 进入到/home/lbs/software/hadoop目录,执行下面命令检查环境配置是否符合要求

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [me@master hadoop]$ ./bin/hadoop checknative

    24/04/15 17:09:57 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
    24/04/15 17:09:57 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
    Native library checking:
    hadoop: true /home/lbs/software/hadoop/lib/native/libhadoop.so.1.0.0
    zlib: true /lib64/libz.so.1
    snappy: true /lib64/libsnappy.so.1
    lz4: true revision:10301
    bzip2: true /lib64/libbz2.so.1
    openssl: true /lib64/libcrypto.so

    如果有false项,则需要使用yum进行安装,直到全部为true

  4. 配置hadoop-env.sh文件

    1
    2
    3
    4
    5
    vim /home/lbs/software/hadoop/etc/hadoop/hadoop-env.sh

    # 注释掉之前的内容,新增实际的jdk路径
    # export JAVA_HOME=${JAVA_HOME}
    export JAVA_HOME=/app/jdk
  5. 配置core-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    echo '<?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:8020</value>
    </property>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/lbs/software/hadoop/hadoopDatas/tempDatas</value>
    </property>
    <!-- 缓冲区大小,实际工作中根据服务器性能动态调整 -->
    <property>
    <name>io.file.buffer.size</name>
    <value>4096</value>
    </property>
    <!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
    <property>
    <name>fs.trash.interval</name>
    <value>10080</value>
    </property>
    </configuration>' > /home/lbs/software/hadoop/etc/hadoop/core-site.xml
  6. 配置hdfs-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    echo '<?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <!-- NameNode存储元数据信息的路径,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割 -->
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>master:50090</value>
    </property>
    <property>
    <name>dfs.namenode.http-address</name>
    <value>master:50070</value>
    </property>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///home/lbs/software/hadoop/hadoopDatas/namenodeDatas</value>
    </property>
    <!-- 定义dataNode数据存储的节点位置,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割 -->
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///home/lbs/software/hadoop/hadoopDatas/datanodeDatas</value>
    </property>
    <property>
    <name>dfs.namenode.edits.dir</name>
    <value>file:///home/lbs/software/hadoop/hadoopDatas/dfs/nn/edits</value>
    </property>
    <property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>file:///home/lbs/software/hadoop/hadoopDatas/dfs/snn/name</value>
    </property>
    <property>
    <name>dfs.namenode.checkpoint.edits.dir</name>
    <value>file:///home/lbs/software/hadoop/hadoopDatas/dfs/nn/snn/edits</value>
    </property>
    <property>
    <name>dfs.replication</name>
    <value>3</value>
    </property>
    <property>
    <name>dfs.permissions</name>
    <value>false</value>
    </property>
    <property>
    <name>dfs.blocksize</name>
    <value>134217728</value>
    </property>
    <!--hdfs web端ui取消ip限制-->
    <property>
    <name>dfs.namenode.http-address</name>
    <value>0.0.0.0:50070</value>
    </property>
    </configuration>' > /home/lbs/software/hadoop/etc/hadoop/hdfs-site.xml
  7. 配置mapred-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    echo '<?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    <property>
    <name>mapreduce.job.ubertask.enable</name>
    <value>true</value>
    </property>
    <property>
    <name>mapreduce.jobhistory.address</name>
    <value>master:10020</value>
    </property>
    <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>0.0.0.0:19888</value>
    </property>
    </configuration>' > /home/lbs/software/hadoop/etc/hadoop/mapred-site.xml
  8. 配置yarn-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?xml version="1.0"?>
    <configuration>
    <!-- 节点管理器可用的 CPU 核心总数 -->
    <property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>12</value>
    </property>

    <!-- 调度器可以分配给一个容器的最大 vcore 数 -->
    <property>
    <name>yarn.scheduler.maximum-allocation-vcores</name>
    <value>4</value>
    </property>

    <!-- 调度器可以分配给一个容器的最小 vcore 数 -->
    <property>
    <name>yarn.scheduler.minimum-allocation-vcores</name>
    <value>1</value>
    </property>

    <!-- 节点管理器可用的内存总量(MB) -->
    <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>34000</value>
    </property>

    <!-- 调度器可以分配给一个容器的最大内存量(MB) -->
    <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>34000</value>
    </property>

    <!-- 调度器可以分配给一个容器的最小内存量(MB) -->
    <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1024</value>
    </property>

    <!-- 资源管理器的主机名 -->
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>one</value>
    </property>

    <!-- 节点管理器的辅助服务(例如 MapReduce Shuffle) -->
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>

    <!-- 资源管理器 Web 界面的访问地址 -->
    <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>0.0.0.0:8088</value>
    </property>
    </configuration>
  9. 配置slaves

    1
    2
    3
    echo 'master
    node1
    node2' > /home/lbs/software/hadoop/etc/hadoop/slaves
  10. 创建所需目录

    1
    2
    3
    4
    5
    6
    mkdir -p /home/lbs/software/hadoop/hadoopDatas/tempDatas
    mkdir -p /home/lbs/software/hadoop/hadoopDatas/namenodeDatas
    mkdir -p /home/lbs/software/hadoop/hadoopDatas/datanodeDatas
    mkdir -p /home/lbs/software/hadoop/hadoopDatas/dfs/nn/edits
    mkdir -p /home/lbs/software/hadoop/hadoopDatas/dfs/snn/name
    mkdir -p /home/lbs/software/hadoop/hadoopDatas/dfs/nn/snn/edits
  11. 分发/home/lbs/software/hadoop文件夹到集群中的其他两台机器

    1
    xsync /home/lbs/software/hadoop
  12. 分别登录到集群中三台机器,都配置hadoop到环境变量中

    1
    2
    3
    4
    5
    6
    7
    sudo vim /etc/profile
    # Hadoop
    export HADOOP_HOME=/home/lbs/software/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

    # 最后重新加载环境变量
    source /etc/profile

启动集群

  1. 首先格式化hdfs(仅第一次启动时需要!后续启动请勿重复执行)

    1
    hdfs namenode -format

    image.png

  2. 依次启动hdfsyarnhistoryserver

    注意:下面的三条命令逐一执行,而不是一下全部执行

    1
    2
    3
    start-dfs.sh 
    start-yarn.sh
    mr-jobhistory-daemon.sh start historyserver

    image.png

集群验证

  1. 首先验证各节点Java进程情况

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    [me@master bin]$ xcall jps
    ================current host is master=================
    --> execute command "jps"
    25985 JobHistoryServer
    24419 DataNode
    26261 Jps
    24219 NameNode
    25292 ResourceManager
    25437 NodeManager
    24750 SecondaryNameNode
    Command executed successfully on master
    ================current host is node1=================
    --> execute command "jps"
    3545 DataNode
    3690 NodeManager
    3948 Jps
    Command executed successfully on node1
    ================current host is node2=================
    --> execute command "jps"
    3609 DataNode
    3754 NodeManager
    4013 Jps
    Command executed successfully on node2
    All commands executed successfully!

    如果发现namenode进程没有出现,可以到文章最后查看解决方法

  2. 查看web管理页面

    | 名称 | 地址 |
    | — | — |
    | hdfs | http://master:50070 |
    | yarn | http://master:8088 |
    | jobHistory | http://master:19888 |

关闭集群

关闭服务器之前最好提前手动关闭hadoop集群,防止出现集群异常的情况

1
2
3
mr-jobhistory-daemon.sh stop historyserver
stop-yarn.sh
stop-dfs.sh

问题解决

启动集群后发现namenode进程没有启动,怎么办?

  1. 首先停止集群
    1
    2
    3
    mr-jobhistory-daemon.sh stop historyserver
    stop-yarn.sh
    stop-dfs.sh
  2. 清理配置在core-site.xml<name>hadoop.tmp.dir</name>配置项所指向的目录下的所有内容(不需要删除目录本身,只需要删除下面的内容即可)
  3. 重新执行初始化hdfs的命令hadoop namenode -format
  4. 最后再次启动hadoop集群
    1
    2
    3
    start-dfs.sh 
    start-yarn.sh
    mr-jobhistory-daemon.sh start historyserver
  5. 如果还是没有解决问题,需要进入到hadoop根目录的logs目录下,查看hadoop-admin-namenode-master.log日志。是否是端口被占用了,还是其他问题。
作者

李博帅

发布于

2023-10-10

更新于

2025-04-13

许可协议