hadoop2.0的datanode多目录数据副本存放策略,hadoop2.0datanode


在hadoop2.0中,datanode数据副本存放磁盘选择策略有两种方式:

第一种是沿用hadoop1.0的磁盘目录轮询方式,实现类:RoundRobinVolumeChoosingPolicy.java

第二种是选择可用空间足够多的磁盘方式存储,实现类:AvailableSpaceVolumeChoosingPolicy.java

选择策略对应的配置项是:

  <property>
    <name>dfs.datanode.fsdataset.volume.choosing.policy</name>
    <value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
  </property>

如果不配置,默认使用第一种方式,既轮询选择磁盘来存储数据副本,但是轮询的方式虽然能够保证所有磁盘都能够被使用,但是经常会出现各个磁盘直接数据存储不均衡问题,有的磁盘存储得很满了,而有的磁盘可能还有很多存储空间没有得到利用,所有在hadoop2.0集群中,最好将磁盘选择策略配置成第二种,根据磁盘空间剩余量来选择磁盘存储数据副本,这样一样能保证所有磁盘都能得到利用,还能保证所有磁盘都被利用均衡。

在采用第二种方式时还有另外两个参数会用到:

dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold 

默认值是10737418240,既10G,一般使用默认值就行,以下是该选项的官方解释:

This setting controls how much DN volumes are allowed to differ in terms of bytes of free disk space before they are considered imbalanced. If the free space of all the volumes are within this range of each other, the volumes will be considered balanced and block assignments will be done on a pure round robin basis. 

意思是首先计算出两个值,一个是所有磁盘中最大可用空间,另外一个值是所有磁盘中最小可用空间,如果这两个值相差小于该配置项指定的阀值时,则就用轮询方式的磁盘选择策略选择磁盘存储数据副本。源代码如下:

public boolean areAllVolumesWithinFreeSpaceThreshold() {
      long leastAvailable = Long.MAX_VALUE;
      long mostAvailable = 0;
      for (AvailableSpaceVolumePair volume : volumes) {
        leastAvailable = Math.min(leastAvailable, volume.getAvailable());
        mostAvailable = Math.max(mostAvailable, volume.getAvailable());
      }
      return (mostAvailable - leastAvailable) < balancedSpaceThreshold;
    }


dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction

默认值是0.75f,一般使用默认值就行,以下是该选项的官方解释:
This setting controls what percentage of new block allocations will be sent to volumes with more available disk space than others. This setting should be in the range 0.0 - 1.0, though in practice 0.5 - 1.0, since there should be no reason to prefer that volumes with

意思是有多少比例的数据副本应该存储到剩余空间足够多的磁盘上。该配置项取值范围是0.0-1.0,一般取0.5-1.0,如果配置太小,会导致剩余空间足够的磁盘实际上没分配足够的数据副本,而剩余空间不足的磁盘取需要存储更多的数据副本,导致磁盘数据存储不均衡。

参考:

http://www.it165.net/admin/html/201409/3635.html

http://blog.csdn.net/chenpingbupt/article/details/7972589



hadoop伪分布式 datanode数据存放在哪儿

伪分布式的话,应该是在slave上。集群中的datanode,一般是一个节点一个,负责管理它所在的节点上的存储。

datanode是负责处理文件系统客户端的读写请求的,是在namenode的统一调度下进行工作。namenode是中心服务器,属于master。

关于master、slave,可以在hadoop/..../conf/ 中的master和slave中通过 vi进行编辑配置。
 

hadoop文件存放问题

(1)文件分割后,会有一个 文件 --> block的映射,这个映射是持久化到硬盘中的,具体的映射关系表是在FSNamesystem.java中构建的(该部分的构建使用的是FSDirectory.java的功能,filename - blockset);
有了文件到块的映射表就可以通过文件找到blocklist;
(2)datanode的选取,hadoop有它本身的机制,一般来说,datanode默认是三个,选取的是不同机架的datanode,同机架里选一台,另一个机架里选取两台(安全性等考虑);
(3)block写入datanodes,选取的三个datanode,比如说是A、B、C,先写给A,A再写给B,B再写给C;然后B收到C的写入成功,A收到B的写入成功,然后告诉namenode 和 client写入成功;
(4)真正写的并不是block,而是比block更小的好像是chunk , 还包括有各种校验。
 

相关内容