1.HA(高可用)方案
1.namenode HA
- 由两(多)个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
- 两(多)个NameNode,会出现脑裂(brain split),两(多)个NameNode被认定为active。官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode。
- 配置zookeeper集群,zookeeper对namenode进行监听,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为active状态
2.yarn HA
两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调
2.HA搭建
官网说明
1.集群规划
主机 | ip | 进程 |
---|---|---|
hadoop0 | 192.168.0.105 | QuorumPeerMain、DataNode、NodeManager、JournalNode、NameNode、zkfc、ResourceManager |
hadoop1 | 192.168.0.106 | QuorumPeerMain、DataNode、NodeManager、JournalNode、NameNode、zkfc、ResourceManager |
hadoop2 | 192.168.0.107 | QuorumPeerMain、DataNode、NodeManager、JournalNode、 |
2./etc/hadoop/下的配置文件
core-site.xml
<configuration>
<!--hdfs集群名称-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop运行时产生文件的存储路径(工作目录) -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/fcc/opt/hadoop/hadoop-2.9.2/data/</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>zookeeper0:2181,zookeeper1:2182,zookeeper2:2183</value>
</property>
<!--hadoop链接zookeeper的超时时长设置
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>3000</value>
<description>ms</description>
</property>-->
</configuration>
hdfs-site.xml
<configuration>
<!--hdfs集群服务名称-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--集群的namenode-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!--nn1的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop0:9000</value>
</property>
<!--nn1的http通信地址-->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop0:50070</value>
</property>
<!--nn2的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop1:9000</value>
</property>
<!--nn2的http通信地址-->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop1:50070</value>
</property>
<!--指定namenode的元数据在JournalNode上的存放位置-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop0:8485;hadoop1:8485;hadoop2:8485/mycluster</value>
</property>
<!--指定JournalNode在本地磁盘存放数据的位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/fcc/opt/hadoop/hadoop-2.9.2/journaldata</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>
<!--配置隔离机制方法,多个机制用换行分,即每个机制一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--使用sshfence隔离机制时需要ssh免登陆-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/fcc/.ssh/id_rsa</value>
</property>
<!--配置sshfence隔离机制超时时间-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
</configuration>
mapre-site.xml
<configuration>
<!--指定mapreduce框架为yarn-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<!--开启RM高可用-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--指定RM的cluster id-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrcluster</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 rm1-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop0</value>
</property>
<!-- 分别指定RM的地址 rm2-->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop1</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>zookeeper0:2181,zookeeper1:2182,zookeeper2:2183</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
slaves文件
slaves文件指定子节点的位置
启动hdfs的实例上的slaves需指定DataNode的位置
启动yarn的实例上的slaves需指定NodeManager的位置
配置ssh免密登录
- 在hadoop0上启动hdfs,所以hadoop0到hadoop1、hadoop2上ssh免密登录
- hadoop0、hadoop1两台作为namenode要互相通信,作为resourceManager要互相通信,所以hadoop0和hadoop1之间要互相ssh免密登录
- 在hadoop0上生成一对钥匙 ssh-keygen -t rsa
ssh-copy-id hadoop1
ssh-copy-id hadoop2
3.集群启动
1.启动zk集群
(hadoop0,hadoop1,hadoop2上个自启动)
zkServer.sh start
查看实例状态zkServer.sh status,一个leader,两个follower
2.启动journalnode进程
hadoop0,hadoop1,hadoop2上个自启动
sbin/hadoop-daemon.sh start journalnode
jps查看JournalNode进程启动成功
3.格式化HDFS
- 在hadoop0(active)上执行:hdfs namenode -format
格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件 - hadoop0和hadoop1作为两个namenode要保持同步,可以将hadoop0(active)中hadoop.tmp.dir(工作目录)下的文件拷贝到hadoop1(standby)的hadoop.tmp.dir(工作目录)
scp -r data/ hadoop1:/home/xxx
或者在hadoop1(standby)上执行:hdfs namenode -bootstrapStandby
4.格式化ZKFC
hdfs zkfc -formatZK 在hadoop0(namenode active)上执行即可
5.启动HDFS
sbin/start-dfs.sh 在hadoop0(dataNode 的master)上执行即可
6.启动YARN
sbin/start-yarn.sh 在hadoop0(resourceManager的active)上执行即可
如果在hadoop1(resourceManager的standby)resourceManager没起,则在hadoop1上执行:sbin/yarn-daemon.sh start resourcemanager
7.HDFS web页面 & YARN web页面
HDFS web页面 192.168.0.105:50070或192.168.0.106:50070
YARN web页面 192.168.0.105:8088 resourcemanager cluster 的master
测试
- 杀死namenode(active)这个进程,namenode(standby)的状态会变为active
- hadoop fs -put 传一个大文件过程中,把namenode(active)这个进程杀掉,最后文件仍然上传成功
bin/hdfs dfsadmin -report 查看hdfs的各节点状态信息
bin/hdfs haadmin -getServiceState nn1 获取一个namenode节点的HA状态
sbin/hadoop-daemon.sh start namenode 单独启动一个namenode进程
./hadoop-daemon.sh start zkfc 单独启动一个zkfc进程
https://blog.csdn.net/baidu_28997655/article/details/81906591