Hadoop HA 集群搭建
1. 为啥需要配置HA?
- 所谓HA
(High Availablity)
,即高可用(7*24小时不中断服务)。真正用途就是为了消除单点故障引发的 连锁反应。 - 从之前的学习中可以了解
NameNode
就相当于整个系统的 “大脑” 一样,一旦出现问题就会导致整个集群 “休克”,为了避免出现这样的现象,在HA中,将两个单独的计算机配置为Namenode。正常状态下,只有一个Namenode处于Active状态,另一个处于Standby状态; - Active Namenode用于接受Client端的请求,而Standby 节点只是充当从属,并保持足够的状态以在必要时提供快速故障转移。
- 如: NameNode节点宕机重启,或者 NameNode节点需要升级等,这样会导致集群无法使用,而此时Standby会无缝接替工作变成 Active。 集群就会继续工作。
2. JournalNode 和 zookeeper组件引入
2.1 JournalNode
- 在HA之中可以有多个NameNode,那么它们之间肯定有自己的通讯方式,为了使Standby节点保持其状态与Active 节点同步,(热备份) 两个节点都与一组独立的进程进行相互通讯 称为
JournalNode(JN)
的单独守护进程 进行通信。 - 当active 状态的NameNode的命名空间有任何修改时,会告知 journal 进程,Standby状态的NameNode有权力读取JNS的变更信息,并且一直监查
edit log
的变化,然后同步自己的命名空间。- Standby可以确保在集群出错时,命名空间状态完全同步。
- 思考一个问题: 在Ha中允许多个NameNode同时工作么? 说出自己的看法!?
- 假设突然断电之后的重启,出现了“人格分裂”两个NameNode都在工作!?
2.2 Zookeeper(解决Hadoop技术难点)
- 思考一个问题: NameNode HA中 技术难点,你认为有什么?
- 分布式应用提供一致性服务的软件,是Hadoop的重要组件,提供的功能包括:监听,配置维护、域名服务、分布式同步、组服务等。
- 作用其中之一: 引入zookeeper来对namenode进行监听, 如果,Active中 NameNode如果崩溃,就需要人工切换standby Namenode为active。如果没有及时发现,就会影响系统运行,就不是所谓的高可用。
- 选举机制。通过zookeeper可以监听多个namenode, 当active namenode崩溃的话, zookeeper监听到后马上通知zookeeper的leader进行主备选举, 在standby namenode中选举出一台,并将它置为active模式替换崩溃的namenode。
3. Hadoop HA集群搭建准备(前期)
3.1 节点分配表
- hd03 的机器可以在配置两个,但是集群最好要保持单数。(根据自己机器硬件3个5个都可以)
节点名称 | 节点功能 | ip地址 |
---|---|---|
hd01 | zoopeeper,NameNode(active),Resourcemanage(active) | 192.168.150.134 |
hd02 | zoopeeper,NameNode(standby),Resourcemanage(standby) ,JournalNode ,DataNode | 192.168.150.135 |
hd03 | zookeeper,DataNode ,NodeManager ,JournalNode | 192.168.150.136 |
3.2 配置Linux服务器基本配置
- 首先,参考 第一节Hadoop安装中 5. Linux基本配置,配置一台节点机器。
- 参照步骤配置一台linux,然后再进行下一步,克隆。
2. 配置host时需要注意,需要将集群ip都写入vim /etc/hosts
。
3.3 克隆节点
-
配置好机器之后在准备克隆,这样可以减少很多操作步骤,
- 克隆一定要注意在虚拟机关机状态下操作。
- 克隆一定要注意在虚拟机关机状态下操作。
-
根据选择提示操作,然后下一步。
-
根据选择提示操作,然后点击完成。等待克隆完成即可。
-
然后重复上面操作,在克隆2个节点。因为需要配置3个机器
3.4 修改克隆节点ip , 其他节点免密钥登录,和hostname名称
- 克隆之后,其他节点ip需要修改为ip分配表中的ip地址 (因为克隆ip不会自己改变,需要修改)。
- 免密钥登录, 一定要在其他节点ip修改之后,然后将3节点机器全部启动,依次重新配置自己的免密钥
ssh-keygen
一直回车。- 注意: 将自己的密钥发往其他节点和自己节点。 如:发往hd02节点
ssh-copy-id root@hd02
- 因为集群之间需要通讯。不能每次需要输入密码。 相互发完之后,可以测试
ssh 节点名称
。
- 注意: 将自己的密钥发往其他节点和自己节点。 如:发往hd02节点
- 然后同ip一样,修改其他节点的hostname,主机名称。
4. zookeeper 框架安装
4.1 安装前提
-
一定要将 配置Linux服务器基本配置几项完成
防火墙,
hosts : 将集群机器都要配置映射。ip+主机名称
ip地址:一定要改为手动
免密钥:服务器之间要相互发送自己密钥。
节点主机名称: 一定重启之后用hostname查看。
安装环境变量jdk -
将zookeeper的安装程序上传到 Linux服务器指定目录上
/usr /java /
,并进行解压tar zxvf 名称
。
4.2 配置Zookeeper文件
-
进行配置zookeeper的配置目录 conf
- 将其中的
zoo_sample.cfg
复制一份并改名为zoo.cfg
并配置复制后的文件,使用命令cp zoo_sample.cfg zoo.cfg
- 将其中的
-
配置文件 zoo.cfg 。
操作如下: 修改两处配置:- dataDir 是存放zookeeper缓存文件,手动创建
/usr/zkdata
目录 (注意:是目录,别创建成文件)。 - 配置节点选举节点。server.1=节点主机名称:2888:3888
参数说明:1,选举id值、2888心跳端口、3888选举端口。
注: 在usr/zkdata/
创建一个文件myid(注意这个是文件,别创建成目录),编辑内容为选举节点id值。
例如 :server.1 =hd01:2888:3888。 myid内容就是1。
- dataDir 是存放zookeeper缓存文件,手动创建
4.3 将配置文件同步其他节点
- 将配置好的文件同步到其他节点,即远程发送到其他节点。特别需要注意, 创建zkdata和修改myid里面的值。
- 加-r是指发送目录及所有。
使用命令 scp -r /usr/java/apache-zookeeper-3.6.0-bin root@hd02:/usr/java/
- 不加-r只发送文件。
scp myid root@hd02:/usr/zkdata/
- 加-r是指发送目录及所有。
5. 配置Hadoop节点配置(中期)
5.1 安装前提
- 上传
hadoop-2.8.1.tar.gz
安装包到Linux下的指定目录,如:/usr /java/
。- 并解压tar包,
tar zxvf hadoop-2.8.1.tar.gz
。
- 并解压tar包,
- 配置Linux中的 Hadoop环境变量。
- 编辑文件
vim /etc /profile
最下面加入hadoop的相关参数。 - 最后发送到其他节点,
scp /etc/profile root@hd02:/etc/
。
- 编辑文件
JAVA_HOME=/usr/java/jdk1.8.0_121
HADOOP_HOME=/usr/java/hadoop-2.8.1
PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH HADOOP_HOME
5.2 配置 hadoop-env.sh
hadoop-env.sh
,主要是修改hadoop运行环境配置变量。- 目录:
/usr/java/hadoop-2.8.1/etc/hadoop
- 参数: 修改JAVA_HOME 路径和HADOOP_CONF_DIR 路径
- 目录:
5.3 配置core-site.xml
- 用于定义系统级别的参数。
- 如:指定HDFS老大,配置zookeeper地址,hadoop 缓存目录。
- zookeeper执行地址要与
yarn-site.xml
中的zookeeper保持对应节点数。
<!-- 用来指定hdfs的老大,ns为固定属性名,表示两个namenode-->
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--hadoop生成的临时文件存放tmp需要手动创建-->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/java/hadoop-2.8.1/tmp</value>
</property>
<!--执行zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hd01:2181,hd02:2181,hd03:2181</value>
</property>
</configuration>
5.4 配置hdfs-site.xml(核心文件)
hdfs-site.xml
,配置hdfs的备份策略,和文件读取权限。- 在 HA中属于核心重点文件。
<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>hd01:9000</value>
</property>
<!--nn1的http通信地址-->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hd01:50070</value>
</property>
<!--nn2的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hd02:9000</value>
</property>
<!--nn2的http通信地址-->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hd02:50070</value>
</property>
<!--指定namenode的元数据在JournalNode上的存放位置,这样,namenode2可以 从jn集群里获取
最新的namenode的信息,达到热备的效果-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value> qjournal://hd02:8485;hd03:8485/ns</value>
</property>
<!--指定JournalNode存放数据的位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value> /usr/java/hadoop-2.8.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:/usr/java/hadoop-2.8.1/tmp/namenode</value>
</property>
<!--配置datanode数据存放的位置,可以不配置,如果不配置,默认用的是
core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/java/hadoop-2.8.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>
5.5 配置mapred-site.xml.template模板文件
- MapReduce的核心配置文件,配置运行资源调度平台为yarn。
- 需要将模板文件修改为
mapred-site.xml
。
- 需要将模板文件修改为
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
5.6 配置 yarn-site.xml(核心文件)
- yarn的核心配置文件。
- 其中
yarn.resourcemanager.zk-address
中节点数要与core-site.xml
-执行zookeeper地址中保持一致。
- 其中
<configuration>
<!--开启YARN HA -->
<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>hd01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hd02</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>hd01:2181,hd02:2181,hd03:2181</value>
</property>
<!--指定YARN HA的名称,名字随意-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
</property>
<property>
<!--指定yarn的老大resoucemanager的地址-->
<name>yarn.resourcemanager.hostname</name>
<value>hd01</value>
</property>
<property>
<!--NodeManager 获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
5.7 配置slaves
- 作用:配置干活小弟节点。hd03 hd02。
- 执行编辑文件 slaves
vim slaves
- 执行编辑文件 slaves
5.8 注意事项
- 需要手动创建上面的相应组件的缓存目录;
手动建立目录,如下
/usr/java/hadoop-2.8.1/tmp hadoop缓存目录。
/usr/java/hadoop-2.8.1/journal JournalNode数据目录,NameNode的守护进程。
- 将 hadoop-2.8.1配置好的安装程序发往其他节点。
- 向hd02节点传输
scp –r /usr/java/hadoop-2.8.1 root@hd02:/usr/java
- 向hd02节点传输
6. 启动Hadoop集群启动(后期)
6.1 启动Zookeeper集群
-
在zookeeper安装目录下bin目录下执行:
sh zkServer.sh start
分别在安装zk节点的机器。
注:- 最好将节点机器重启,然后再进行启动集群,如果无法启动:
检查jdk是否安装,source是否生效,
检查zkdata 中的myid文件是否存在,myid值是否正确。
检查端口2181是否被占用。netstat -apn | grep 2181
删除zkdata中除 myid文件(以上均不行情况)。
- 最好将节点机器重启,然后再进行启动集群,如果无法启动:
6.2 格式化Zookeeper中的Leader节点
- 进入zookeeper安装目录
/bin
目录下,执行命令sh zkServer.sh status,
哪个节点是 Mode: leader 就格式化哪个节点执行。- 执行命令:
hdfs zkfc -formatZK
(这个命令一定要手动敲入,千万别复制,切记,切记)
不然会报错(Bad argument: formatZK) - 作用: 可以在zookeeper集群中生成ha节点(ns节点)。相当于在zookeeper上注册了一个节点路径为hadoop-ha/ns,然后两个NameNode会在/hadoop-ha/ns下注册临时节点。zookeeper通过检测节点变化,来了解NameNode节点状态。
- 执行命令:
- 如果没有报错误信息,就会如下图
- (只在Leader节点格式化即可,其他节点不需要)。
- (只在Leader节点格式化即可,其他节点不需要)。
6.3 启动journalNode集群
- 即共享守护进程。根据分配表,在hd02、hd03,节点上执行启动journalNode集群。
hdfs-site.xml
文件中。
- 在 hadoop安装目录的 /usr/java/hadoop-2.8.1/sbin 即
sbin
目录下。- 执行命令:
sh hadoop-daemons.sh start journalnode
- 注意:如果根据节点配置表发现有其他的节点没有启动,去查看配置文件 5.7 slaves是否配置。
- 执行命令:
6.4 格式化 NameNode
- 跟据节点分配表在hd01节点上进行操作。
- 格式化hd01 上NameNode 命令:
hadoop namenode -format
- 前提是没有报错,就会有如下界面。如果报错请检查 配置Hadoop节点配置(中期)。
- 同时在tmp中会生数据。
- 格式化hd01 上NameNode 命令:
6.5 启动 NameNode 和 Standby NameNode
-
格式化成功之后,在 hd01 节点上目录下,
/usr/java/hadoop-2.8.1/sbin
启动NameNode。- 命令:
sh hadoop-daemon.sh start namenode
。
- 命令:
-
根据节点分配表 在hd02上将NameNode节点状态 变成standby。
- 命令:
hdfs namenode -bootstrapStandby
。
- 命令:
-
启动在 hd02 节点上目录下,
/usr/java/hadoop-2.8.1/sbin
启动NameNode。- 命令:
sh hadoop-daemon.sh start namenode
。
- 命令:
6.6 启动 DataNode
- 根据节点分配表 只有hd03,hd02上为DataNode节点。
- 命令:
sh hadoop-daemon.sh start datanode
- 如果启动不了有一般两种情况: 第一种, 查看Slaves文件中是否配置该节点,第二种,就是 NameNode和DataNode 集群ID不一致 (原因是多次格式化NameNode导致)。
- 命令:
6.7 启动 FalioverControllerActive 机制
- 属于zookeeper的组件,主要是监测NameNode的状态,如果有问题则自动切换 Standby节点为Active。 在安装有NameNode节点的机器启动,hd01 ,hd02。
- 命令:
sh hadoop-daemon.sh start zkfc
。
- 命令:
6.8 启动ResourceManager
-
是YARN分布式资源调度系统重要组件,ResourceManager负责集群中所有资源的统一管理和分配,它接收来自各个节点的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序。
- 命令:
sh start-yarn.sh
,根据节点分配表 在hd01上启动。 - 在主节点会有 ResourceManager 在其它节点上 NodeManager。
- 命令:
-
在hd02上启动副ResourceManager的主节点的备份。
- 命令:
sh yarn-daemon.sh start resourcemanager
- 命令:
6.9 启动测试
-
在地址栏输入
192.168.150.134:50070
这是访问url地址。主节点+端口号。- 查看主节点NameNode状态 active。
- 查看主节点NameNode状态 active。
-
在地址栏输入
192.168.150.135:50070
这是访问url地址。主节点+端口号。- 查看副节点NameNode状态 standby。
- 查看副节点NameNode状态 standby。
7 集群启动顺序
-
hd01、hd02、hd03,启动 zookeeper。
- 命令:
zkServer.sh start
- 命令:
-
hd02、hd03 、启动 journalnode
- 命令:
sh hadoop-daemons.sh start journalnode
- 命令:
-
hd01 、hd02、启动 Namenode
- 命令 :
sh hadoop-daemons.sh start namenode
- 命令 :
-
part02、part03,启动 datanode
- 命令:
sh hadoop-daemons.sh start datanode
- 命令:
-
hd01、hd02, 启动FlioverControllerActive
- 命令:
sh hadoop-daemons.sh start zkfc
- 命令:
-
hd01、启动 yarn resourcemanager
- 命令:
sh strat-yarn.sh
- 命令:
-
hd02 启动 resourcemanager2
- 命令:
sh yarn-daemons.sh start resourcemanager
- 命令:
配置环境变量的如HADOOP命令可以在任意目录启动,
如果想停止集群,则停止的操作从7-1即可。