zoukankan      html  css  js  c++  java
  • hadoop 高可用联邦模式集群搭建

    一、环境准备与系统优化

    1.1、hadoop组件介绍

    (1) hdfs

    组件 作用
    NameNode 负责管理hdfs文件系统,集群中分主从节点
    bootstrapStandby 从节点复制主节点的元数据目录
    DataNode 主要是用来存储数据文件
    JournalNode 两个NameNode为了数据同步的相互通信的独立进程
    DFSZKFailoverController 负责整体的故障转移控制

    (2) yarn

    组件 作用
    ResourceManager Yarn的资源管理器
    NodeManager 管理Hadoop集群中单个计算节点
    JobHistoryServer 实现web查看作业的历史运行情况

    1.2、主机规划

    系统:Centos7.3

    IP 主机名 角色描述 集群
    192.168.189.17 nn1-bdp1 namenode-bdp1,zkfs,zookeeper1,resourcemanager bdp1
    192.168.189.27 nn2-bdp1 namenode-bdp1,zkfs,zookeeper2,resourcemanager,journalnode bdp1
    192.168.189.37 nn3-bdp2 namenode-bdp2,zkfs,zookeeper3,journalnode bdp2
    192.168.189.47 nn4-bdp2 namenode-bdp2,zkfs,journalnode bdp2
    192.168.189.57 dn1 datanode1,nodemanager
    192.168.189.67 dn2 datanode2,nodemanager
    • zkfc 是 Zookeeper FailoverController 的简称,主要用于实现两个namenode之间的容灾;
    • resourcemanager 是 yarn 中负责资源协调和管理的进程;
    • nodemanager 是 yarn 中单个节点上的代理进程,向 resourcemanager 汇报信息,监控该节点资源;
    • datanode 是 hdfs 的工作节点,负责实际的数据存储和任务计算;
    • journalnode 是分布式日志管理模式下两个 namenode 节点同步数据的进程,每个HA集群里面的高可用依赖它。

    1.3、系统参数优化

    1.3.1、避免使用 swap 分区

    ​ 将 hadoop 守护进程的数据交换到磁盘的行为可能会导致操作超时,可以通过修改 linux 内核参数,降低这个概率,但是不能避免。设置 swappiness=0 的时候表示最大限度使用物理内存。

    #/etc/sysctl.conf 中添加
    vm.swappiness=0
    
    #使参数生效
    sysctl -p
    

    1.3.2、调整内存分配策略

    ​ 操作系统内核根据 vm.overcommit_memory 的值来决定分配策略,并通过 vm.overcommit_ratio 的值来设定超过物理内存的比例,建议将 vm.overcommit_memory 参数设置为2,适当修改 vm.overcommit_ratio 参数。

    #/etc/sysctl.conf 中添加
    vm.overcommit_memory=2
    vm.overcommit_ratio=50
    
    #使参数生效
    sysctl -p
    

    1.3.3、修改 net.core.somaxconn 参数

    ​ 该参数表示 socket 监听 backlog 的上限,默认为128,建议大于等于32768,socket 服务器会一次性处理 backlog 中的所有请求,hadoop 的 ipc.server.listen.queue.size 参数和 linux 的 net.core.somaxconn 参数控制了监听队列的长度,需要调大。

    #/etc/sysctl.conf 中添加
    net.core.somaxconn = 65535
    
    #使参数生效
    sysctl -p
    

    1.3.4、设置文件描述符的上限

    vim /etc/security/limits.conf
    #添加以下内容
    * soft nofile 524288
    * hard nofile 524288
    * soft nproc 524288
    * hard nproc 524288
    

    1.3.5、禁用文件的访问时间

    ​ 文件的访问时间可以让用户知道哪些文件近期被查看或修改,但对于hdfs来说,获取某个文件的某个块什么时候被访问没什么意义。所以可以将其禁用,修改 /etc/fstab 增加 noatime,nodirtime 选项,重新 remount 生效。

    vim /etc/fstab
    /dev/sdb1 /data                    xfs    rw,noatime,nodiratime        0 0
    

    1.3.6、关闭THP (Transparent Huge Pages)

    ​ THP是一个使用 Huge Pages 自动化的抽象层。它会引起 cpu 占用率增大,需要将其关闭。

    #临时关闭
    echo never >> /sys/kernel/mm/transparent_hugepage/enabled
    echo never >> /sys/kernel/mm/transparent_hugepage/defrag
    
    #永久关闭
    vim /etc/rc.d/rc.local
    ##添加以下内容
    if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    fi
    ##添加执行权限
    chmod +x /etc/rc.d/rc.local
    ##查看是否关闭
    [root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
    always madvise [never]
    [root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag 
    always madvise [never]
    

    1.3.7、关闭防火墙与SELinux

    #关闭防火墙
    systemctl stop firewalld.service
    systemctl disable firewalld.service
    
    #关闭SELinux
    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
    

    二、安装部署

    2.1、设置主机名和解析

    ​ 按照节点规划里的主机名,配置各个主机的主机名,并添加 /etc/hosts 解析。

    #以192.168.189.17节点为例
    hostnamectl set-hostname nn1-bdp1
    exec bash
    
    vim /etc/hosts
    192.168.189.17 nn1-bdp1
    192.168.189.27 nn2-bdp1
    192.168.189.37 nn3-bdp2
    192.168.189.47 nn4-bdp2
    192.168.189.57 dn1
    192.168.189.67 dn2
    

    2.2、创建用户

    ​ 每台主机都要执行。

    #添加组和用户
    groupadd hadoop
    useradd -G hadoop hdfs
    useradd -G hadoop yarn
    
    #配置密码
    echo 'hdfs2021' | passwd --stdin hdfs
    echo 'yarn2021' | passwd --stdin yarn
    

    2.3、配置免密码 ssh 登录

    ​ NameNode 主机之间配置 ssh 免密登录

    #切换到hdfs用户
    su - hdfs
    #生成密钥ssh-keygen#将公钥拷贝至其它节点
    ssh-copy-id -i ~/.ssh/id_rsa.pub hdfs@192.168.189.17
    ssh-copy-id -i ~/.ssh/id_rsa.pub hdfs@192.168.189.27
    ssh-copy-id -i ~/.ssh/id_rsa.pub hdfs@192.168.189.37
    ssh-copy-id -i ~/.ssh/id_rsa.pub hdfs@192.168.189.47
    ssh-copy-id -i ~/.ssh/id_rsa.pub hdfs@192.168.189.57
    ssh-copy-id -i ~/.ssh/id_rsa.pub hdfs@192.168.189.67
    

    2.4、安装 JDK

    ​ 每台主机都要安装。

    (1) 新建目录

    mkdir -pv /app && cd /app
    

    (2) 准备jdk包

    jdk-8u92-linux-x64.tar.gz
    

    (3) 解压

    tar -xf jdk-8u92-linux-x64.tar.gzln -s jdk1.8.0_92 jdk
    

    (4) 配置环境变量

    vim /etc/profile
    #添加以下内容
    export JAVA_HOME=/app/jdk
    export PATH=$JAVA_HOME/bin/:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPAT
    
    #使环境变量生效
    source /etc/profile
    

    (5) 验证java版本

    java -version
    

    2.5、部署 zookeeper 集群

    ​ 按照主机规划的配置,在三台主机上安装 zookeerper 集群。

    (1) 创建目录

    mkdir -pv /app && cd /app
    

    (2) 下载 zookeeper 安装包

    zookeeper-3.4.9.tar.gz
    

    (3) 解压

    tar -xf zookeeper-3.4.9.tar.gzln -s zookeeper-3.4.9 zookeeper
    

    (4) 修改配置文件

    cd /app/zookeeper
    mkdir {data,logs}
    cp conf/zoo_sample.cfg conf/zoo.cfg
    
    vim conf/zoo.cfg
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/app/zookeeper/data
    dataLogDir=/app/zookeeper/logs
    clientPort=2181
    server.1=192.168.189.17:2888:3888
    server.2=192.168.189.27:2888:3888
    server.3=192.168.189.37:2888:3888
    

    (5) 准备data/myid文件,三台机器的myid的值,分别对应zoo.cfg文件中的server.x的数字x

    #192.168.189.17
    echo 1 > /app/zookeeper/data/myid
    
    #192.168.189.27
    echo 2 > /app/zookeeper/data/myid
    
    #192.168.189.37
    echo 3 > /app/zookeeper/data/myid
    

    (6) 启动 zookeeper

    cd /app/zookeeper/bin
    #启动
    ./zkServer.sh start
    
    #查看状态
    ./zkServer.sh status
    

    2.6、部署 hadoop 集群

    2.6.1、安装 hadoop 包

    ​ 每台主机都需安装,可先安装一台,然后 scp 至其它主节,以 192.168189.17 主机为例。

    (1) 创建目录

    mkdir -pv /app  && cd /app
    

    (2) 下载 hadoop安装包

    hadoop-2.7.3.tar.gz
    

    (3) 解压

    tar -xf hadoop-2.7.3.tar.gz
    
    ln -s hadoop-2.7.3 hadoop
    

    (4) 创建目录并授权

    mkdir /{data,log}
    chown -R hdfs:hadoop /data
    chown -R hdfs:hadoop /log
    

    (5) 添加环境变量

    vim /etc/profile
    #在末尾添加
    export HADOOP_HOME=/app/hadoop
    export HADOOP_CONF_DIR=/app/hadoop/etc/hadoop
    export HADOOP_COMMON_HOME=${HADOOP_HOME}
    export HADOOP_MAPRED_HOME=${HADOOP_HOME}
    export HADOOP_HDFS_HOME=${HADOOP_HOME}
    export HADOOP_YARN_HOME=${HADOOP_HOME}
    export YARN_CONF_DIR=${HADOOP_CONF_DIR}
    export HADOOP_PID_DIR=/app/hadoop/tmp
    export YARN_PID_DIR=/app/hadoop/tmp
    export HADOOP_LOG_DIR=/log/hadoop
    export YARN_LOG_DIR=/log/yarn
    export HADOOP_MAPRED_LOG_DIR=${YARN_LOG_DIR}
    export HADOOP_MAPRED_PID_DIR=${YARN_PID_DIR}
    export PATH=${HADOOP_HOME}/sbin:${HADOOP_HOME}/bin:$PATH
    
    #使配置生效
    source /etc/profile
    

    2.6.2、修改配置文件

    2.6.2.1、core-site.xml

    ​ 修改 /app/hadoop/etc/hadoop/core-site.xml,在标签对之间添加以下内容:

      <property>
        <name>fs.defaultFS</name>  <!-- 指定hadoop文件系统访问的入口地址 -->
        <value>hdfs://bdp</value>  <!-- bdp需要在hosts中添加解析 -->
      </property>
      <property>
        <name>hadoop.tmp.dir</name> <!-- 指定hadoop数据临时存储目录 -->
        <value>/app/hadoop/tmp/</value>
      </property>
      <property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
      </property>
      <property>
        <name>ha.zookeeper.quorum</name> <!-- 指定zookeeper地址 -->
      <value>nn1-bdp1:2181,nn2-bdp1:2181,nn3-bdp2:2181</value>
      </property>
      <property>
        <name>io.compression.codecs</name>
        <value>org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.Lz4Codec</value>
      </property>
      <property>
        <name>fs.trash.interval</name>
        <value>2880</value>
      </property>
      <property>
       <name>hadoop.proxyuser.hdfs.hosts</name>
       <value>*</value>
      </property>
      <property>
       <name>hadoop.proxyuser.hdfs.groups</name>
       <value>*</value>
      </property>
      <property>
        <name>hadoop.proxyuser.hive.hosts</name>
        <value>*</value>
      </property>
      <property>
        <name>hadoop.proxyuser.hive.groups</name>
        <value>*</value>
      </property>
    
    2.6.2.2、hdfs-site.xml

    ​ 修改 /app/hadoop/etc/hadoop/hdfs-site.xml,在标签对之间添加以下内容:

      <!-- 指定hdfs的nameservice名称 -->
      <property>
        <name>dfs.nameservices</name>
        <value>bdp1,bdp2</value>
      </property>
    
      <!-- bdp1 -->
      <property>
        <name>dfs.ha.namenodes.bdp1</name>
        <value>nn1,nn2</value>
      </property>
      <property>
        <name>dfs.namenode.rpc-address.bdp1.nn1</name>
        <value>nn1-bdp1:8020</value>
      </property>
      <property>
        <name>dfs.namenode.rpc-address.bdp1.nn2</name>
        <value>nn2-bdp1:8020</value>
      </property>
      <property>
        <name>dfs.namenode.servicerpc-address.bdp1.nn1</name>
        <value>nn1-bdp1:8021</value>
      </property>
      <property>
        <name>dfs.namenode.servicerpc-address.bdp1.nn2</name>
        <value>nn2-bdp1:8021</value>
      </property>
      <property>
        <name>dfs.namenode.http-address.bdp1.nn1</name>
        <value>nn1-bdp1:50070</value>
      </property>
      <property>
        <name>dfs.namenode.http-address.bdp1.nn2</name>
        <value>nn2-bdp1:50070</value>
      </property>
      <property>
        <name>dfs.client.failover.proxy.provider.bdp1</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      </property>
      <property>
        <name>dfs.namenode.shared.edits.dir.bdp1</name>
        <value>qjournal://nn2-bdp1:8485;nn3-bdp2:8485;nn4-bdp2:8485/bdp1</value>
      </property>
      
      <!-- bdp2 -->
      <property>
        <name>dfs.ha.namenodes.bdp2</name>
        <value>nn1,nn2</value>
      </property>
      <property>
        <name>dfs.namenode.rpc-address.bdp2.nn1</name>
        <value>nn3-bdp2:8020</value>
      </property>
      <property>
        <name>dfs.namenode.rpc-address.bdp2.nn2</name>
        <value>nn4-bdp2:8020</value>
      </property>
      <property>
        <name>dfs.namenode.servicerpc-address.bdp2.nn1</name>
        <value>nn3-bdp2:8021</value>
      </property>
      <property>
        <name>dfs.namenode.servicerpc-address.bdp2.nn2</name>
        <value>nn4-bdp2:8021</value>
      </property>
      <property>
        <name>dfs.namenode.http-address.bdp2.nn1</name>
        <value>nn3-bdp2:50070</value>
      </property>
      <property>
        <name>dfs.namenode.http-address.bdp2.nn2</name>
        <value>nn4-bdp2:50070</value>
      </property>
      <property>
        <name>dfs.client.failover.proxy.provider.bdp2</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      </property>
      <property>
        <name>dfs.namenode.shared.edits.dir.bdp2</name>
        <value>qjournal://nn2-bdp1:8485;nn3-bdp2:8485;nn4-bdp2:8485/bdp2</value>
      </property>
      
      <!-- 创建的namenode文件夹位置,如有多个用逗号隔开。配置多个的话,每一个目录下数据都是相同的,达到数据冗余备份的目的 -->
      <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///data/dfs/nn/local</value>
      </property>
      
      <!-- 创建的datanode文件夹位置,多个用逗号隔开,实际不存在的目录会被忽略 --> 
      <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///data/dfs/dn1/local,file:///data/dfs/dn2/local</value>
      </property>
    
      <!-- JournalNode 用于存放 editlog 和其他状态信息的目录 -->  
      <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/data/dfs/jn</value>
      </property>
      <property>
        <name>dfs.qjournal.start-segment.timeout.ms</name>
        <value>60000</value>
      </property>
      <property>
        <name>dfs.replication</name>
        <value>2</value>
      </property>
      <!-- 一种关于 NameNode 的隔离机制(fencing) -->
      <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
      </property>
      <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hdfs/.ssh/id_rsa</value>
      </property>
      <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
      </property>
    
    2.6.2.3、yarn-site.xml

    ​ 修改 /app/hadoop/etc/hadoop/yarn-site.xml,在标签对之间添加以下内容:

      <property>
        <description>Classpath for typical applications.</description>
        <name>yarn.application.classpath</name>
        <value>
          $HADOOP_CONF_DIR,
          $HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,
          $HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,
          $HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*,
          $HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/*,
          $HADOOP_COMMON_HOME/share/hadoop/common/*,
          $HADOOP_COMMON_HOME/share/hadoop/common/lib/*,
          $HADOOP_COMMON_HOME/share/hadoop/hdfs/*,
          $HADOOP_COMMON_HOME/share/hadoop/hdfs/lib/*,
          $HADOOP_COMMON_HOME/share/hadoop/mapreduce/*,
          $HADOOP_COMMON_HOME/share/hadoop/mapreduce/lib/*,
          $HADOOP_COMMON_HOME/share/hadoop/yarn/*,
          $HADOOP_COMMON_HOME/share/hadoop/yarn/lib/*
         </value>
      </property>
      <!-- resourcemanager config -->
      <property>
        <name>yarn.resourcemanager.connect.retry-interval.ms</name>
        <value>2000</value>
      </property>
      <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
      </property>
      <property>
        <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
        <value>true</value>
      </property>
      <property>
        <name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
        <value>true</value>
      </property>
      <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarn-rm-cluster</value>
      </property>
      <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
      </property>
      <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>nn1-bdp1</value>
      </property>
      <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>nn2-bdp1</value>
      </property>
      <!-- fair scheduler -->
      <property>
        <name>yarn.resourcemanager.scheduler.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
      </property>
      <property>
        <name>yarn.scheduler.fair.user-as-default-queue</name>
        <value>false</value>
      </property>
      <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
      </property>
      <property>
        <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
        <value>5000</value>
      </property>
      <property>
        <name>yarn.resourcemanager.nodes.exclude-path</name>
        <value>/app/hadoop/etc/hadoop/yarn.exclude</value>
        <final>true</final>
      </property>
      
      <!-- ZKRMStateStore config -->
      <!-- 配置RM状态信息存储方式,有MemStore和ZKStore -->
      <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
      </property>
      <!--使用ZK集群保存状态信息,指定zookeeper队列 -->
      <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>nn1-bdp1:2181,nn2-bdp1:2181,nn3-bdp2:2181</value>
      </property>
      <!-- 被RM用于状态存储的ZooKeeper服务器的主机:端口号,多个ZooKeeper的话使用逗号分隔 -->
      <property>
        <name>yarn.resourcemanager.zk.state-store.address</name>
        <value>nn1-bdp1:2181,nn2-bdp1:2181,nn3-bdp2:2181</value>
      </property>
      <!-- applications manager interface -->
      <!-- 客户端通过该地址向RM提交对应用程序操作 -->
      <property>
        <name>yarn.resourcemanager.address.rm1</name>
        <value>nn1-bdp1:23140</value>
      </property>
      <property>
        <name>yarn.resourcemanager.address.rm2</name>
        <value>nn2-bdp1:23140</value>
      </property>
      <!-- scheduler interface -->
      <!-- ResourceManager对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资源等 -->
      <property>
        <name>yarn.resourcemanager.scheduler.address.rm1</name>
        <value>nn1-bdp1:23130</value>
      </property>
      <property>
        <name>yarn.resourcemanager.scheduler.address.rm2</name>
        <value>nn2-bdp1:23130</value>
      </property>
      <!-- RM admin interface -->
      <!--管理员通过该地址向RM发送管理命令 -->
      <property>
        <name>yarn.resourcemanager.admin.address.rm1</name>
        <value>nn1-bdp1:23141</value>
      </property>
      <property>
        <name>yarn.resourcemanager.admin.address.rm2</name>
        <value>nn2-bdp1:23141</value>
      </property>
      <!-- RM resource-tracker interface -->
      <!-- NodeManager通过该地址交换信息 -->
      <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
        <value>nn1-bdp1:23125</value>
      </property>
      <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
        <value>nn2-bdp1:23125</value>
      </property>
      <!-- RM web application interface -->
      <!-- RM HTTP访问地址,查看集群信息-->
      <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>nn1-bdp1:8088</value>
      </property>
      <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>nn2-bdp1:8088</value>
      </property>
      <property>
        <name>yarn.resourcemanager.webapp.https.address.rm1</name>
        <value>nn1-bdp1:23189</value>
      </property>
      <property>
        <name>yarn.resourcemanager.webapp.https.address.rm2</name>
        <value>nn2-bdp1:23189</value>
      </property>
    
      <!-- Node Manager Configs -->
      <property>
        <description>Address where the localizer IPC is.</description>
        <name>yarn.nodemanager.localizer.address</name>
        <value>0.0.0.0:23344</value>
      </property>
      <property>
        <description>NM Webapp address.</description>
        <name>yarn.nodemanager.webapp.address</name>
        <value>0.0.0.0:23999</value>
      </property>
    
      <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
      </property>
      <property>
        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
      </property>
      <property>
        <name>yarn.nodemanager.local-dirs</name>
        <value>file:///data/nm1/yarn/local,file:///data/nm2/yarn/local</value>
      </property>
      <property>
        <name>yarn.nodemanager.log-dirs</name>
        <value>file:///data/nm1/yarn/log,file:///data/nm2/yarn/log</value>
      </property>
      <property>
        <name>mapreduce.shuffle.port</name>
        <value>23080</value>
      </property>
      
      <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
      </property>
      <property>
        <description>Where to aggregate logs to.</description>
        <name>yarn.nodemanager.remote-app-log-dir</name>
        <value>hdfs://bdp/tmp/logs</value>
      </property>
      <property>
        <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
        <value>logs</value>
      </property>
      
      <property>
        <name>yarn.nodemanager.delete.debug-delay-sec</name>
        <value>1200</value>
      </property>
      <property>
        <name>yarn.resourcemanager.work-preserving-recovery.enabled</name>
        <value>true</value>
      </property>
      
      <!-- tuning -->
      <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>1024</value>
      </property>
      <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>1</value>
      </property>
      <!-- tuning yarn container -->
      <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>256</value>
      </property>
      <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>512</value>
      </property>
      <property>
        <name>yarn.scheduler.increment-allocation-mb</name>
        <value>1024</value>
      </property>
      <property>
        <name>yarn.scheduler.fair.allow-undeclared-pools</name>
        <value>false</value>
      </property>
      <property>
        <name>yarn.scheduler.fair.allow-undeclared-pools</name>
        <value>false</value>
      </property>
      <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>1209600</value>
      </property>
      <property>
        <name>yarn.node-labels.fs-store.root-dir</name>
        <value>hdfs://bdp1/user/yarn/node-labels</value>
      </property>
      <property>
        <name>yarn.node-labels.enable</name>
        <value>true</value>
      </property>
      <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
      </property>
    
      <property>
        <name>yarn.acl.enable</name>
        <value>true</value>
      </property>
    
    2.6.2.4、yarn.exclude
    touch /app/hadoop/etc/hadoop/yarn.exclude
    
    2.6.2.5、mapred-site.xml
    cd /app/hadoop/etc/hadoop
    cp mapred-site.xml.template mapred-site.xml
    

    ​ 修改 mapred-site.xml,在标签对之间添加以下内容:

      <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
      </property>
      <property>
        <name>mapreduce.jobhistory.address</name>
        <value>nn1-bdp1:10020</value>
      </property>
      <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>nn1-bdp1:19888</value>
      </property>
      <property>
        <name>yarn.app.mapreduce.am.staging-dir</name>
        <value>/user</value>
      </property>
    
      <!-- tuning  mapreduce -->
      <property>
        <name>mapreduce.map.memory.mb</name>
        <value>5120</value>
      </property>
      <property>
        <name>mapreduce.map.java.opts</name>
        <value>-Xmx4096m -Dfile.encoding=UTF-8</value>
      </property>
      <property>
        <name>mapreduce.reduce.memory.mb</name>
        <value>13312</value>
      </property>
      <property>
        <name>mapreduce.reduce.java.opts</name>
        <value>-Xmx10649m -Dfile.encoding=UTF-8</value>
      </property>
      <property>
        <name>mapreduce.map.cpu.vcores</name>
        <value>1</value>
      </property>
      <property>
        <name>mapreduce.reduce.cpu.vcores</name>
        <value>2</value>
      </property>
      <property>
        <name>mapreduce.jobhistory.max-age-ms</name>
        <value>1296000000</value>
        <source>mapred-default.xml</source>
      </property> 
      <property>
        <name>mapreduce.jobhistory.joblist.cache.size</name>
        <value>200000</value>
        <source>mapred-default.xml</source>
      </property>
     <property>
        <name>mapreduce.job.counters.max</name>
        <value>9999</value>
      </property>
      <property>
        <name>mapreduce.job.counters.groups.max</name>
        <value>9999</value>
      </property>
      <property>
        <name>mapreduce.job.counters.group.name.max</name>
        <value>9999</value>
      </property>
      <property>
        <name>mapreduce.job.counters.counter.name.max</name>
        <value>9999</value>
      </property>
      <property>
        <name>mapreduce.shuffle.connection-keep-alive.enable</name>
        <value>true</value>
      </property>
      <property>
        <name>mapreduce.job.reduce.slowstart.completedmaps</name>
        <value>0.95</value>
      </property>
    
    2.6.2.6、hadoop-env.sh
    vim /app/hadoop/etc/hadoop/hadoop-env.sh
    #修改以下内容
    export JAVA_HOME=/app/jdk
    
    2.6.2.7、slaves 文件
    vim /app/hadoop/etc/hadoop/slaves
    dn1
    dn2
    

    2.6.3、复制文件至其它主机

    #在192.168.189.17主机上执行
    cd /app
    scp -r hadoop-2.7.3 192.168.189.27:/app
    scp -r hadoop-2.7.3 192.168.189.37:/app
    scp -r hadoop-2.7.3 192.168.189.47:/app
    scp -r hadoop-2.7.3 192.168.189.57:/app
    scp -r hadoop-2.7.3 192.168.189.67:/app
    
    #在192.168.189.27-67主机上执行
    ##添加软链接
    cd /app
    ln -s hadoop-2.7.3 hadoop
    ##添加目录并授权
    mkdir /{data,log}
    chown -R hdfs:hadoop /data
    chown -R hdfs:hadoop /log
    
    #每台主机执行,修改hadoop目录权限
    cd /app
    chown -R hdfs:hadoop hadoop/
    

    2.6.4、初始化集群

    2.6.4.1、切换至 hdfs 用户

    ​ 后需操作均使用 hdfs 用户执行,执行命令前记得先切换用户:

    su - hdfs
    
    2.6.4.2、初始化 zkfc

    ​ 根据主机规划情况,在 192.168.189.17 和 192.168.189.37 上执行:

    hdfs zkfc -formatZK
    
    2.6.4.3、启动 JournalNode 集群

    ​ 根据主机规划情况,在 192.168.189.27、192.168.189.37、192.168.189.47 上执行:

    hadoop-daemon.sh start journalnode
    

    注意:非首次启动需初始化 Shared Edits目录。

    hdfs namenode -initializeSharedEdits
    

    说明:非首次启动是指原来有一个没有配置HA的HDFS已经在运行了,HDFS上已经有数据了,现在需要配置HA而加入一台namenode。这时候namenode1通过initializeSharedEdits命令来初始化journalnode,把edits文件共享到journalnode上。

    2.6.4.4、格式化 namenode

    ​ 根据主机规划情况,在 192.168.189.17、192.168.189.37上即每个集群其中一台 namenode 的节点上执行:

    hdfs namenode -format
    
    2.6.4.5、启动 namenode

    (1) 启动刚格式化的 NameNode,在主 namenode 上执行,即在 192.168.189.17、192.168.189.37 上执行:

    hadoop-daemon.sh start namenode -clusterid hd20211011
    

    注意:此处需要指定集群ID,如第一次在 192.168.189.17 上格式化时不指定 -clusterid,而使用 hdfs namenode -format 直接格式化,那么在 192.168.189.37 上格式化时必需指定 -clusterid,且需要与 192.168.189.17 上的相同,可通过 cat /data/dfs/nn/local/current/VERSION 查看 192.168.189.17 格式化后的 clusterID,如果 clusterid 不一致,可能无法读取到 datanode

    (2) 同步 namenode 数据,在 192.168.189.27、192.168.189.47 上执行:

    hdfs namenode -bootstrapStandby
    

    (3) 接着启动 namenode 进程了,在 192.168.189.27、192.168.189.47 上执行:

    hadoop-daemon.sh start namenode
    
    2.6.4.6、启动 datanode

    ​ 在其中一台主 namenode 上执行即可,可在 192.168.189.17 上执行:

    hadoop-daemons.sh start datanode
    
    2.6.4.7、启动 yarn

    ​ 根据主机规划情况,先在 192.168.189.17上执行:

    start-yarn.sh
    

    ​ 然后在 192.168.189.27上执行:

    yarn-daemon.sh start resourcemanager
    
    2.6.4.8、启动 zkfc

    ​ 根据主机规划情况,先在 192.168.189.17、192.168.189.27、192.168.189.37、192.168.189.47 上执行:

    hadoop-daemon.sh start zkfc
    
    2.6.4.9、启动 JobHistory Server 历史日志服务(如有需要)

    ​ 在 192.168.189.17 上执行,因 yarn-site.xml 文件中 yarn.nodemanager.remote-app-log-dir 的配置为 hdfs://bdp/tmp/logs,所以需要创建目录,不然日志里会报 File hdfs://bdp/tmp/logs does not exist.

    #添加hosts解析,需要root权限
    vim /ect/hosts
    192.168.189.17 nn1-bdp1 bdp
    
    #创建目录
    hadoop fs -mkdir -p /tmp/logs
    
    #启动服务
    mr-jobhistory-daemon.sh start historyserver
    
    #web访问
    http://192.168.189.17:19888
    

    2.6.5、访问验证

    namenode1:
    http://192.168.189.17:50070
    
    namenode2:
    http://192.168.189.27:50070
    
    namenode3:
    http://192.168.189.37:50070
    
    namenode4:
    http://192.168.189.47:50070
    
    ResourceManager1:
    http://192.168.189.17:8088
    
    ResourceManager2:
    http://192.168.189.27:8088
    
    Datanode:
    http://192.168.189.57:50075/
    http://192.168.189.67:50075/
    
    JobHistory:
    http://192.168.189.17:19888
    
    hadoop进程查看
    jps
    
  • 相关阅读:
    stringstream复用【原创】
    C++访问权限【原创】
    C++进阶阅读
    程序员的自我修养-装载、链接与库【原创】
    WinDebug 常用命令表【摘】
    重要说明与访问必看
    Beyond Compare V3.2.3 Beta 中文版
    Batch File Rename Utility(文件批量改名软件) 1.1.4231
    Defraggler(磁盘整理软件) V2.21.993 绿色版
    DiskGenius(磁盘分区/数据恢复) 32位 V4.9.1 免费绿色版
  • 原文地址:https://www.cnblogs.com/hovin/p/15391731.html
Copyright © 2011-2022 走看看