加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

HBase 修改备份replication无法生效的原因与解决

(2014-09-09 11:40:07)
标签:

it

分类: 成长之路

我们的存储总量是37T,爬虫每天抓取1T的数据。我们的应用对数据丢失敏感度不高,所以我把备份设为1.但是,发现配置不生效。由于配置文件没有问题,所以断定是配置文件不生效。

下面是不生效的一些详细解答(摘抄自其他网络博客,也有自己的总结。特此感谢原文作者

首先,我们要知道:dfs.replication这个参数是个client参数,即node level参数。需要在每台datanode上设置。一个文件,上传到hdfs上时指定的是几个副本就是几个。以后你修改了副本数,对已经上传了的文件也不会起作用。可以再上传文件的同时指定创建的副本数

hadoop dfs -D dfs.replication=1 -put 70M logs/2

可以通过命令来更改已经上传的文件的副本数:
hadoop fs -setrep -R 3 /

 自动负载均衡hadoop文件:hadoop balancer

 查看当前hdfs的副本数

hadoop fsck -locations
FSCK started by hadoop from /172.18.6.112 for path / at Thu Oct 27 13:24:25 CST 2011
....................Status: HEALTHY
Total size: 4834251860 B
Total dirs: 21
Total files: 20
Total blocks (validated): 82 (avg. block size 58954290 B)
Minimally replicated blocks: 82 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 0 (0.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 3
Average block replication: 3.0
Corrupt blocks: 0
Missing replicas: 0 (0.0 %)
Number of data-nodes: 3
Number of racks: 1
FSCK ended at Thu Oct 27 13:24:25 CST 2011 in 10 milliseconds
The filesystem under path '/' is HEALTHY

某个文件的副本数,可以通过ls中的文件描述符看到
hadoop dfs -ls
-rw-r--r-- 3 hadoop supergroup 153748148 2011-10-27 16:11 /user/hadoop/logs/201108/impression_witspixel2011080100.thin.log.gz

如果你只有3datanode,但是你却指定副本数为4,是不会生效的,因为每个datanode上只能存放一个副本。
hadoop fsck -locations 可以看到相应的提示信息,可以看到副本丢失率为33.33%
/user/hadoop/logs/test.log: Under replicated blk_-45151128047308146_1147. Target Replicas is 4 but found 3 replica(s).
Status: HEALTHY
Total size: 4834251860 B
Total dirs: 21
Total files: 20
Total blocks (validated): 82 (avg. block size 58954290 B)
Minimally replicated blocks: 82 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 82 (100.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 3
Average block replication: 3.0
Corrupt blocks: 0
Missing replicas: 82 (33.333332 %)
Number of data-nodes: 3
Number of racks: 1
FSCK ended at Thu Oct 27 13:22:14 CST 2011 in 12 milliseconds
参考:hdfs_design

下面是一个文件的存储与备份创建过程:

当一个文件上传时,client并不立刻联系namenode,而是先在本地缓存数据,当 HDFS block size时,联系namenodenamenode将文件名插入到文件系统结构中,并为期分配一个数据块。namenodedatanode主机名和数据块的位置来响应client的请求。客户端从本地临时文件中将数据刷新到指定的datanode。当file关闭时,未刷新的临时文件将传输到datanodeclient通知namenode 文件关闭。此时,namenode将文件创建操作提交到永久存储。如果namenodefile closes之前die,则文件丢失。

创建副本
client写文件到hdfs时,像前面提到的,先写文件到本地临时文件,假设设定hdfs的副本系数为3.当缓存的文件达到hdfs block size时,clientnamenode检索一个datanode的列表。该列表包含保存副本的datanode列表。client刷新数据到列表中的第一个datanode。第一个datanode4kb为单位接收数据,将数据写到本地并传输到列表中的第二个datanode,第二个datanode也做同样操作。一个datanode可以从上一个数据管道获取数据,并同时将数据发送到下一个数据管道。

如果你是在hdfs-site.xml设置了dfs.replication,这并一定就得了.如果使用IDE运行时,因为你可能没把conf文件夹加入到你的 projectclasspath里,你的程序运行时取的dfs.replication可能是hdfs-default.xml里的 dfs.replication,默认是3。可能这个就是造成你为什么dfs.replication老是3的原因。

解决办法:

在代码中添加:(HDFSHBase都要这样加上)

Configuration conf=new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/hdfs-site.xml"));

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有