《深入HDFS》HDFS异构存储

异构存储

异构存储是Hadoop2.6.0版本出现的新特性,可以根据各个存储介质读写特性不同进行选择。
例如冷热数据的存储,对冷数据采取容量大,读写性能不高的存储介质如机械硬盘,对于热数据,可使用SSD硬盘存储。
在读写效率上性能差距大。异构特性允许我们对不同文件选择不同的存储介质进行保存,以实现机器性能的最大化。

异构类型

1.RAM_DISK(内存)
2.SSD(固态硬盘)
3.DISK(机械硬盘)
4.ARCHIVE(高密度存储介质)

默认使用机械硬盘DISK

public enum StorageType {
    DISK(false),
    SSD(false),
    ARCHIVE(false),
    RAM_DISK(true);

    private final boolean isTransient;
    public static final StorageType DEFAULT = DISK;
    ...
}

其中true和false指是否使用transient,transient代表非持久化,而只有内存存储是transient。
HDFS中根据需要可设置文件存储目录的介质类型,需手动在dfs.datanode.data.dir中声明,如:

[SSD]file:/ / /grid / dn/ssdO

异构存储原理

异构存储工作步骤:

  1. DataNode 通过心跳汇报自身数据存储目录的 StorageType 给 NameNode。
  2. 随后 NameNode 进行汇总并更新集群内各个节点的存储类型情况。
  3. 待复制文件根据自身设定的存储策略信息向 NameNode 请求拥有此类型存储介质的DataNode 作为候选节点。

块存储策略

块存储指的是对hdfs文件的数据块副本储存,其中有6种策略:
HOT
COLD
WARM
ALL_SSD
ONE_SSD
LAZY_PERSIST

前三种根据冷热数据区分,后三种根据磁盘性质区分。
其中不同的策略,规定了适合的储存介质,在创建BlockStoragePolicySuite方法时可知:

    public static BlockStoragePolicySuite createDefaultSuite() {
        BlockStoragePolicy[] policies = new BlockStoragePolicy[16];
        byte lazyPersistId = true;
        policies[15] = new BlockStoragePolicy((byte)15, "LAZY_PERSIST", new StorageType[]{StorageType.RAM_DISK, StorageType.DISK}, new StorageType[]{StorageType.DISK}, new StorageType[]{StorageType.DISK}, true);
        byte allssdId = true;
        policies[12] = new BlockStoragePolicy((byte)12, "ALL_SSD", new StorageType[]{StorageType.SSD}, new StorageType[]{StorageType.DISK}, new StorageType[]{StorageType.DISK});
        byte onessdId = true;
        policies[10] = new BlockStoragePolicy((byte)10, "ONE_SSD", new StorageType[]{StorageType.SSD, StorageType.DISK}, new StorageType[]{StorageType.SSD, StorageType.DISK}, new StorageType[]{StorageType.SSD, StorageType.DISK});
        byte hotId = true;
        policies[7] = new BlockStoragePolicy((byte)7, "HOT", new StorageType[]{StorageType.DISK}, StorageType.EMPTY_ARRAY, new StorageType[]{StorageType.ARCHIVE});
        byte warmId = true;
        policies[5] = new BlockStoragePolicy((byte)5, "WARM", new StorageType[]{StorageType.DISK, StorageType.ARCHIVE}, new StorageType[]{StorageType.DISK, StorageType.ARCHIVE}, new StorageType[]{StorageType.DISK, StorageType.ARCHIVE});
        byte coldId = true;
        policies[2] = new BlockStoragePolicy((byte)2, "COLD", new StorageType[]{StorageType.ARCHIVE}, StorageType.EMPTY_ARRAY, StorageType.EMPTY_ARRAY);
        return new BlockStoragePolicySuite((byte)7, policies);
    }

存储策略速度如下:

在这里插入图片描述

块存储策略的调用

    public static BlockStoragePolicySuite createDefaultSuite() {
        BlockStoragePolicy[] policies = new BlockStoragePolicy[16];
        byte lazyPersistId = true;
        policies[15] = new BlockStoragePolicy((byte)15, "LAZY_PERSIST", new StorageType[]{StorageType.RAM_DISK, StorageType.DISK}, new StorageType[]{StorageType.DISK}, new StorageType[]{StorageType.DISK}, true);
        byte allssdId = true;
        policies[12] = new BlockStoragePolicy((byte)12, "ALL_SSD", new StorageType[]{StorageType.SSD}, new StorageType[]{StorageType.DISK}, new StorageType[]{StorageType.DISK});
        byte onessdId = true;
        policies[10] = new BlockStoragePolicy((byte)10, "ONE_SSD", new StorageType[]{StorageType.SSD, StorageType.DISK}, new StorageType[]{StorageType.SSD, StorageType.DISK}, new StorageType[]{StorageType.SSD, StorageType.DISK});
        byte hotId = true;
        policies[7] = new BlockStoragePolicy((byte)7, "HOT", new StorageType[]{StorageType.DISK}, StorageType.EMPTY_ARRAY, new StorageType[]{StorageType.ARCHIVE});
        byte warmId = true;
        policies[5] = new BlockStoragePolicy((byte)5, "WARM", new StorageType[]{StorageType.DISK, StorageType.ARCHIVE}, new StorageType[]{StorageType.DISK, StorageType.ARCHIVE}, new StorageType[]{StorageType.DISK, StorageType.ARCHIVE});
        byte coldId = true;
        policies[2] = new BlockStoragePolicy((byte)2, "COLD", new StorageType[]{StorageType.ARCHIVE}, StorageType.EMPTY_ARRAY, StorageType.EMPTY_ARRAY);
        return new BlockStoragePolicySuite((byte)7, policies);
    }

    public BlockStoragePolicySuite(byte defaultPolicyID, BlockStoragePolicy[] policies) {
        this.defaultPolicyID = defaultPolicyID;
        this.policies = policies;
    }

块存储策略默认使用HOT,将所有数据都当成热数据。

异构存储策略的缺点

HDFS无法在文件目录存储策略变更时自动进行数据迁移。
存储策略变更有如下两种情况:
原先未设置StoragePolicy ,后来进行了设置 。
原先设置了A策略,后来又设置了B策略。

HDFS存储策略的使用

列出现有存储策略

hdfs storagepolicies -listPolicies

设置指定路径的存储策略

hdfs -setStroagePolicy -path <path> -policy <policy>

获取指定路径的存储策略

hdfs -getStroagePolicy -path <path> 

手动迁移数据

数据迁移工具能扫描HDFS上的文件,如果不满足内部设置的存储策略,就重新迁移数据到目标存储类型节点上

hdfs mover -p <file/dirs> | -f <local file>
发布了83 篇原创文章 · 获赞 3 · 访问量 6395

猜你喜欢

转载自blog.csdn.net/SW_LCC/article/details/104045175