使用三台虚拟机搭建集群
角色分配
ZKFC ZookeeperFailoverController 作为ZK集群的客户端 用来监控NN的状态信息 每个运行NN的节点上必须有运行一个ZKFC
Journal Node 日志节点 HDFS 集群高可用的一种解决方案:做两个NameNode的数据同步。当Active NN的命名空间有任何修改时,告知大部分JNS进程,Standby NN 去读取JNS中的信息,并一直监控edits log的变化,把变化应用于自己的命名空间。standby NN可以确保集群出错时,命名空间的状态已经完全同步了。
HDFS 高可用
- zk集群搭建成,保证可以正常运行
配置主机名与IP的映射关系
[root@HadoopNodeX ~]# vi /etc/hosts
192.168.197.11 HadoopNode01
192.168.197.12 HadoopNode02
192.168.197.13 HadoopNode03
关闭防火墙
[root@HadoopNode01 ~]# service iptables stop
[root@HadoopNode01 ~]# chkconfig iptables off
同步时钟
网络同步 比较精确
[root@HadoopNodeX ~]# yum install ntpdate -y
[root@HadoopNodeX ~]# ntpdate 0.asia.pool.ntp.org
配置SSH免密登录
# 首先在每个节点上执行此语句 生成公私钥
[root@HadoopNode01 ~]# ssh-keygen -t rsa
# 在上面三个节点上执行完成后 再进行互相的公钥的复制
[root@HadoopNodeX ~]# ssh-copy-id HadoopNode01
[root@HadoopNodeX ~]# ssh-copy-id HadoopNode02
[root@HadoopNodeX ~]# ssh-copy-id HadoopNode03
配置Java 环境
- 下载jdk1.8安装包 解压到相关目录 推荐usr目录
[root@HadoopNode01 ~]# vi .bashrc
export JAVA_HOME=/home/java/jdk1.8.0_181
export PATH=$PATH:$JAVA_HOME/bin
安装Hadoop
- 下载hadoop2.9.2安装包 直接解压到相关的位置 配置环境变量即可
[root@HadoopNode01 ~]# vi .bashrc
export HADOOP_HOME=/usr/hadoop/hadoop-2.9.2
export PATH=$PATH::$HADOOP_HOME/sbin:$HADOOP_HOME/bin
配置core-site.xml
- 位置 : /home/hadoop/hadoop-2.9.2/etc/hadoop/core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- ${user.name} 提取当前的用户名 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-2.9.2/hadoop-${user.name}</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
<!-- 设置 hadoop 的机架脚本 -->
<property>
<name>net.topology.script.file.name</name>
<value>/home/hadoop/hadoop-2.9.2/etc/hadoop/rack.sh</value>
</property>
创建机架脚本
- 位置 :/usr/hadoop/hadoop-2.9.2/etc/hadoop/rack.sh
shell 脚本
给当前脚本添加执行权限 : chmod u+x /home/hadoop/hadoop-2.9.2/etc/hadoop/rack.sh
while [ $# -gt 0 ] ; do
nodeArg=$1
exec</home/hadoop/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
创建机架映射文件
- 位置 :/usr/hadoop/hadoop-2.9.2/etc/hadoop/topology.data
- 在zk配置中 如果是单机模式 写上host:post即可
192.168.197.11 /rack1
192.168.197.12 /rack1
192.168.197.13 /rack2
配置hdfs-site.xml
- 位置 :/usr/hadoop/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--设置zookeeper服务地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>HadoopNode01:2181,HadoopNode02:2181,HadoopNode03:2181</value>
</property>
<!--解析core-site.xml中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的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>HadoopNode01:9000</value>
</property>
<!--nn2的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>HadoopNode02:9000</value>
</property>
<!--指定NameNode元数据在JournalNode上的储存位置-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>
qjournal://HadoopNode01:8485;HadoopNode02:8485;HadoopNode03:8485/mycluster
</value>
</property>
<!--开启NameNode的故障自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--配置失败 自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--脑裂的解决方案-->
<!--配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--使用隔离机制需要ssh免密登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
配置 mapred-site.xml (MR计算需要)
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置 yarn-site.xml (MR计算需要)
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定resourcemanager所对应的节点-->
<!--建议 namenode 不要和 resourcemanager放置在同一个点-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>HadoopNode02</value>
</property>
配置slaves (datanode同时又是nodemanager)
HadoopNode01
HadoopNode02
HadoopNode03
启动
- 第一次启动|重新格式化
# 删除克隆机之前的hadoop文件 清空务必执行
[root@HadoopNodeX ~]# rm -rf /home/hadoop/hadoop-2.9.2/hadoop-root/
[root@HadoopNodeX ~]# rm -rf /home/hadoop/hadoop-2.9.2/logs/
# 启动 ZK 集群 保证ZK 集群可用
[root@HadoopNodeX zookeeper-3.4.6]# ./bin/zkServer.sh start ./conf/zook.cfg
# 启动JN 在每一台节点上 等待一会(20-30S)再执行下一步
[root@HadoopNodeX ~]# hadoop-daemon.sh start journalnode
# 在01主节点上执行主的namenode的格式化
[root@HadoopNode01 ~]# hdfs namenode -format
# 在01主节点上启动 namenode
[root@HadoopNode01 ~]# hadoop-daemon.sh start namenode
# 在02 备节点上初始化standby namenode 下载active namenode 的元数据
[root@HadoopNode02 ~]# hdfs namenode -bootstrapStandby
# 在02 备节点上启动 namenode
[root@HadoopNode02 ~]# hadoop-daemon.sh start namenode
# 在01|02 任意节点上执行 此命令 只执行一次 格式化 zkfc
[root@HadoopNode02 ~]# hdfs zkfc -formatZK
# 在01 节点上启动zkfc 主备节点启动失效恢复的控制 从而实现主备切换
[root@HadoopNode01 ~]# hadoop-daemon.sh start zkfc
# 在02 节点上启动zkfc
[root@HadoopNode02 ~]# hadoop-daemon.sh start zkfc
# 在所有节点上启动datanode
[root@HadoopNodeX ~]# hadoop-daemon.sh start datanode
日常维护
- 任意节点启动|关闭即可
[root@HadoopNode01 zookeeper-3.4.6]# stop-dfs.sh
[root@HadoopNode01 zookeeper-3.4.6]# start-dfs.sh
- 在集群环境下,yarn启动的命令,需要在resourcemanager所在的节点执行
sbin/start-yarn.sh
sbin/stop-yarn.sh