可能出现数据丢失的异常情况:
异常情况一:多个主机上同时(一分钟内)出现磁盘损坏时,可能导致同一block的数据及副本同时丢失,hdfs无法进行恢复,进而导致block丢失。
异常情况二:一个主机磁盘出现损坏,hdfs已经检测到,正在进行副本恢复过程中,又有其他主机出现磁盘损坏,从而导致没有及时恢复的block丢失。
使用数据冗余方案来防止block丢失:
原理:数据冗余方案实质上是通过增加block数据副本数来防止block丢失,通过牺牲存储来保证数据安全。本方案主要针对于解决异常情况一。hadoop集群目前默认设置的数据副本数为3,也就是说最多能同时容忍不同主机的二块盘出现损坏,当出现不同主机三块盘同时损坏时,就可能出现block丢失情况。
方法:
(1)hadoop集群动态设置block副本:
将/user文件夹下的数据设置5个副本:
hadoop fs -setrep 5 -R /user
(2)hadoop集群整体提高block副本数方法:
通过ambari修改hdfs配置文件:
可以修改为5,则设置集群数据副本数为5.
保存并重启hdfs生效。
注:这样即使三台主机的磁盘出现损坏,这个文件夹的数据也不会丢。除非同时五台主机的磁盘出现损坏,这个文件夹下的数据才可能丢失。
2.加快副本恢复速度来防止block丢失
原理:当一个主机的磁盘出现损坏时,集群会立刻对这块盘上的数据通过副本机制恢复到其它主机上。磁盘存储数据量越大,恢复时间会随之增长。我们通过优化hadoop集群的副本恢复参数来提升它的副本恢复速度,从而整体缩短副本恢复时间。本方案主要针对于解决异常情况二,防止出现数据恢复过程中的数据丢失。
方法:
通过ambari添加如下参数:
dfs.namenode.replication.work.multiplier.per.iteration 100
dfs.namenode.replication.max-streams 100
dfs.namenode.replication.max-streams-hard-limit 200
通过ambari保存配置并重启hdfs服务即可。
3.使用机架感知防止同一机架内坏盘导致数据丢失。
原理:hadoop集群配置机架感知后,同一机架内的所有主机只存储block数据的1~2个副本,总会有一个副本在其它机架。当同一机架内多个主机出现坏盘情况时,至少还有一个block副本可以提供访问和恢复,不会出现block数据丢失情况。
方法:
hadoop集群本身自带机架感知功能,在集群部署是没有使用的话,那么集群所有主机默认在一个机架下: /default-rack
可以通过ambari添加机架感知功能,具体操作如下(两种方法,选其中一个即可):
单个主机设置:
批量设置:
2. 设置完成后,需要重启hdfs 、mapreduce。
3.查看机架命令:
hadoop dfsadmin -printTopology
网友评论