HBase&HDFS异构存储的使用&简单介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bryce123phy/article/details/70388664
使用方式:
首先,开启hdfs异构存储策略,配置项是——dfs.storage.policy.enabled,该配置默认是开启的(true);

第二步,需要将机器物理硬件上已经部署好的磁盘配置添加到hdfs的配置项dfs.datanode.data.dir中,需要注意的对于SSD盘或者RAM_DISK需要打上特殊的标记,类似[SSD]、[RAM_DISK],配置示例如下:
<property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///home/data/data/hadoop/dfs/data/data1,file:///home/data/data/hadoop/dfs/data/data2,file:///home/data/data/hadoop/dfs/data/data3,file:///home/data/data/hadoop/dfs/data/data4,file:///home/data/data/hadoop/dfs/data/data5,file:///home/data/data/hadoop/dfs/data/data6,file:///home/data/data/hadoop/dfs/data/data7,file:///home/data/data/hadoop/dfs/data/data8,file:///home/data/data/hadoop/dfs/data/data9,file:///home/data/data/hadoop/dfs/data/data10,file:///home/data/data/hadoop/dfs/data/data11,file:///home/data/data/hadoop/dfs/data/data12,[SSD]file:///home/data/data/hadoop/dfs/data/data13</value>
        <final>true</final>
</property>
上述配置所在的节点上共有13块盘,不同的硬盘挂载到不同的目录中,其中的第十三块盘是SSD盘,所以被标记为[SSD],如果不加此标记,则HDFS默认所有的盘都是[DISK]。

第三步,指定我们的目标目录存储到SSD盘上。
Hdfs的异构存储是受storage policy控制的,hdfs中共定义了5种不同的storage policy,列表如下:

Policy ID Policy Name Block Placement (n  replicas) Fallback storages for creation Fallback storages for replication
15 Lasy_Persist RAM_DISK: 1, DISK: n-1 DISK DISK
12 All_SSD SSD: n DISK DISK
10 One_SSD SSD: 1, DISK: n-1 SSD, DISK SSD, DISK
7 Hot (default) DISK: n <none> ARCHIVE
5 Warm DISK: 1, ARCHIVE: n-1 ARCHIVE, DISK ARCHIVE, DISK
2 Cold ARCHIVE: n <none> <none>

表格来自于hdfs的官方文档,其中列出了五种不同的storage policy,我们知道hdfs上的block块是多备份存储的,上表中的n就代表block备份的份数,大多数情况下都取为3,以All_SSD策略为例,表示该文件下所属block块的3副本都保存在SSD盘上,如下图中所示:

与ALL_SSD不同的是,ONE_SSD将多副本中的一份放置到SSD上,其它仍然在普通DISK中。
Lazy_Persist策略,如果文件被设置为Lazy_Persist策略,当客户端向该文件发起读写请求,客户端写入的数据会首先被相应Block块的DataNode写入到自己的RAM内存中,同时DN会启动异步线程服务将内存中的数据持久化到磁盘上。这里用到了Linux的RAM disk技术,简单来说就是将内存模拟为一块磁盘,供操作系统读写数据。
Warm&Cold策略,分别适用于温数据和冷数据的存储方案,使用到的ARCHIVE代表的是计算能力比较弱而存储密度比较高的存储介质,如果用户将HDFS上的目录storage policy标记为WARM或COLD,则HDFS会根据将不同storeage policy数据存放在不同的存储介质上,如果是CLOD,数据全部位于ARCHIVE中,WRAM介于hot和cold之间,有一份数据放在DISK上。
hdfs支持在文件使用过程中灵活改变文件的storage policy,hdfs列出了几个storage policy相关的命令,用户可输入hdfs storagepolicies -help查看,如下所示:
$ hdfs storagepolicies -help
[-listPolicies]

List all the existing block storage policies.

[-setStoragePolicy -path <path> -policy <policy>]

Set the storage policy to a file/directory.

<path>    The path of the file/directory to set storage policy
<policy>  The name of the block storage policy

[-getStoragePolicy -path <path>]

Get the storage policy of a file/directory.

<path>  The path of the file/directory for getting the storage policy
其中setStoragePolicy用于指定文件或目录按照-policy指定的storage policy进行存储,getStoragePolicy用于获取path指定的文件或目录的storage policy。

最后,策略生效,使用上述命令将文件或目录的存储策略指定为你需要的策略后,接下来就是让策略生效了,hdfs中提供了一个新的数据迁移工具mover,mover与balancer工具相似都是周期触发的,运行时,它会扫描hdfs中各个文件的block以确认该block块的当前存储是否满足用户指定的storage policy,对于那些storage policy发生变化的block块,该工具会将对应的block块进行迁移。
$ hdfs mover -help
Usage: hdfs mover [-p <files/dirs> | -f <local file>]
	-p <files/dirs>	a space separated list of HDFS files/dirs to migrate.
	-f <local file>	a local file containing a list of HDFS files/dirs to migrate.

Generic options supported are
-conf <configuration file>     specify an application configuration file
-D <property=value>            use value for given property
-fs <local|namenode:port>      specify a namenode
-jt <local|resourcemanager:port>    specify a ResourceManager
-files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.

The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]
下面讲讲hbase如何利用上述hdfs的异构存储特性

HBase-12848(Utilize Flash storage for WAL)是1.1.0新推出的特性,它可以将WAL单独置于SSD上,配置方式是将如下的配置做相应修改:
hbase.wal.storage.policy
该配置的默认值是NONE,也就是wal文件和数据都存储在DISK上,不做区分,可以修改为ONE_SSD或者ALL_SDD,不同在于:
ONE_SSD:wal的一个副本置于SSD上,而其他副本仍然在默认存储;
ALL_SSD:wal文件的所有副本都存储于SSD盘上;
HBase实现异构wal存储很简单,底层依赖的就是hdfs的异构storage策略,不过是将wal文件所在的目录经反射调用dfs client的setStoragePolicy方法设置为用户指定的policy,主要代码如下:
public static void setStoragePolicy(final FileSystem fs, final Configuration conf,
    final Path path, final String policyKey, final String defaultPolicy) {
  String storagePolicy = conf.get(policyKey, defaultPolicy).toUpperCase();
  if (!storagePolicy.equals(defaultPolicy) &&
      fs instanceof DistributedFileSystem) {
    DistributedFileSystem dfs = (DistributedFileSystem)fs;
    Class<? extends DistributedFileSystem> dfsClass = dfs.getClass();
    Method m = null;
    try {
      m = dfsClass.getDeclaredMethod("setStoragePolicy",
          new Class<?>[] { Path.class, String.class });
      m.setAccessible(true);
    } catch (NoSuchMethodException e) {
      LOG.info("FileSystem doesn't support"
          + " setStoragePolicy; --HDFS-7228 not available");
    } catch (SecurityException e) {
      LOG.info("Doesn't have access to setStoragePolicy on "
          + "FileSystems --HDFS-7228 not available", e);
      m = null; // could happen on setAccessible()
    }
    if (m != null) {
      try {
        m.invoke(dfs, path, storagePolicy);
        LOG.info("set " + storagePolicy + " for " + path);
      } catch (Exception e) {
        LOG.warn("Unable to set " + storagePolicy + " for " + path, e);
      }
    }
  }
}

猜你喜欢

转载自blog.csdn.net/bryce123phy/article/details/70388664
今日推荐