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