觉得有帮助的,请多多支持博主,点赞关注哦~
HDFS HA 功能通过配置 Active/Standby 两个 nameNodes 实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器。
通过双 namenode 消除单点故障
1、元数据管理方式需要改变:
2、需要一个状态管理功能模块
实现了一个 zkfailover,常驻在每一个 namenode 所在的节点,每一个 zkfailover 负责监控自己所在 namenode 节点,利用 zk 进行状态标识,当需要进行状态切换时,由 zkfailover来负责切换,切换时需要防止 brain split 现象的发生。
3、必须保证两个 NameNode 之间能够 ssh 无密码登录。
4、隔离(Fence),即同一时刻仅仅有一个 NameNode 对外提供服务
ZooKeeper 是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。
HA 的自动故障转移依赖于ZooKeeper 的以下功能:
ZKFC 是自动故障转移中的另一个新组件,是 ZooKeeper 的客户端,也监视和管理NameNode 的状态。
每个运行 NameNode 的主机也运行了一个 ZKFC 进程,ZKFC 负责:
这里先将需要修改的配置文件整体总结一下,后续详细说明配置功能。
1、根据规划,需要四台机器。
2、四台机器完成配置Hadoop完全分布式,123完成zookeeper完全分布式配置。忘记了的可以回去查看我之前的总结。
HA配置,主要修改了core-site.xml、yarn-site.xml、hdfs-site.xml三个配置文件。其他的基本没有改动。
这里将整体总结一下,后边会详细讲作用。
2、yarn-site.xml
<!-- Site specific YARN configuration properties -->
yarn.nodemanager.aux-services</name>
mapreduce_shuffle</value>
</property>
yarn.log-aggregation-enable</name>
true</value>
</property>
yarn.log-aggregation.retain-seconds</name>
604800</value>
</property>
<!--配置uber mode可用-->
mapreduce.job.ubertask.enable</name>
true</value>
</property>
<!--配置ha-->
yarn.resourcemanager.ha.enabled</name>
true</value>
</property>
yarn.resourcemanager.cluster-id</name>
yrc</value>
</property>
yarn.resourcemanager.ha.rm-ids</name>
RM1,RM2</value>
</property>
yarn.resourcemanager.hostname.RM1</name>
biubiubiu03</value>
</property>
yarn.resourcemanager.hostname.RM2</name>
biubiubiu04</value>
</property>
yarn.resourcemanager.zk-address</name>
biubiubiu01:2181,biubiubiu02:2181,biubiubiu03:2181</value>
</property>
yarn.resourcemanager.recovery.enabled</name>
true</value>
</property>
yarn.resourcemanager.store.class</name>
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
3、hdfs-site.xml
dfs.replication</name>
3</value>
</property>
dfs.name.dir</name>
file:///opt/model/hadoop_data/dfs/name</value>
</property>
dfs.data.dir</name>
file:///opt/model/hadoop_data/dfs/data</value>
</property>
dfs.block.size</name>
134217728</value>
</property>
fs.checkpoint.dir</name>
file:///opt/model/hadoop_data/checkpoint/dfs/cname</value>
</property>
fs.checkpoint.edits.dir</name>
file:///opt/model/hadoop_data/checkpoint/dfs/cname</value>
</property>
dfs.webhdfs.enabled</name>
true</value>
</property>
dfs.permissions</name>
false</value>
</property>
<!--配置ha-->
dfs.datanode.max.transfer.threads</name>
4096</value>
</property>
dfs.nameservices</name>
mycluster</value>
</property>
dfs.ha.namenodes.mycluster</name>
NN1,NN2</value>
</property>
dfs.namenode.rpc-address.mycluster.NN1</name>
biubiubiu01:9000</value>
</property>
dfs.namenode.rpc-address.mycluster.NN2</name>
biubiubiu02:9000</value>
</property>
dfs.namenode.servicepc-address.mycluster.NN1</name>
biubiubiu01:53310</value>
</property>
dfs.namenode.servicepc-address.mycluster.NN2</name>
biubiubiu02:53310</value>
</property>
dfs.namenode.http-address.mycluster.NN1</name>
biubiubiu01:50070</value>
</property>
dfs.namenode.http-address.mycluster.NN2</name>
biubiubiu02:50070</value>
</property>
dfs.namenode.shared.edits.dir</name>
qjournal://biubiubiu01:8485;biubiubiu02:8485;biubiubiu03:8485/mycluster</value>
</property>
dfs.journalnode.edits.dir</name>
/opt/model/hadoop_data/dfs/jndata</value>
</property>
dfs.client.failover.proxy.provider.mycluster</name>
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
dfs.ha.fencing.methods</name>
sshfence</value>
</property>
dfs.ha.fencing.ssh.private-key-files</name>
/home/hadoop01/.ssh/id_rsa</value>
</property>
dfs.namenode.edits.dir</name>
/opt/model/hadoop_data/dfs/edits</value>
</property>
dfs.ha.automatic-failover.enabled</name>
true</value>
</property>
</configuration>
<!-- 把两个 NameNode的地址组装成一个集群 mycluster -->
fs.defaultFS</name>
hdfs://mycluster</value>
</property>
<!-- 指定 hadoop 运行时产生文件的存储目录 -->
hadoop.tmp.dir</name>
/opt/model/hadoop-2.7.2/hadoop_data/tmp</value>
</property>
</configuration>
<!-- 完全分布式集群名称 -->
dfs.nameservices</name>
mycluster</value>
</property>
<!-- 集群中 NameNode 节点都有哪些 -->
dfs.ha.namenodes.mycluster</name>
NN1,NN2</value>
</property>
<!-- NN1 的 RPC 通信地址 -->
dfs.namenode.rpc-address.mycluster.NN1</name>
biubiubiu01:9000</value>
</property>
<!-- NN2 的 RPC 通信地址 -->
dfs.namenode.rpc-address.mycluster.NN2</name>
biubiubiu02:9000</value>
</property>
<!-- NN1 的 http 通信地址 -->
dfs.namenode.http-address.mycluster.NN1</name>
biubiubiu01:50070</value>
</property>
<!-- NN2 的 http 通信地址 -->
dfs.namenode.http-address.mycluster.NN2</name>
biubiubiu02:50070</value>
</property>
<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
dfs.namenode.shared.edits.dir</name>
qjournal://biubiubiu01:8485;biubiubiu02:8485;biubiubiu03:8485/mycluster</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
dfs.ha.fencing.methods</name>
sshfence</value>
</property>
<!-- 使用隔离机制时需要 ssh 无秘钥登录-->
dfs.ha.fencing.ssh.private-key-files</name>
/home/hadoop01/.ssh/id_rsa</value>
</property>
<!-- 声明 journalnode 服务器存储目录-->
dfs.journalnode.edits.dir</name>
/opt/model/hadoop_data/dfs/jndata</value>
</property>
<!-- 关闭权限检查-->
dfs.permissions.enable</name>
false</value>
</property>
<!-- 访问代理类:client,mycluster,active 配置失败自动切换实现方式-->
dfs.client.failover.proxy.provider.mycluster</name>
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</
value>
</property>
</configuration>
scp分发到其他节点机器。
dfs.ha.automatic-failover.enabled</name>
true</value>
</property>
ha.zookeeper.quorum</name>
biubiubiu01:2181,biubiubiu02:2181,biubiubiu03:2181</value>
</property>
官方文档:
http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
规划如上,配置rm在3、4台机器上。
修改yarn-site.xml
yarn.nodemanager.aux-services</name>
mapreduce_shuffle</value>
</property>
<!--启用 resourcemanager ha-->
yarn.resourcemanager.ha.enabled</name>
true</value>
</property>
<!--声明两台 resourcemanager 的地址-->
yarn.resourcemanager.cluster-id</name>
cluster-yarn1</value>
</property>
yarn.resourcemanager.ha.rm-ids</name>
rm1,rm2</value>
</property>
yarn.resourcemanager.hostname.rm1</name>
biubiubiu03</value>
</property>
yarn.resourcemanager.hostname.rm2</name>
biubiubiu04</value>
</property>
<!--指定 zookeeper 集群的地址-->
yarn.resourcemanager.zk-address</name>
biubiubiu01:2181,biubiubiu02:2181,biubiubiu03:2181</value>
</property>
<!--启用自动恢复-->
yarn.resourcemanager.recovery.enabled</name>
true</value>
</property>
<!--指定 resourcemanager 的状态信息存储在 zookeeper 集群-->
yarn.resourcemanager.store.class</name>
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore<
/value>
</property>
</configuration>
scp分发到其他节点机器。
# 在biubiubiu01 、biubiubiu02 、biubiubiu03 分别启动zookeeper
[hadoop01@biubiubiu01 model]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop01@biubiubiu02 data]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop01@biubiubiu03 data]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/model/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# 分别jsp
[hadoop01@biubiubiu01 model]$ jps
3361 Jps
3318 QuorumPeerMain
# 在biubiubiu01 、biubiubiu02 、biubiubiu03 分别启动journalnode
[hadoop01@biubiubiu01 hadoop]$ hadoop-daemon.sh start journalnode
[hadoop01@biubiubiu02 hadoop]$ hadoop-daemon.sh start journalnode
[hadoop01@biubiubiu03 hadoop]$ hadoop-daemon.sh start journalnode
# jps查看进程
[hadoopenv@os1 hadoop]$ jps
2041 JournalNode
3361 Jps
3318 QuorumPeerMain
# 仅仅在biubiubiu01上格式化一次
[hadoop01@biubiubiu01 hadoop]$ hdfs namenode -format
# 复制biubiubiu01上的namenode的元数据到第二台biubiubiu02
[hadoop01@biubiubiu01 hadoop_data]$ scp -r /opt/model/hadoop_data biubiubiu02:/opt/model
# 在namenode节点(biubiubiu01、biubiubiu02)格式化zkfc
[hadoop01@biubiubiu01 hadoop_data]$ hdfs zkfc -formatZK
[hadoop01@biubiubiu02 hadoop_data]$ hdfs zkfc -formatZK
# biubiubiu01 启动dfs
[hadoop01@biubiubiu01 model]$ start-dfs.sh
Starting namenodes on [biubiubiu01 biubiubiu02]
biubiubiu02: starting namenode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-namenode-biubiubiu02.out
biubiubiu01: starting namenode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-namenode-biubiubiu01.out
biubiubiu02: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu02.out
biubiubiu01: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu01.out
biubiubiu03: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu03.out
biubiubiu04: starting datanode, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-datanode-biubiubiu04.out
Starting journal nodes [biubiubiu01 biubiubiu02 biubiubiu03]
biubiubiu01: journalnode running as process 2019. Stop it first.
biubiubiu03: journalnode running as process 1927. Stop it first.
biubiubiu02: journalnode running as process 1916. Stop it first.
Starting ZK Failover Controllers on NN hosts [biubiubiu01 biubiubiu02]
biubiubiu01: starting zkfc, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-zkfc-biubiubiu01.out
biubiubiu02: starting zkfc, logging to /opt/model/hadoop-2.7.7/logs/hadoop-hadoop01-zkfc-biubiubiu02.out
# 分别jps查看进程效果
[hadoop01@biubiubiu01 model]$ jps
2305 NameNode
2019 JournalNode
2888 Jps
2777 DFSZKFailoverController
2458 DataNode
1916 QuorumPeerMain
[hadoop01@biubiubiu02 model]$ jps
2321 DFSZKFailoverController
2435 Jps
2071 NameNode
2185 DataNode
1819 QuorumPeerMain
1916 JournalNode
[hadoop01@biubiubiu03 model]$ jps
2032 DataNode
2177 Jps
1927 JournalNode
1822 QuorumPeerMain
[hadoop01@biubiubiu04 model]$ jps
1742 DataNode
1855 Jps
[hadoop01@biubiubiu01 model]$ hdfs haadmin -getServiceState NN1
active
[hadoop01@biubiubiu02 model]$ hdfs haadmin -getServiceState NN2
standby
# 在biubiubiu01 启动yarn
[hadoop01@biubiubiu01 sbin]$ start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-resourcemanager-biubiubiu01.out
biubiubiu04: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu04.out
biubiubiu01: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu01.out
biubiubiu02: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu02.out
biubiubiu03: starting nodemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-nodemanager-biubiubiu03.out
# 在biubiubiu03、biubiubiu04上启动resourcemanager
[hadoop01@biubiubiu03 model]$ yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-resourcemanager-biubiubiu03.out
[hadoop01@biubiubiu03 model]$ jps
2032 DataNode
2416 ResourceManager
1927 JournalNode
2458 Jps
2269 NodeManager
1822 QuorumPeerMain
[hadoop01@biubiubiu04 model]$ yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/model/hadoop-2.7.7/logs/yarn-hadoop01-resourcemanager-biubiubiu04.out
[hadoop01@biubiubiu04 model]$ jps
1907 NodeManager
2044 ResourceManager
1742 DataNode
2078 Jps
[hadoop01@biubiubiu01 sbin]$ yarn rmadmin -getServiceState RM1
standby
[hadoop01@biubiubiu01 sbin]$ yarn rmadmin -getServiceState RM2
active
有很多人测试说,启动了两个NameNode,一个active,一个standby,如果将avtive的手动杀死(kill -9 端口号),不会立刻将standby的切换为active,需要重启才行?
这是因为NameNode节点机器中没有安装psmisc,导致fuser这个命令找不到,所以不能自动切换。
此时需要在NameNode节点机器中安装一下就可以了。
sudo yum install -y psmisc
能不能有多个 NameNode | ||
---|---|---|
NameNode | NameNode | NameNode |
元数据 | 元数据 | 元数据 |
Log | machine | 电商数据/话单数据 |
不同应用可以使用不同 NameNode 进行数据管理
Hadoop 生态系统中,不同的框架使用不同的 namenode 进行管理 namespace。(隔离性)
觉得有帮助的,请多多支持博主,点赞关注哦~