Hadoop集群安装 3.1.3

1.前提准备

2.集群规划

节点 角色
node1 NameNode,JournalNode,DFSZKFailoverController,DataNode,ResourceManager,NodeManager
node2 NameNode,JournalNode,DFSZKFailoverController,DataNode,ResourceManager,NodeManager
node3 NameNode,JournalNode,DFSZKFailoverController,DataNode,ResourceManager,NodeManager

接下来配置以三台服务器组成Hadoop高可用集群,目前是一个比较紧凑的集群,每个节点上都存在所有的角色,实际生产环境中管理节点和工作节点角色应尽量分离,管理节点在小型集群(几十台以内)中有3台即可, 大型集群配置5台管理节点。

3.安装配置

当前Hadoop环境的安装目录定为:/opt/hadoop-3.1.3,数据目录定为:/data/hadoop,3个节点均已经安装ZooKeeper服务。

然后进行安装:

  1. 解压文件夹

    tar zxvf hadoop-3.1.3.tar.gz -C /opt/
    # 进入配置文件所在目录
    cd /opt/hadoop-3.1.3/etc/hadoop
    
  2. 在配置文件目录下进行配置

    • 编辑hadoop-env.sh 配置文件,例如:vim hadoop-env.sh,添加变量如下:

      # 服务器jdk路径请自行确认
      export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64
      export HADOOP_HEAPSIZE_MAX="8192"
      export HADOOP_HEAPSIZE_MIN="4096"
      
    • 编辑core-site.xml配置文件,例如: vim core-site.xml ,配置内容如下:

      <?xml version="1.0" encoding="UTF-8"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      <configuration>
        <property>
          <name>fs.defaultFS</name>
          <value>hdfs://hdfscluster</value>
        </property>
        <!--临时文件路径-->
        <property>
          <name>hadoop.tmp.dir</name>
          <value>/data/hadoop/tmp</value>
        </property>
        <!-- 配置ZooKeeper集群地址 -->
        <property>
          <name>ha.zookeeper.quorum</name>
          <value>node1:2181,node2:2181,node3:2181</value>
        </property>
      </configuration>
      
    • 编辑hdfs-site.xml配置文件,例如: vim hdfs-site.xml,配置内容如下:

      此文件conf目录中没有, 需要新建

      <?xml version="1.0" encoding="UTF-8"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      <configuration>
        <property>
          <name>dfs.nameservices</name>
          <value>hdfscluster</value>
        </property>
        <!-- nn1,nn2,nn3名称可以自定义, 此处指定3台, 无需更改, 默认即可 -->
        <property>
          <name>dfs.ha.namenodes.hdfscluster</name>
          <value>nn1,nn2,nn3</value>
        </property>
         <!-- 端口不变, 修改作为namenode的3台主机的host或ip -->
        <property>
          <name>dfs.namenode.rpc-address.hdfscluster.nn1</name>
          <value>node1:8020</value>
        </property>
        <property>
          <name>dfs.namenode.rpc-address.hdfscluster.nn2</name>
          <value>node2:8020</value>
        </property>
        <property>
          <name>dfs.namenode.rpc-address.hdfscluster.nn3</name>
          <value>node3:8020</value>
        </property>
        <property>
          <name>dfs.namenode.http-address.hdfscluster.nn1</name>
          <value>node1:9870</value>
        </property>
        <property>
          <name>dfs.namenode.http-address.hdfscluster.nn2</name>
          <value>node2:9870</value>
        </property>
        <property>
          <name>dfs.namenode.http-address.hdfscluster.nn3</name>
          <value>node3:9870</value>
        </property>
        <!-- 副本数量 当前设置为: 2 --> 
        <property>
          <name>dfs.replication</name>
          <value>2</value>
        </property>
        <!-- qjournal文件管理, 修改host或ip-->
        <property>
          <name>dfs.namenode.shared.edits.dir</name>
          <value>qjournal://node1:8485;node2:8485;node3:8485/hdfs-ha</value>
        </property>
        <property>
          <name>dfs.client.failover.proxy.provider.hdfscluster</name>
          <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <property>
          <name>dfs.ha.fencing.methods</name>
          <value>
            sshfence
      	  shell(/bin/true)
          </value>
        </property>
        <property>
          <name>dfs.ha.fencing.ssh.private-key-files</name>
          <value>/root/.ssh/id_rsa</value>
        </property>
        <property>
          <name>dfs.journalnode.edits.dir</name>
          <value>/data/hadoop/dfs/journalnode</value>
        </property>
        <property>
          <name>dfs.ha.automatic-failover.enabled</name>
          <value>true</value>
        </property>
        <!-- 指定数据目录路径 -->
        <property>
          <name>dfs.namenode.name.dir</name>
          <value>file:///data/hadoop/dfs/name</value>
        </property>
        <!-- data目录可以配置多个, 用逗号分隔 -->
        <property>
          <name>dfs.datanode.data.dir</name>
          <value>file:///data/hadoop/dfs/data</value>
        </property>
        <property>
          <name>dfs.namenode.handler.count</name>
          <value>100</value>
        </property>
        <property>
          <name>dfs.datanode.handler.count</name>
          <value>100</value>
        </property>
      </configuration>
      
    • 编辑yarn-site.xml配置文件,例如: vim yarn-site.xml,配置内容如下:

      <configuration>
        <!--启用高可用-->
        <property>
          <name>yarn.resourcemanager.ha.enabled</name>
          <value>true</value>
          <description>是否开启resourcemanager高可用</description>
        </property>
        <property>
          <name>yarn.resourcemanager.cluster-id</name>
          <value>yarncluster</value>
          <description>标识集群的id, 以确保RM不会接替另一个群集的活动状态, 名称自定义</description>
        </property>
        <!-- resourcemanager的id, 此处指定3台, 名称自定义, 使用默认即可 -->
        <property>
          <name>yarn.resourcemanager.ha.rm-ids</name>
          <value>rm1,rm2,rm3</value>
          <description>集群管理节点id列表, id可以自定义 e.g. 节点1: rm1, 节点2: rm2, 节点3: rm3 ...,保证至少有2台管理节点即可</description>
        </property>
        <!-- 指定3台resourcemanager的host或ip -->
        <property>
          <name>yarn.resourcemanager.hostname.rm1</name>
          <value>node1</value>
          <description>节点1的真实服务器地址(hostname或ip), name中的rm1为节点1的id, 与节点id列表中的id一致</description>
        </property>
        <property>
          <name>yarn.resourcemanager.hostname.rm2</name>
          <value>node2</value>
          <description>节点2的真实服务器地址(hostname或ip), name中的rm2为节点2的id, 与节点id列表中的id一致</description>
        </property>
        <property>
          <name>yarn.resourcemanager.hostname.rm3</name>
          <value>node3</value>
          <description>节点3的真实服务器地址(hostname或ip), name中的rm2为节点2的id, 与节点id列表中的id一致</description>
        </property>
        <!-- 指定web端口 -->
        <property>
          <name>yarn.resourcemanager.webapp.address.rm1</name>
          <value>node1:8088</value>
        </property>
        <property>
          <name>yarn.resourcemanager.webapp.address.rm2</name>
          <value>node2:8088</value>
        </property>
        <property>
          <name>yarn.resourcemanager.webapp.address.rm3</name>
          <value>node3:8088</value>
        </property>
        <property>
           <name>yarn.resourcemanager.recovery.enabled</name>
           <value>true</value>
           <description>开启自动恢复</description>
         </property>
         <property>
           <name>yarn.resourcemanager.store.class</name>
           <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
           <description>指定存储状态信息到zookeeper的类</description>
         </property>
         <!--指定zookeeper服务地址-->
        <property>
          <name>yarn.resourcemanager.zk-address</name>
          <value>node1:2181,node2:2181,node3:2181</value>
          <description>zookeeper集群地址</description>
        </property>
        <property>
            <name>yarn.log-aggregation-enable</name>
            <value>true</value>
            <description>启用或禁用日志聚合, 默认关闭</description>
        </property>
        <property>
          <name>yarn.log-aggregation.retain-seconds</name>
          <value>2592000</value>
          <description>删除聚合日志前要保留多长时间 当前为30天, 默认-1, 即关闭删除功能</description>
        </property>
        <property>
          <name>yarn.log-aggregation.retain-check-interval-seconds</name>
          <value>86400</value>
          <description>检查间隔, 单位秒, 默认为聚合日志保留时间的十分之一</description>
        </property>
        <property>
          <name>yarn.nodemanager.remote-app-log-dir</name>
          <value>/tmp/logs</value>
          <description>聚合日志所在的hdfs路径</description>
        </property>
        <!-- 日志服务地址, 指定一台即可 -->
        <property>
          <name>yarn.log.server.url</name>
          <value>http://node1:19888/jobhistory/logs</value>
          <description>日志服务url,与mapred-site.xml中配置有关</description>
        </property>
        <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle,spark2_shuffle</value>
          <description>辅助服务</description>
        </property>
        <property>
          <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
          <value>org.apache.hadoop.mapred.ShuffleHandler</value>
          <description>指定mapreduce的shuffle类</description>
        </property>
        <property>
          <name>yarn.nodemanager.aux-services.spark2_shuffle.class</name>
          <value>org.apache.spark.network.yarn.YarnShuffleService</value>
          <description>指定spark的shuffle类</description>
        </property>
         <!-- 指定spark程序包所在位置, 启动yarn前, 保证spark已经解压到相应位置 -->
        <property>
          <name>yarn.nodemanager.aux-services.spark2_shuffle.classpath</name>
          <value>/opt/spark-2.4.8-bin-hadoop2.7/yarn/*</value>
          <description>指定spark的shuffle类路径, 以具体安装位置为准</description>
        </property>
        <!--资源分配, 请根据机器实际硬件配置, 推荐内存为单台实际内存的0.5-0.8, 核心为实际逻辑核心的数量 -->
      
        <property>
          <name>yarn.nodemanager.vmem-check-enabled</name>
          <value>false</value>
          <description>关闭虚拟内存检查</description>
        </property>
        <property>
          <name>yarn.nodemanager.resource.memory-mb</name>
          <value>131072</value>
          <description>单个节点能够分配的内存量, 结合集群实际内存进行调整, 单位mb</description>
        </property>
        <property>
          <name>yarn.nodemanager.resource.cpu-vcores</name>
          <value>32</value>
          <description>单个节点能够分配的核心, 结合集群实际总核心数进行调整, 默认为物理核心数 * 1</description>
        </property>
        <property>
          <name>yarn.scheduler.minimum-allocation-mb</name>
          <value>4096</value>
          <description>容器分配的最小内存, 单位mb</description>
        </property>
        <property>
          <name>yarn.scheduler.maximum-allocation-mb</name>
          <value>131072</value>
          <description>容器分配的最大内存, 此处设置为了单台机器能够分配最大内存, 单位mb</description>
        </property>
        <property>
          <name>yarn.scheduler.minimum-allocation-vcores</name>
          <value>1</value>
          <description>容器分配的最小vcore数</description>
        </property>
        <property>
          <name>yarn.scheduler.maximum-allocation-vcores</name>
          <value>32</value>
          <description>容器分配的最大vcore数, 此处设置为了单台机器能够分配的最多vcore数</description>
        </property>
      </configuration>
      
    • 编辑配置文件mapred-site.xml,例如vim mapred-site.xml,配置内容如下:

      <configuration>
         <!-- 历史日志服务地址要与yarn-site.xml中yarn.log.server.url为同一台服务器 -->
        <property>
          <name>mapreduce.jobhistory.address</name>
          <value>node1:10020</value>
        </property>
        <property>
          <name>mapreduce.jobhistory.webapp.address</name>
          <value>node1:19888</value>
        </property>
        <property>
          <name>mapreduce.framework.name</name>
          <value>yarn</value>
        </property>
        <property>
          <name>yarn.app.mapreduce.am.env</name>
          <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
        <property>
          <name>mapreduce.map.env</name>
          <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
        <property>
          <name>mapreduce.reduce.env</name>
          <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
        <property>
          <name>mapreduce.map.memory.mb</name>
          <value>4096</value>
        </property>
        <property>
          <name>mapreduce.reduce.memory.mb</name>
          <value>4096</value>
        </property>
      </configuration>
      
    • 编辑workers配置文件,例如:vim workers,添加节点如下:

      node1
      node2
      node3
      
  3. 启动命令添加用户

    切换至sbin目录:cd /opt/hadoop-3.1.3/sbin

    • 分别编辑:start-dfs.sh、stop-dfs.sh
    # 在启动脚本头部添加以下信息
    HDFS_DATANODE_USER=root
    HDFS_DATANODE_SECURE_USER=hdfs
    HDFS_NAMENODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    HDFS_JOURNALNODE_USER=root
    HDFS_ZKFC_USER=root
    
    • 分别编辑:start-yarn.sh、stop-yarn.sh
    # 在启动脚本头部添加以下信息
    YARN_RESOURCEMANAGER_USER=root
    YARN_NODEMANAGER_USER=root
    
  4. 分发到其他节点

    scp -r hadoop-3.1.3 node2:$PWD

    scp -r hadoop-3.1.3 node2:$PWD

4.启动服务

添加环境变量 vim /etc/profile

#HADOOP
export HADOOP_HOME=/opt/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

namenode初始化

  1. 所有节点启动journalnode hdfs --daemon start journalnode

  2. 选择一台机器(例如node1)初始化 hdfs zkfc -formatZK hdfs namenode -format

    hdfs --daemon start namenode

  3. 其他两台机器执行命令同步 hdfs namenode -bootstrapStandby

启动集群

start-all.sh

查看状态

  1. jps查看进程

    image-20220623172003192

  2. web访问 http://node1:9870, http://node2:9870, http://node3:9870, 查看hdfs状态

    保证有一台机器处在active状态, 其他两台机器处在standby状态

image-20220623172053864

image-20220623172104678

  1. 通过webui: http://node1:8088查看yarn状态

image-20220623172128786

停止集群使用: stop-all.sh