在 HDFS 中,DataNode 将数据块存储到本地文件系统目录中,具体的目录可以通过配置 hdfs-site.xml
里面的 dfs.datanode.data.dir
参数。在典型的安装配置中,一般都会配置多个目录,并且把这些目录分别配置到不同的设备上,比如分别配置到不同的HDD(HDD的全称是Hard Disk Drive)和SSD(全称Solid State Drives,就是我们熟悉的固态硬盘)上。
当我们往 HDFS 上写入新的数据块,DataNode 将会使用 volume 选择策略来为这个块选择存储的地方。通过参数 dfs.datanode.fsdataset.volume.choosing.policy
来设置,这个参数目前支持两种磁盘选择策略
- round-robin
- available space
dfs.datanode.fsdataset.volume.choosing.policy
参数的默认值是 org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy
。这两种磁盘选择策略都是对 org.apache.hadoop.hdfs.server.datanode.fsdataset.VolumeChoosingPolicy
接口进行实现,VolumeChoosingPolicy
接口其实就定义了一个函数:chooseVolume
如下:
package org.apache.hadoop.hdfs.server.datanode.fsdataset; import java.io.IOException; import java.util.List; import org.apache.hadoop.classification.InterfaceAudience; /** * This interface specifies the policy for choosing volumes to store replicas. */ @InterfaceAudience .Private public interface VolumeChoosingPolicy<V extends FsVolumeSpi> {
/** * Choose a volume to place a replica, * given a list of volumes and the replica size sought for storage. * * The implementations of this interface must be thread-safe. * * @param volumes - a list of available volumes. * @param replicaSize - the size of the replica for which a volume is sought. * @return the chosen volume. * @throws IOException when disks are unavailable or are full. */ public V chooseVolume(List<V> volumes, long replicaSize) throws IOException; } |
chooseVolume
函数对指定的副本从 volumes
里面选定满足条件的磁盘。下面对 Hadoop</