分享

HDFS副本个数与datanode个数问题

cryst2l 发表于 2013-10-25 10:43:13 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 19 60268
最近测试,发现一个:
1、往hdfs上写60M大小的文件,dfs.replication设置为1:
使用1个datanode,该1个datanode下有60M数据;
使用2个datanode,该2个datanode下都有60M数据;
使用3个datanode,该3个datanode下都有60M数据;
使用4个datanode,其中有3个datanode下都有60M数据。
:dfs.replication设置为1,为什么经过测试,看起来好像副本仍然是3个呢吗?
2、往hdfs上写312M大小的文件,dfs.replication设置为4:
使用4个datanode,其中4个datanode下数据的分布:
第一个  第二个 第三个 第四个
64M     64M     64M    64M
56M     64M     64M    56M
           64M     56M    64M
           64M     64M    64M
                      64M   
:从测试结果看,似乎副本仍然是3,而不是4。但是dfs.replication不就是数据需要备份的数量吗吗?
对dfs.replication有点糊涂,请大家帮忙!

已有(19)人评论

跳转到指定楼层
starrycheng 发表于 2013-10-25 10:43:13
似乎我不管怎么设置,副本数一直都是3,设置方法就是修改dfs.replication的值,请大家帮帮忙!
回复

使用道具 举报

top_gloria 发表于 2013-10-25 10:43:13
顶一下,我也没弄明白这些数据是如何分布的,我的dfs.replication是2,但是每个结点里面的数据都是一样的!!
回复

使用道具 举报

oYaoXiang1 发表于 2013-10-25 10:43:13
dfs.replication数量的备份数不一定实时生效,需要一些时间。
你的节点较少,NameNode有可能根据节点数来调节dfs.replication。
Hadoop中的备份策略是尽量均匀的分布在集群内,在访问速度和容错性间进行折中。
Guide里有讲到dfs.replication为3时的策略。第一份一般放在上传的那个client里,第二份放在同client在一个rack的另外一个节点上,第三个就放在另外一个rack的节点上。
回复

使用道具 举报

einhep 发表于 2013-10-25 10:43:13
回复 4# spork
    Guide里讲的dfs.replication为3的策略我明白,但是由于我测试的结果是不管如何设置dfs.replication,副本数都为3个。
你说我的节点较少,NameNode有可能根据节点数来调节dfs.replication,请问那应该至少需要多少个节点才能正常测试出dfs.replication对副本数的影响呢吗?
测试结果(文件大于64M):
1、如果datanode个数是1个,dfs.replication是1,那么所有文件的block都在这一个datanode中。
2、如果datanode个数是1个,dfs.replication是3,那么所有文件的block都在这一个datanode中。
3、如果datanode个数是3个,dfs.replication是1,那么所有文件的block都分布在这3个datanode中,但副本数为3。
4、如果datanode个数是3个,dfs.replication是3,那么所有文件的block都分布在这3个datanode中,但副本数为3。
5、如果datanode个数是4个,dfs.replication是1,那么所有文件的block都分布在这4个datanode中,但副本数为3。
6、如果datanode个数是4个,dfs.replication是3,那么所有文件的block都分布在这4个datanode中,但副本数为3。
请大家帮助!
回复

使用道具 举报

datong838 发表于 2013-10-25 10:43:13
你测试时时如何进行的吗?每一次测试都删除dfs数据和格式化namenode,然后重启hadoop么吗?
回复

使用道具 举报

llike90 发表于 2013-10-25 10:43:13
查了下资料,dfs.replication实质上是client参数,在create文件时可以指定具体replication,属性dfs.replication是不指定具体replication时的采用默认备份数。
文件上传后,备份数已定,修改dfs.replication是不会影响以前的文件的,也不会影响后面指定备份数的文件。只影响后面采用默认备份数的文件。但可以利用hadoop提供的命令后期改某文件的备份数。
我不知道你是采用命令行上传文件还是自己利用DFSClient写客户端上传。
如果是命令行,比较简单,你在hdfs-site.xml修改你要的dfs.replication,然后上传文件即可。
如果你是后者,然后你也在hdfs-site.xml设置了dfs.replication,这并一定就得了,因为你可能没把conf文件夹加入到你的project的classpath里,你的程序运行时取的dfs.replication可能是hdfs-default.xml里的dfs.replication,默认是3。可能这个就是造成你为什么dfs.replication老是3的原因。
你可以试试在创建文件时,显式设定replication。
replication一般到3就可以了,大了意义也不大。
回复

使用道具 举报

qcbb001 发表于 2013-10-25 10:43:13
回复 6# spork
    我每次都会删除每个节点下面的数据,并且格式化的,就是为了保证旧数据的影响。
回复

使用道具 举报

leo_1989 发表于 2013-10-25 10:43:13
回复 7# spork
1、文件上传后,备份数已定,修改dfs.replication是不会影响以前的文件的,也不会影响后面指定备份数的文件。只影响后面采用默认备份数的文件。但可以利用hadoop提供的命令后期改某文件的备份数。
我在上传文件之前,就修改了dfs.replication,目的就是让上传到hdfs上的备份数是dfs.replication指定的个数。
2、我不知道你是采用命令行上传文件还是自己利用DFSClient写客户端上传。
我用的命令行上传:
如:bin/hadoop fs -put a.txt input/
并且,我在上传之前,就在core-site.xml修改了dfs.replication。(我用的0.20.2版本,仅在core-site.xml里面进行了设置,运行正常)
3、replication一般到3就可以了,大了意义也不大。
恩,这个清楚,当时是想测测,发现了这个,所以向大家请教。
[color=]

另外,还有几个想向你请教:
1、hdfs的数据读取速度是不是并不比单机快吗?
(因为客户端连接保存此文件第一个数据块的最近的数据节点获取数据,然后连接此文件下一个数据块的最近的数据节点获取数据。在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。如果是多个副本的情况下,这个也并不是并行的,效率不比单机快)
2、hdfs的数据查询速度是不是也不比单机快吗?
(想想似乎和数据读取差不多)
回复

使用道具 举报

arsenduan 发表于 2013-10-25 10:43:13
dfs.replication设在hdfs-site.xml的了~
1、单client时跟你读普通文件系统差不多的了,但是多client时,就不一样了,hdfs支持并发读取,而且副本有均匀分布在集群内,可加速读取。
2、hdfs支持查询了吗?
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条