设为首页 加入收藏

TOP

Hdfs 环境搭建
2019-04-23 00:08:49 】 浏览:62
Tags:Hdfs 环境 搭建

之前我们搭建了hdfs集群环境,但是这个存在单点问题和内存限制,并不是高可用的,这一节我们就来搭建高可用HDFS集群。

亲自试验过可以做到单点故障切换!

HDFS2.x HA

解决HDFS1.0中单点故障和内存受限问题

随着数据越来越多,NameNode的内存使用会暴增而受限,且一个集群中只有一个NameNode,一旦宕机则集群不可用。

解决NameNode单点故障:

HDFS HA:通过主备NameNode解决,如果主NameNode发生故障,则切换到备NameNode上

解决NameNode内存受限问题

HDFS Federation(联邦,使用较少,官方提供的内存受限解决办法,用起来独立的,其实在一个集群中)

NameNode HA:

  1. 水平扩展,支持多个NameNode
  2. 每一个NameNode分管一部分目录
  3. 所有NameNode共享所有DataNode存储资源

2.x只是架构上发生了变化,使用方式不变

HDFS使用者透明

HDFS 1.x中的命令和API仍可以使用

【HA】集群

在企业中基本90%都会用到HA,很少用联邦。

假设集群中只有两个NameNode,而一个集群中只能有一个工作的nameNode,成为Active NN,而其他NameNode称为Standby NN.而Standby功能是来接管Active NN,也就是接管NN的所有功能。

NN有两大功能:1 接收客户端的读写服务。2 NN可以存放元数据

元数据:有两种,一个fsimage,一个edits。

NameNode第一次初始化产生metadata元数据fsimage的时间,是在NameNode执行Format格式化命令的时候。此时hdfs还没有启动。

Fsimage同步

提问:

假如Active和Standby两个NN都格式化format了,因为格式化是根据当前系统时间(毫秒级别,不可能一模一样)和系统环境来初始化fsimage,他们的id号是不一样的。所以他们的fsimage数据是不一样的。那么Standby到时候接管Active的fsimage元数据不一样该怎么办?

解决办法:是让其中一个NN格式化后得到的fsimage,另外一个NN就一定不要格式化了,直接拷贝已经格式化的元数据即可。这就保证两个NN的fsimage元数据一模一样,到时候为接管提供条件。

最初在Active NameNode产生的edits元数据日志文件(edits文件是客户端对文件进行增删改查时实时产生的),当activeNN瞬间挂掉的时候,standbyNN也是没有edits文件的,一样不能接管成功!怎么办?办法是edits共享。

Edits共享

解决办法:将edits文件共享,不要保存在是Active NN中,而要保存在共享的磁盘中。

但是这样做不好地方在于共享的机器挂掉的话,还是不能解决问题。

所以,最好的解决办法是:

当内存元数据有增删改查的时候,edits日志上传到一个叫JN(JournalNode)的集群中,只要集群中任何一台机器有edits文件,则edits数据就不会丢失,edits与fsimage合并也是JN帮我们做。

JN在进行edits与fsimage合并的时候,需要注意的是:

JN集群须要合并两个NameNode(active主和standby备)的fsimage,因为standby NN要保证随时能接管active NN,所以两个fsimage要保证同步。

当Active瞬间挂掉的时候,standbyNN瞬间接管,之后它的edits日志也会写到JournalNode集群中。

细节

1 JournalNode会合并fsimage和edits,但是它同时合并active和standby两个fsimage,以保证两个NN的fsimage元数据一致。

2 DataNode启动的时候汇报自己的位置信息给NN,一样要同时向active和standby汇报,因为两个NameNode都需要block的位置信息,从而保证可以实现瞬间接管。

3 综上,active和standby不同之处仅仅在于,standby因为不是活动的,所以不接收客户端的读写请求。但是standby的元数据fsimage是一模一样的!

总结一下

  1. 怎么保证两个NameNode的fsimage一模一样?

答:首先,Active NameNode格式化的时候生成的fsimage会拷贝到standby NameNode。

其次,DataNode启动时汇报自己的位置信息给active和standby两个NameNode。

第三,active NameNode的edits文件上报给了JN集群,JN集群同时合并active和standby两个NameNode的两个fsimage文件。

系统启动的时候必须选择出谁是ActiveNN,谁是standbyNN。通过zk选举实现。

  1. FailOverController怎么借助ZK进行故障转移的?

答:1 FailOverController节点帮助集群切换NameNode状态从standy切换为active,FailOverController和NameNode一一对应,就是active和standy各有一个FailOverController节点。

2 FailOverController对NameNode做健康检查,如果active NN出现宕机则汇报给zk集群,zk集群从standby NN中选择一台作为Active NN。

Tips:即使没有zk,我们也可以使用命令的方式切换NameNode。

搭建zk环境参考:https://blog.csdn.net/shengqianfeng/article/details/79513067

修改原HADOOP集群---搭建HDFS HA

停止hadoop进程:

#stop-dfs.sh

通过jps命令验证三台是否都停止!

删除masters

删除NAMENode(node1)节点的masters

由于hdfs HA不再需要SecondrayNameNode做为辅助NameNode进行fsimage跟edits日志合并,所以删除掉。


  1. # cd /root/hadoop-2.5.1/etc/hadoop

  2. # rm –rf masters

删除原集群数据

删除原来的数据文件

rm -rf /opt/hadoop-2.5

core-site.xml


  1. <configuration>

  2. <property>

  3. <!-- 客户端使用此uri访问我们的hdfs HA集群 -->

  4. <name>fs.defaultFS</name>

  5. <value>hdfs://laoxiang</value>

  6. </property>

  7. <property>

  8. <name>hadoop.tmp.dir</name>

  9. <value>/opt/hadoop-2.5</value>

  10. </property>

  11. <property>

  12. <name>ha.zookeeper.quorum</name>

  13. <value>node1:2181,node2:2181,node3:2181</value>

  14. </property>

  15. </configuration>

hdfs-site.xml

编辑 hdfs-site.xml

#vi hdfs-site.xml

删除<configuration>节点之间的配置


  1. <configuration>

  2. <property>

  3. <name>dfs.nameservices</name>

  4. <!--标识单hdfs实例 这个值可以自由定义 -->

  5. <value>laoxiang</value>

  6. </property>

  7. <property>

  8. <!--定义单hdfs实例下nameNode的ID列表,如下nn1和nn2 -->

  9. <name>dfs.ha.namenodes.laoxiang</name>

  10. <value>nn1,nn2</value>

  11. </property>

  12. <property>

  13. <!-- 分别定义多个namenode的主机和端口,rcp协议作为客户端上传和下载使用 -->

  14. <name>dfs.namenode.rpc-address.laoxiang.nn1</name>

  15. <value>node1:8020</value>

  16. </property>

  17. <property>

  18. <name>dfs.namenode.rpc-address.laoxiang.nn2</name>

  19. <value>node4:8020</value>

  20. </property>

  21. <property>

  22. <name>dfs.namenode.http-address.laoxiang.nn1</name>

  23. <value>node1:50070</value>

  24. </property>

  25. <property>

  26. <name>dfs.namenode.http-address.laoxiang.nn2</name>

  27. <value>node4:50070</value>

  28. </property>

  29. <property>

  30. <!--用来配置journalNode上共享edits文件的集群,主机和监听端口号,后边加一个目录。可以随意取名 -->

  31. <name>dfs.namenode.shared.edits.dir</name>

  32. <value>qjournal://node2:8485;node3:8485;node4:8485/abc</value>

  33. </property>

  34. <property>

  35. <!--固定配置:帮助客户端查找并连接zk中活动的namenode的java类 -->

  36. <name>dfs.client.failover.proxy.provider.laoxiang</name>

  37. <value>

  38. org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

  39. </value>

  40. </property>

  41. <property>

  42. <!-- 帮助namenode进行状态切换,通过远程名称方式 -->

  43. <name>dfs.ha.fencing.methods</name>

  44. <value>sshfence</value>

  45. </property>

  46. <property>

  47. <name>dfs.ha.fencing.ssh.private-key-files</name>

  48. <value>/root/.ssh/id_dsa</value>

  49. </property>

  50. <property>

  51. <!-- journalnode存放共享的edits文件目录,用在journalnode节点上 -->

  52. <name>dfs.journalnode.edits.dir</name>

  53. <value>/opt/journalnode</value>

  54. </property>

  55. <!—启动自动故障切换 -->

  56. <property>

  57. <name>dfs.ha.automatic-failover.enabled</name>

  58. <value>true</value>

  59. </property>

  60. </configuration>

拷贝HA集群配置文件

配置完成后,拷贝node1配置文件到node2、node3、node4


  1. scp ./* root@node2:/root/hadoop-2.5.1/etc/hadoop/

  2. scp ./* root@node3:/root/hadoop-2.5.1/etc/hadoop/

  3. scp ./* root@node4:/root/hadoop-2.5.1/etc/hadoop/

启动journalnode集群

启动单节点node2、node3、node4上的journalnode:


  1. #hadoop-daemon.sh start journalnode

  2. # tail -200 /root/hadoop-2.5.1/logs/hadoop-root-journalnode-node2.log

查看日志,没报错!

Node2、node3、node4都要启动

格式化NN

同步node1和node4两个namenode的fsimage元数据:

注意前提是启动JournalNode才能格式化,两个nn任选一个即可,我选node4:

#hdfs namenode -format

报错!原来是node4没有设置到node2、node3、node4的免登录!

重新格式化!成功!

拷贝fsimage

拷贝node4的fsimage文件到node1

切换到node1机器进行拷贝fsimage

# scp -r root@node4:/opt/hadoop-2.5 /opt

另一种方法:

启动刚刚格式化的namenode:

#hadoop-daemon.sh start namenode

在没有格式化的namenode上执行:

#hdfs namenode –bootstrapStandby

启动第二个namenode

Tips:启动单个datanode命令:

#hadoop-daemon.sh start datenode

格式化ZK

初始化hdfs hA在zk中的状态:

#hdfs zkfc -formatZK

只要在任何一个namenode上执行即可,我选择node1

OK!

启动HA集群

#关闭全部节点

stop-dfs.sh

我们启动node1:

#start-dfs.sh

报了两个错误!修改hdfs-site.xml文件

stop-dfs.sh,重启!

成功启动,没报错!

测试并验证故障转移

打开浏览器:http://node1.50070/

active

访问:http://192.168.98.98.50070/

standby

Kill掉node1的namenode,看下是否会切换到node4

可以看到已经切换了:

之前一直出现缺少fuser命令,可以安装


  1. #yum provides "*/fuser"

  2. #yum -y install psmisc

然后我们把node1启动起来:

#hadoop-daemon.sh start namenode

依然是standby状态,虽然之前是active,但是再次启动不会再变成active

手动命令

#hdfs haadmin

-transitionToActive:将nameNode变成Avtive

拒绝,告诉我们要关闭自动切换才能使用

-transitionToStandby:将namenode变成standby

-failover:同样是手动切换

-getServiceState:获得原始状态

-checkHealth:健康检查

【Federation】联邦集群

三个独立的NN联合在一起组成一个大的集群,所有NN共享DataNode,每个NN可以配置“HA“方式。

--------------------- 作者:Jeff.Sheng 来源:CSDN 原文:https://blog.csdn.net/shengqianfeng/article/details/82715578utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇HDFS的垃圾回收站 下一篇Java实在读取HDFS写入CSV

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目