dfs.datanode.data.dir 配置数据存放的路径

在 HDFS 中,DataNode 将数据块存储到本地文件系统目录中,具体的目录可以通过配置 hdfs-site.xml 里面的 dfs.datanode.data.dir 参数。在典型的安装配置中,一般都会配置多个目录,并且把这些目录分别配置到不同的设备上,比如分别配置到不同的HDD(HDD的全称是Hard Disk Drive)和SSD(全称Solid State Drives,就是我们熟悉的固态硬盘)上。

注意:如下的存储配置里面使用【SSD】的异构配置,至于异构是什么,有什么策略,在下一篇文章中讲解。

如果该数据节点磁盘全是SSD盘,则每个路径前全加[SSD],如果该节点是SSD盘和SATA混合使用,则只在SSD磁盘对应的文件路径前加[SSD]。

dfs.datanode.data.dir

file:///dfs/data1,file:///dfs/data2,[SSD]file:///dfs/data3,[SSD]file:///dfs/data4

磁盘选择策略

当我们往 HDFS 上写入新的数据块,DataNode 将会使用 volume 选择策略来为这个块选择存储的地方。通过参数 dfs.datanode.fsdataset.volume.choosing.policy 来设置,这个参数目前支持两种磁盘选择策略。org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy

org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy

第一种为集群默认的卷轮询方式,实现类:RoundRobinVolumeChoosingPolicy.java

第二种为卷可用空间优先方式,实现类:AvailableSpaceVolumeChoosingPolicy.java

这两种方式的优缺点:采用轮询卷存储方式虽然能保证每块盘都能得到使用,但是在长期运行的集群中由于数据删除和磁盘热插拔等原因,可能造成磁盘空间的不均。所以最好将磁盘选择策略配置成第二种,根据磁盘空间剩余量来选择磁盘存储数据块,这样能保证节点磁盘数据量平衡IO压力被分散。

可以参考一下,我之前写的一篇文章,出现这种问题后,应该如何解决。

基于如上原因,我们一般配置的参数为如下两个:

dfs.datanode.fsdataset.volume.choosing.policyorg.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy

下面的参数是配置各个磁盘的均衡阈值的,默认为10G,在此节点的所有数据存储的目录中,找一个占用最大的,找一个占用最小的,如果在两者之差在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.

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

10737418240

下面的参数是配置block 块存储的偏好,默认值是0.75f,这个值越接近1,存储到剩余磁盘空间大的磁盘上的块越多,建议使用默认值。如下为英文原文。 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

注意:如果配置太小,会导致剩余空间足够的磁盘实际上没分配足够的数据副本,而剩余空间不足的磁盘取需要存储更多的数据副本,导致磁盘数据存储不均衡。

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

0.75f

举例说明

df -h

Filesystem Size Used Avail Use% Mounted on

/dev/root 28G 28G 0 100% /

devtmpfs 7.7G 0 7.7G 0% /dev

/dev/sdb 7.7G 220K 7.7G 1% /dfs/data1

/dev/sdc 7.7G 774M 7.0G 10% /dfs/data2

/dev/sdd 11G 4.0K 11G 1% /dfs/data3

/dev/sde 10G 0 10G 0% /dfs/data4

/dev/sdf 6G 0 6G 0% /dfs/data5

如上所示,/dfs/data{1..5}的所有的 volumes 磁盘可用空间差距没有超过10G,那么这些磁盘得到的最大可用空间和最小可用空间差值就会很小,这时候就会使用轮询磁盘选择策略来存放副本。

df -h

Filesystem Size Used Avail Use% Mounted on

/dev/root 28G 28G 0 100% /

devtmpfs 7.7G 0 7.7G 0% /dev

/dev/sdb 7.7G 220K 7.7G 1% /dfs/data1

/dev/sdc 7.7G 774M 7.0G 10% /dfs/data2

/dev/sdd 11G 4.0K 11G 1% /dfs/data3

/dev/sde 20G 0 20G 0% /dfs/data4

/dev/sdf 6G 0 6G 0% /dfs/data5

如上所示,如果 volumes 磁盘可用空间相差大于10G,那么可用空间策略会将 volumes 配置中的磁盘按照一定的规则分为 highAvailableVolumes 和 lowAvailableVolumes。

具体分配规则是先获取 volumes 配置的磁盘中最小可用空间,加上 balancedSpaceThreshold(10G),然后将磁盘空间大于这个值的 volumes 放到 highAvailableVolumes 里面;小于等于这个值的 volumes 放到 lowAvailableVolumes 里面。

如上图中的最小的磁盘可用空间为/dfs/data5,在此基础上面加上默认的balancedSpaceThreshold(10G)为16G,那么highAvailableVolumes 里面会存放 /dfs/data4 ,lowAvailableVolumes 里面会存放剩下的磁盘。

注意:这里还有一种情况,如果lowAvailableVolumes 中的磁盘,最大剩余的大小都不够存储一个block怎么办?

举一个极端的例子,上述的lowAvailableVolumes 的最大可用磁盘空间为/dfs/data3,剩余11G,突然来了一个block 大小为12G,那么岂不是存不开了?这个时候怎么办?

那么会采用轮询的方式从 highAvailableVolumes 里面获取相关 volumes 来存放副本

其它情况

剩下的情况会以 75%(通过 dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction 参数进行配置,推荐将这个参数设置成 0.5 到 1.0 之间)的概率在 highAvailableVolumes 里面以轮询的方式 volumes 来存放副本;25% 的概率在 lowAvailableVolumes 里面以轮询的方式 volumes 来存放副本。

注意:即使你使用的是基于可用空间的策略,卷(volume)不平衡仍可导致较低效率的磁盘I/O。比如所有新增的数据块都会往新增的磁盘上写,在此期间,其他的磁盘会处于空闲状态,这样新的磁盘将会是整个系统的瓶颈。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐