你还在堆机器吗?
你还在依赖大内存吗?
你在为大量的SSD盘成本而心痛吗?
Hadoop异构存储了解一下~
异构存储简言之,就是从硬件设备上进行优化存储和性能,针对冷数据,采用容量大的、读写性能不高的介质存储,比如普通的磁盘;针对热数据,实时进行查询的,经常用到的就用SSD进行存储。
在说Hadoop的异构存储之前我们先来简单了解一下SSD和SATA硬盘各自的优缺点。
优点:无噪音,体积小,速度快,重量轻,发热小
缺点:容量相对小,价格昂贵,数据稳定性不如SATA
优点:容量大,价格低,技术成熟,存储可靠
缺点:速度相对于固态硬盘慢,噪声大
由此可见,SSD硬盘的优势很明显,但是综合考虑成本和数据数据安全的问题,SSD并不能完全取代SATA。
Hadoop在2.6.0版本以后引入了异构存储,就是根据存储介质的不同特性发挥各自的优势。针对不需要多次访问的数据,采用容量大但可以读写性能一般的存储介质存储;而对于需要多次访问的数据,可以采用SSD的方式存储。
RAM_DISK(内存)
SSD(固态硬盘)
DISK(普通硬盘,在HDFS中,如果没有主动声明数据目录存储类型默认都是DISK)
ARCHIVE(没有特指哪种存储介质,主要的指的是计算能力比较弱而存储密度比较高的存储介质,用来解决数据量的容量扩增的问题)
① 存储策略种类
Lazy_persist:一个副本保存在内存RAM_DISK中,其余副本保存在磁盘中
ALL_SSD:所有副本都保存在SSD中
One_SSD:一个副本保存在SSD中,其余副本保存在磁盘中
Hot:所有副本保存在磁盘中,这也是默认的存储策略
Warm:一个副本保存在磁盘上,其余副本保存在归档存储上
Cold:所有副本都保存在归档存储上
② 存储策略相关shell命令
hdfs dfsadmin -setStoragePolicy
--创建文件或目录时,其存储策略未指定,可以使用该命令指定存储策略。
hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx
--为指定路径(数据存储目录)设置指定的存储策略
hdfs storagepolicies -getStoragePolicy -path xxx
--获取指定路径(数据存储目录或文件)的存储策略
hdfs storagepolicies -unsetStoragePolicy -path xxx
--取消存储策略;执行改命令之后该目录或者文件,以其上级的目录为准,如果是根目录,那么就是HOT。
① DataNode通过心跳汇报自身数据存储目录的StorageType给NameNode(数据存储目录的解析/心跳汇报过程)
② 随后NameNode进行汇总并更新集群内各个节点的存储类型情况
③ 待存储文件根据自身设定的存储策略信息向NameNode请求拥有此类型存储介质的DataNode作为候选节点
异构存储更多介绍请参考Haoop官方。
依赖Hadoop中HDFS的异构机制,将HDFS中访问磁盘属性标识为SSD,创建“/data/ssdindex”目录作为索引异构的SSD磁盘目录,并设置One_SSD策略;LSQL结合HDFS将索引结构差异化存储,比如需要多次访问的tim、tip文件可以存储在HDFS的“/data/ssdindex”目录下,其他文件可以存储在HDFS的“/data/index”目录下,对于LSQL来说“/data/ssdindex”和“/data/index”目录是一个整体;如果不设置就默认使用“/data/index”目录。如下图所示:
SSD磁盘只存储tim、tip相关的数据,没有其副本,副本在其他介质的磁盘上。
SSD磁盘只存储【tim、tip】和近3天的【fdx、tip、doc】相关的数据,没有其副本,副本在其他介质的磁盘上。
超过3天的【fdx、tip、doc】相关的数据会设置“/data/ssdindex2”路径中的子目录过期的为Hot,比如:/data/ssdindex2/20180701过期了,需要设置Hot存储策略,然后调用HDFS的mover程序将原来在SSD上的数据块转移到非SSD的磁盘介质上。
tip 词典索引(前缀和后缀指针,该文件需内存加载)
doc 倒排表、词频,页码
fdt 行存,文档值
fdx 行存索引,本身也较小可以一次加进内存,访问频率少
dvd 列存编号:张三->1
dvm 为列存编号对应值:1->年龄
pos 分词位置,分词类型使用保证查询顺序
tim 后缀词块,倒排表指针,需要多次访问。
简言之,就是从硬件设备上进行优化存储和性能,针对冷数据,采用容量大的、读写性能不高的介质存储,比如普通的磁盘;针对热数据,实时进行查询的,经常用到的就用SSD进行存储。
请参考hadoop官方,将存储盘标记为普通盘或者SSD:
http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html
这里做下对比说明:
修改SSD磁盘属性:
在含有SSD磁盘的节点将“hdfs-site.xml”中“dfs.datanode.data.dir”中的SSD磁盘对应的文件路径前面加[SSD],如下所示:
dfs.datanode.data.dir
file:///hdfsdata/1/hdfsdata/data,file:///hdfsdata/2/hdfsdata/data,file:///hdfsdata/3/hdfsdata/data,[SSD]file:///hdfsdata/4/hdfsdata/data, [SSD]file:///hdfsdata/5/hdfsdata/data,[SSD]file:///hdfsdata/6/hdfsdata/data
也可以不同机器分别设置,如下所示:
如果是普通盘这样设置:
dfs.datanode.data.dir
/data1/dfs,/data2/dfs
如果是SSD的盘这里要加[SSD]标识:
dfs.datanode.data.dir
[SSD]/ssd1/dfs,[SSD]/ssd2/dfs
注意:如果该数据节点磁盘全是SSD盘,则每个路径前全加[SSD],如果该节点是SSD盘和SATA混合使用,则只在SSD磁盘对应的文件路径前加[SSD]。
协同存储通常会跟列簇组合使用,在列簇存储里,通过下述方法配置(列簇详细使用方法参考LSQL特性 | 列簇存储):
create columnfamily common_performance (
default at 'cleanday@90,yyyyMMdd' 'index@false' 'store@false' 'ssdindex@tim,doc' 'ssdindex2@fdt,fdx'
);
ssdindex,ssdindex2为不同的协同存储。
hadoop fs -mkdir -p /data/lsqlointer/ssdindex
hadoop fs -mkdir -p /data/lsqlointer/ssdindex2
hadoop fs -mkdir -p /data/lsqlointer/ssdindex3
hadoop fs -mkdir -p /data/lsqlointer/ssdindex4
--Hadoop2.6版本:
hdfs dfsadmin -setStoragePolicy /data/lsqlointer/ssdindex One_SSD
hdfs dfsadmin -setStoragePolicy /data/lsqlointer/ssdindex2 One_SSD
hdfs dfsadmin -setStoragePolicy /data/lsqlointer/ssdindex3 One_SSD
hdfs dfsadmin -setStoragePolicy /data/lsqlointer/ssdindex4 One_SSD
--Hadoop2.7/2.8版本:
hdfs storagepolicies -setStoragePolicy -path /data/lsqlointer/ssdindex -policy One_SSD
hdfs storagepolicies -setStoragePolicy -path /data/lsqlointer/ssdindex2 -policy One_SSD
hdfs storagepolicies -setStoragePolicy -path /data/lsqlointer/ssdindex3 -policy One_SSD
hdfs storagepolicies -setStoragePolicy -path /data/lsqlointer/ssdindex4 -policy One_SSD
--Hadoop2.6版本:
hdfs dfsadmin -setStoragePolicy /data/lsqlointer/ssdindex Hot
hdfs dfsadmin -setStoragePolicy /data/lsqlointer/ssdindex2 Hot
hdfs dfsadmin -setStoragePolicy /data/lsqlointer/ssdindex3 Hot
hdfs dfsadmin -setStoragePolicy /data/lsqlointer/ssdindex4 Hot
--Hadoop2.7/2.8版本:
hdfs storagepolicies -setStoragePolicy -path /data/lsqlointer/ssdindex -policy Hot
hdfs storagepolicies -setStoragePolicy -path /data/lsqlointer/ssdindex2 -policy Hot
hdfs storagepolicies -setStoragePolicy -path /data/lsqlointer/ssdindex3 -policy Hot
hdfs storagepolicies -setStoragePolicy -path /data/lsqlointer/ssdindex4 -policy Hot
--Hadoop2.6版本
hdfs dfsadmin -getStoragePolicy /data/lsqlointer/ssdindex
hdfs dfsadmin -getStoragePolicy /data/lsqlointer/ssdindex2
hdfs dfsadmin -getStoragePolicy /data/lsqlointer/ssdindex3
hdfs dfsadmin -getStoragePolicy /data/lsqlointer/ssdindex4
--Hadoop2.7/2.8版本
hdfs storagepolicies -getStoragePolicy -path /data/lsqlointer/ssdindex
hdfs storagepolicies -getStoragePolicy -path /data/lsqlointer/ssdindex2
hdfs storagepolicies -getStoragePolicy -path /data/lsqlointer/ssdindex3
hdfs storagepolicies -getStoragePolicy -path /data/lsqlointer/ssdindex
配置或取消ONE_SSD模式后,只有新写入的数据才会生效,旧的数据不会迁移过来。旧的数据需要通过mover进行数据的迁移。
hdfs mover /data/ssdindex
以上即为LSQL协同存储的所有用法介绍。LSQL的协同存储与其列簇存储功能相结合,通过列簇实现综合使用不同类型硬盘的能力,可以大幅度降低集群中的固态硬盘的使用量,使固态硬盘可以降低到原先的二分之一,甚至十分之一,大幅缩减了硬件的使用成本。现在登陆LSQL官网:www.lucene.xin,还可以免费试用喔~
关注录信数软官方公众号,录信团队欢迎优秀的你!