hadoopHA角色分配
had01 | had02 | had03 | had04 | had05 |
---|---|---|---|---|
Zookeeper | Zookeeper | Zookeeper | ||
NameNode(Active) | NameNode(Standby) | |||
ZKFC | ZKFC | |||
JournalNode | JournalNode | JournalNode | ||
DataNode | DataNode | DataNode | ||
ResourceManager(Standby) | ResourceManager(Active) | |||
NodeManger | NodeManger | NodeManger | ||
JobHistoryServer | ||||
WebProxyServer |
ZKFC 作为一个ZK集群 的客户端 ,用来监控NN的状态信息,每个NN节点必须运行一个ZKFC
Journal Node 日志节点是HDFS 中一种高可用的解决方案,两个NN进行数据同步,会通过JN进行互相独立的通信。当active状态的NameNode的命名空间有任何修改,会告知大部分JN进程,standby状态的NameNode会读取JNS中变更信息,并一致监控edits log的变化,把变化应用与自己的命名空间,这样在active状态NameNode出现错误的时候,standby状态的NameNode能够立马替代其功能。
主机之间相互映射
每个主机都要配置
vim /etc/hosts
192.168.111.101 had01
192.168.111.102 had02
192.168.111.103 had03
192.168.111.104 had04
192.168.111.105 had05
关闭防火墙
每个主机都要配置
# 关闭防火墙
systemctl stop firewalld
# 永久关闭防火墙
systemctl disable firewalld
# 查看防火墙状态
systemctl status firewalld
SSH免密登录
每个主机都要执行
ssh-keygen -t rsa
在had01主机上操作
ssh-copy-id localhost
scp /root/.ssh/* had02:/root/.ssh/
scp /root/.ssh/* had03:/root/.ssh/
scp /root/.ssh/* had04:/root/.ssh/
scp /root/.ssh/* had05:/root/.ssh/
搭建java环境
以下都是在had01主机上操作
安装jdk
tar -zxf jdk-8u201-linux-x64.tar.gz -C /usr/local
# 为方便配置环境,将jdk改名
cd /usr/local
mv jdk1.8.0_201/ java
配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_201
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
使配置生效
source /etc/profile
测试
java -version
出现以下内容,即为搭建成功
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
将java文件夹和配置文件分发到其它主机
scp -r /usr/local/java/ root@had02:/usr/local/
scp -r /usr/local/java/ root@had03:/usr/local/
scp -r /usr/local/java/ root@had04:/usr/local/
scp -r /usr/local/java/ root@had05:/usr/local/
scp -r /etc/profile root@had02:/etc/
scp -r /etc/profile root@had03:/etc/
scp -r /etc/profile root@had04:/etc/
scp -r /etc/profile root@had05:/etc/
在 had02 ~ had05主机上执行
source /etc/profile
搭建hadoop集群
以下都是在had01主机上操作
安装hadoop
tar -zxf hadoop-2.9.2.tar.gz -C /usr/local
# 为方便配置环境,将文件夹改名
cd /usr/local
mv hadoop-2.9.2/ hadoop
配置hadoop环境变量
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
使环境变量生效
source /etc/profile
配置hadoop-env.sh
cd /usr/local/hadoop/etc/hadoop/
vim hadoop-env.sh
export JAVA_HOME=/usr/local/java
配置core-site.xml
cd /usr/local/hadoop/etc/hadoop/
vim core-site.xml
<!-- 指定hdfs的nameservices名称为mycluster,与hdfs-site.xml的HA配置相同 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定缓存文件存储的路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp/data</value>
</property>
<!-- 配置hdfs文件被永久删除前保留的时间(单位:分钟),默认值为0表明垃圾回收站功能关闭 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<!-- 配置HDFS WEB端使用的静态用户 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
<!-- 指定zookeeper地址,配置HA时需要 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>had03:2181,had04:2181,had05:2181</value>
</property>
<!-- 设置机架脚本文件-->
<property>
<name>net.topology.script.file.name</name>
<value>/usr/local/hadoop/etc/hadoop/rack.sh</value>
</property>
创建机架脚本文件
touch /usr/local/hadoop/etc/hadoop/rack.sh
机架脚本文件内容
cd /usr/local/hadoop/etc/hadoop
vim rack.sh
while [ $# -gt 0 ] ; do
nodeArg=$1
exec</usr/hadoop-2.9.2/etc/hadoop/topology.data
result=""
while read line ; do
ar=( $line )
if [ "${ar[0]}" = "$nodeArg" ] ; then
result="${ar[1]}"
fi
done
shift
if [ -z "$result" ] ; then
echo -n "/default-rack"
else
echo -n "$result "
fi
done
机架脚本添加权限
chmod 771 /usr/local/hadoop/etc/hadoop/rack.sh
创建机架文件
touch /usr/local/hadoop/etc/hadoop/topology.data
vim /usr/local/hadoop/etc/hadoop/topology.data
机架文件内容
192.168.111.201 /rack01
192.168.111.202 /rack01
192.168.111.203 /rack02
192.168.111.204 /rack02
192.168.111.205 /rack02
配置hdfs-site.xml
cd /usr/local/hadoop/etc/hadoop/
vim hdfs-site.xml
<!-- 指定hdfs元数据存储的路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/data/namenode</value>
</property>
<!-- 指定hdfs数据存储的路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/data/datanode</value>
</property>
<!-- 设置副本因子数为3-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 关闭权限验证 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- 开启WebHDFS功能(基于REST的接口服务) -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 自动故障转移-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 命名服务为mycluster-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 指定mycluster的两个namenode的名称分别为nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 配置nn1,nn2的rpc通信端口 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>had01:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>had02:9000</value>
</property>
<!-- 配置nn1,nn2的http通信端口 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>had01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>had02:50070</value>
</property>
<!-- 指定namenode元数据存储在journalnode中的路径 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://had03:8485;had04:8485;had05:8485/mycluster</value>
</property>
<!-- 指定journalnode日志文件存储的路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/tmp/journalnodelogs</value>
</property>
<!-- 设置故障转移的策略-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- ssh主动防御-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--设置私钥的路径 -->
<!--hadoop用户-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!--root用户-->
<!--<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property-->
配置yarn-site.xml
cd /usr/local/hadoop/etc/hadoop/
vim yarn-site.xml
<!-- NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可运行MapReduce程序 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 配置Web Application Proxy安全代理(防止yarn被攻击) -->
<property>
<name>yarn.web-proxy.address</name>
<value>had02:8888</value>
</property>
<!-- 开启日志 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log-server.url</name>
<value>http://had02:19888/jobhistory/logs</value>
</property>
<!-- 配置日志删除时间为7天,-1为禁用,单位为秒 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 修改日志目录 -->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/usr/local/tmp/hadooplogs</value>
</property>
<!--配置nodemanager可用的资源内存
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
配置nodemanager可用的资源CPU
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
-->
<!-- //以下为YARN HA的配置// -->
<!-- 开启YARN HA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 启用自动故障转移 -->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定YARN HA的名称 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarncluster</value>
</property>
<!-- 指定两个resourcemanager的名称 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 配置rm1,rm2的主机 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>had02</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>had01</value>
</property>
<!-- 配置YARN的http端口 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>had02:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>had01:8088</value>
</property>
<!-- 配置zookeeper的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>had03:2181,had04:2181,had05:2181</value>
</property>
<!-- 配置zookeeper的存储位置 -->
<property>
<name>yarn.resourcemanager.zk-state-store.parent-path</name>
<value>/usr/local/zookeeper/data/rmstore</value>
</property>
<!-- 开启yarn resourcemanager restart -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置resourcemanager的状态存储到zookeeper中 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 开启yarn nodemanager restart -->
<property>
<name>yarn.nodemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置nodemanager IPC的通信端口 -->
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:45454</value>
</property>
配置mapred-site.xml
cd /usr/local/hadoop/etc/hadoop/
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<!-- 指定MapReduce计算框架使用YARN -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定jobhistory server的rpc地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>had01:10020</value>
</property>
<!-- 指定jobhistory server的http地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>had01:19888</value>
</property>
<!-- 开启uber模式(针对小作业的优化) -->
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<!-- 配置启动uber模式的最大map数 -->
<property>
<name>mapreduce.job.ubertask.maxmaps</name>
<value>9</value>
</property>
<!-- 配置启动uber模式的最大reduce数 -->
<property>
<name>mapreduce.job.ubertask.maxreduces</name>
<value>5</value>
</property>
编辑slaves
slaves 内容是datanode,nodemanager的主机名
had03
had04
had05
将hadoop文件夹,和/etc/profile环境配置文件分发到其它主机
scp -r /usr/local/hadoop/ had02:/usr/local/
scp -r /usr/local/hadoop/ had03:/usr/local/
scp -r /usr/local/hadoop/ had04:/usr/local/
scp -r /usr/local/hadoop/ had05:/usr/local/
scp -r /etc/profile had02:/etc/
scp -r /etc/profile had03:/etc/
scp -r /etc/profile had04:/etc/
scp -r /etc/profile had05:/etc/
在 had02 ~ had05主机上执行
source /etc/profile
搭建zookeeper集群
以下都是在had03主机上操作
安装zookeeper
tar -zxf apache-zookeeper-3.6.3-bin.tar.gz -C /usr/local/
# 为方便配置环境,将文件夹改名
cd /usr/local
mv apache-zookeeper-3.6.3-bin/ zookeeper
修改zookeeper的配置文件
cd /usr/local/zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
# 内容如下
# 客户端心跳时间(毫秒)
tickTime=2000
# 允许心跳间隔的最大时间
initLimit=10
# 同步时限
syncLimit=5
# 数据存储目录
dataDir=/usr/local/zookeeper/data
# 数据日志存储目录
dataLogDir=/usr/local/tmp/zookeeperlogs
# 端口号
clientPort=2181
# 集群节点和服务端口配置
server.1=node202:2888:3888
server.2=node203:2888:3888
server.3=node204:2888:3888
# 以下为优化配置
# 服务器最大连接数,默认为10,改为0表示无限制
maxClientCnxns=0
# 快照数
autopurge.snapRetainCount=3
# 快照清理时间,默认为0
autopurge.purgeInterval=1
配置zookeeper环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
将zookeeper文件夹和/etc/profile环境配置文件分发到had04,had05主机
scp -r /usr/local/zookeeper/ had04:/usr/local/
scp -r /usr/local/zookeeper/ had05:/usr/local/
scp -r /etc/profile had04:/etc/
scp -r /etc/profile had05:/etc/
在 had03 ~ had05主机上执行
mkdir /usr/local/zookeeper/data
touch /usr/local/zookeeper/data/myid
source /etc/profile
myid文件内容
分别对应着
zoo.cfg
文件的 server.x
had03 myid文件内容 1
had04 myid文件内容 2
had05 myid文件内容 3
创建所需文件夹
所有主机执行
mkdir /usr/local/hadoop/tmp
mkdir /usr/local/hadoop/data
mkdir /usr/local/tmp
mkdir /usr/local/tmp/journalnodelogs
mkdir /usr/local/tmp/hadooplogs
had03 ~ had05执行
mkdir /usr/local/tmp/zookeeperlogs
至此,所有配置完成,初始化启动即可
以上只有root用户可用,想使用其它用户,还需以下操作
其它用户操作hadoop
每个主机执行
创建hadoop用户和hadoop用户组,并设置hadoop用户密码
useradd hadoop
passwd hadoop
为hadoop用户添加sudo权限
vi /etc/sudoers
在root用户下面一行加上hadoop ALL=(ALL) ALL,保存并退出(这里需要用wq!强制保存退出)
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL
将hadoop文件夹的主:组设置成hadoop,/usr目录与/usr/local目录所属主:组均为root,默认权限为755,也就是说其他用户(hadoop)没有写入(w)权限。在这里将hadoop用户加入root组,然后将文件夹权限设置为775
gpasswd -a hadoop root
chmod 775 /usr
chmod 775 /usr/local
chown -R hadoop:hadoop /usr/local/hadoop
将zookeeper文件夹的主:组设置成hadoop
chown -R hadoop:hadoop /usr/local/zookeeper
每个主机都要执行
登录到hadoop用户,配置SSH免密登录
su hadoop
cd /home/hadoop
ssh-keygen -t rsa
在had01主机上操作
ssh-copy-id localhost
scp ~/.ssh/* had02:~/.ssh
scp ~/.ssh/* had03:~/.ssh
scp ~/.ssh/* had04:~/.ssh
scp ~/.ssh/* had05:~/.ssh
hadoop集群初始化
hadoop用户进行hadoop初始化,必须先用root用户,对hadoop集群相关文件夹授权
chown -R hadoop:hadoop /usr/local/tmp/zookeeperlogs
chown -R hadoop:hadoop /usr/local/tmp/hadooplogs
chown -R hadoop:hadoop /usr/local/tmp/journalnodelogs
had03 ~ had05 启动zookeeper
zkServer.sh start
在had01上格式化ZKFC
hdfs zkfc -formatZK
启动journalnode(分别在had03、had04和had05上执行)
hadoop-daemon.sh start journalnode
格式化HDFS(在had01上执行)
hdfs namenode -format
将格式化后had01节点hadoop工作目录中的元数据目录复制到had02节点
scp -r /usr/local/hadoop/data/ had02:/usr/local/hadoop/
初始化完毕后可关闭journalnode,zookeeper(分别在had03、had04和had05上执行)
hadoop-daemon.sh stop journalnode
zkServer.sh stop
Hadoop集群的启动
启动zookeeper集群(分别在had03、had04和had05上执行)
zkServer.sh start
启动HDFS(在had01上执行)
start-dfs.sh
启动YARN(在had02上执行)
start-yarn.sh
启动YARN的另一个ResourceManager(在had01执行,用于容灾)
yarn-daemon.sh start resourcemanager
启动YARN的安全代理(在had02执行)
yarn-daemon.sh start proxyserver
备注:proxyserver充当防火墙的角色,可以提高访问集群的安全性
启动YARN的历史任务服务(在had01执行)
mr-jobhistory-daemon.sh start historyserver