小技巧:配置好一台服务器后,通过 scp -r /opt/zookeeper-3.4.7/ hadoop02:/opt/ 命令,把文件发送到另外两台机器。
1、搭建方案
- 引入zookeeper,通过注册临时节点来监控服务是否挂掉,保证能及时切换到正在运行的服务上,防止单点故障。
例如:NameNode(active)挂了 ,会有进程 FailOverController 来负责切换到 NameNode(standby)
ResourceManager(active)挂了, 会通过zookeeper自主切换到 ResourceManager(standby)
- 机器分配
主机名 | hadoop01 | hadoop02 | hadoop03 |
进程 | zookeeper | zookeeper | zookeeper |
NameNode(active) | NameNode(standby) | ||
FailOverController | FailOverController | ||
ResourceManager(active) | ResourceManager(standby) | ||
JournalNode | JournalNode | JournalNode | |
DataNode | DataNode | DataNode | |
NameNode | NameNode | NameNode |
2、环境准备
- 三台linux服务器,都配置好主机名。且每台服务器把主机名和ip关系配置到hosts文件中
- 配置免密登录:每台机器给自己和其他机器都发送一次免密登录。以hadoop01为例:
生成秘钥,输入命令后一直回车即可 | ssh-keygen |
把秘钥发送给自己 | ssh-copy-id root@hadoop01 |
把秘钥发送给hadoop02 | ssh-copy-id root@hadoop02 |
把秘钥发送给hadoop03 | ssh-copy-id root@hadoop03 |
-
三台服务器防火墙确保关闭
3、zookeeper集群搭建
搭建步骤参看:
https://mp.csdn.net/postedit/82818981
https://mp.csdn.net/postedit/82937890
4、hadoop集群搭建
首先安装和配置hadoop01节点,配置好后把hadoop整个文件夹拷贝到另外两台机器。
- vim hadoop-env.sh
配置jdk安装所在目录,hadoop配置文件所在目录
export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
export HADOOP_CONF_DIR=/opt/hadoop-2.7.1/etc/hadoop
- vim core-site.xml
该目录需要手动创建:/opt/hadoop-2.7.1/tmp
<configuration>
<!--用来指定hdfs的老大,ns为固定属性名,表示两个namenode-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--用来指定hadoop运行时产生文件的存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.7.1/tmp</value>
</property>
<!--执行zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
- vim hdfs-site.xml
下列目录需要手动创建:
/opt/hadoop-2.7.1/journal
/opt/hadoop-2.7.1/tmp/namenode
/opt/hadoop-2.7.1/tmp/datanode
<configuration>
<!--执行hdfs的nameservice为ns,和core-site.xml保持一致-->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!--ns下有两个namenode,分别是nn1,nn2-->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!--nn1的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop01:9000</value>
</property>
<!--nn1的http通信地址-->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop01:50070</value>
</property>
<!--nn2的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop02:9000</value>
</property>
<!--nn2的http通信地址-->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--指定namenode的元数据在JournalNode上的存放位置,这样,namenode2可以从jn集群里获
取最新的namenode的信息,达到热备的效果-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/ns</value>
</property>
<!--指定JournalNode存放数据的位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop-2.7.1/journal</value>
</property>
<!--开启namenode故障时自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--配置切换的实现方式
由这个类来实现故障时的切换-->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--配置隔离机制
秘钥认证机制-->
<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>
<!--配置namenode数据存放的位置,可以不配置,如果不配置,默认用的是
core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/hadoop-2.7.1/tmp/namenode</value>
</property>
<!--配置datanode数据存放的位置,可以不配置,如果不配置,默认用的是
core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/hadoop-2.7.1/tmp/datanode</value>
</property>
<!--配置block副本数量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--设置hdfs的操作权限,false表示任何用户都可以在hdfs上操作文件
生产环境是不会这样设置的-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
- 配置mapred-site.xml
先复制一份模板并重命名 :cp mapred-site.xml.template mapred-site.xml
然后编辑: vim mapred-site.xml
<configuration>
<property>
<!--指定mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- vim yarn-site.xml
<configuration>
<!-- 开启YARN HA(高可用high available) -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</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>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop03</value>
</property>
<!--开启yarn恢复机制-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--执行rm恢复机制实现类-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 配置zookeeper的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!-- 指定YARN HA的名称
为yarn取一个别名,看日志可用 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
</property>
<property>
<!--指定yarn的老大 resoucemanager的地址
即哪一个resourcemanager是active状态-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<!--NodeManager获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
- vim 置slaves
配置datanode,nodemanager(存储数据和计算数据的节点信息)
hadoop01
hadoop02
hadoop03
- vim /etc/profile
在文件末尾添加jdk和hadoop的配置信息, 并执行命令 source /etc/profile 让配置生效。
注意另外两台机器也要执行source命令,使其生效。
#JDK安装目录
JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
#hadoop的安装目录
HADOOP_HOME=/opt/hadoop-2.7.1
PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH HADOOP_HOME
5、启动
5.1、先启动zookeeper集群
进入zookeeper安装目录 | cd /opt/zookeeper-3.4.7/bin/ |
启动三台服务器上的zookeeper | sh zkServer.sh start |
全部启动后检查各自的状态 | sh zkServer.sh status |
5.2、格式化zookeeper
在zookeeper的leader节点上执行命令 hdfs zkfc -formatZK,作用是在zookeeper集群上生成hadoop-ha节点(ns节点)
5.3、启动分布式文件系统
下面步骤可以用一步来替代:start-dfs.sh,第一次建议一步步执行。对应的停止操作为 stop-dfs.sh
- 启动journalnode集群
分别在三台服务器上,切换到hadoop安装目录的sbin目录,启动journalnode sh hadoop-daemon.sh start journalnode 。或者只在一台机器上执行一次命令: sh hadoop-daemons.sh start journalnode 去启动配置好的所有journalnode。
- 格式化hadoop01节点的namenode : hadoop namenode -format
- 启动hadoop01节点的 namenode:sh hadoop-daemon.sh start namenode
- 把hadoop02节点的namenode配置为 standby,并启动namenode
配置为standy状态:hdfs namenode -bootstrapStandby
启动namenode:sh hadoop-daemon.sh start namenode
- 启动datanode
分别在三台服务器上执行命令:hadoop-daemon.sh start datanode
- 启动失败恢复进程(zkfc)
在hadoop01,hadoop02节点上执行: hadoop-daemon.sh start zkfc
5.4、启动MapReduce
- 在hadoop01节点启动 ResourceManager(active) start-yarn.sh,该命令会启动hadoop01节点的 ResourceManager,并根据配置去启动三个节点的NodeManager。
- 在hadoop03节点启动 Resoucemanager(standby) yarn-daemon.sh start resourcemanager
6、访问
查看文件系统:http://192.168.101.100:50070
访问yarn控制台:http://192.168.101.100:8088
此时kill掉hadoop01节点的NameNode(active)进程,会发现hadoop02节点的NameNode由standby状态变为active状态。由此看出高可用的hdfs搭建成功。