返回顶部

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
posted @ 2021-10-11 08:41  hovin  阅读(344)  评论(0编辑  收藏  举报