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
原文地址:https://www.cnblogs.com/hovin/p/15391731.html