我与HDFS那些事儿(一)HDFS的数据存储
闲话不多说,就来聊聊这些年与HDFS的那些事儿,我们首先来聊聊HDFS的数据存储。HDFS正是先有了数据的存储,才有后续的写入和管理等操作。数据存储包括两块:
1.内存存储;内存存储是一种十分特殊的存储方式,将会对集群数据的读写性能带来不小的提升。
2.异构存储;异构存贮能够帮助我们更加合理的把数据存到该存的地方。
HDFS内存存储
HDFS的内存存储与HDFS的缓存是有些异同的,大家注意区分。相同之处:都是使用机器的内存作为存储数据的载体。不同之处在于:缓存需要使用HDFS缓存管理命令,更像是改进用户使用的一种功能;而内存存储则使用内存存储策略,直接将内存作为数据存放的载体,可以理解为此时此节点的内存充当了一块“磁盘”,从底层扩展了数据存储方式。
- HDFS内存存储原理
在了解内存存储原理之前大家可能会有这样两个疑问:1.数据临时维护在内存中,服务一旦停止,数据会不会全部丢失;2.如果服务停止时做持久化操作,如果数据量很大,一来内存空间可能不够用,二来大量数据写入磁盘的速度也会很慢;
所以通用的、比较好的做法时异步持久化。
在内存存储新数据的同时,持久化距离当前时刻最远(存储时间最早)的数据。好比有个内存数据块队列,在队列头不断有新增的数据块插入,在队列尾部的块,需要持久化到磁盘,形成一个循环。
HDFS的LAZY_PERSIST内存存储策略用的就是这套方法。 - linux虚拟内存盘
想要将内存当作一块盘来用,需要了解linux中的另一项技术,虚拟内存盘;虚拟内存盘可以在某些特定的内存式存储文件系统下结合使用,比如tmpfs,ramfs。 - HDFS的内存存储流程分析
HDFS文件内存存储策略设置
第一种方式,通过命令行的方式:
hdfs storagepolicies -setStoragePolicy -path <path> -policy LAZY_PERSIST
第二种方法,调用对应的程序方法,比如暴露在外的create文件方法,但是得带上参数CreateFlag.LAZY_PERSIST。
5. LAZY_PERSIST内存存储的使用
第一步,准备内存存储的介质,需要完成虚拟内存盘的配置工作。以tmpfs为例,tmpfs默认式被挂载到/dev/shm,并且大小是32G。也就是说此目录中的数据实际上是存在内存中的。如果想挂载到自己的目录,可以使用以下命令:
sudo mount -t tmpfs -o size=16g tmpfs /mnt/dn-tmpfs/
首先需要将机器中完成好的虚拟内存盘配置到dfs.datanode.data.dir中,其次还要带上RAM_DISK标签。
<property>
<name>dfs.datanode.data.dir</name>
<value>/grid/0,/grid/1,/grid/2,[RAM_DISK]/mnt/dn-tmpfs/</value>
</property>
第二步,是设置具体的文件策略类型。方法参见上文。
HDFS异构存储
HDFS在2.6.0版本引入异构存储。可以各个存储介质读写特性的不同发挥各自的优势。比较适用的场景就是冷热数据的存储。对冷数据采用容量大,读写性能不高的存储介质,对于热数据,采用SSD的方式进行存储。
- 异构存储类型;
RAM_DISK
SSD
DISK
ARCHIVE
四种存储方式速度依次递减。RAM_DISK就是内存存储,SSD不必再解释,对热数据存储在这两种介质中,可以提高效率。ARCHIVE没有特质哪种存储介质,主要指高密度存储介质,用于解决数据扩容的问题,比较适用于存储冷数据。默认的存储类型是DISK。要让HDFS知道存储目录是哪种存储介质,需要配置dfs.datanode.data.dir属性,参考上文。 - 异构存储原理
DataNode通过心跳汇报自身数据存储目录的StorageType给NameNode;
随后NameNode进行汇总并更新集群内各个节点的存储类型情况;
待复制文件根据自身设定的存储策略信息向NameNode请求拥有此类型存储介质的DataNode作为候选节点; - 块存储策略集合
HOT
COLD
WARM
ALL_SSD
ONE_SSD
LAZY_PERSIST
前三种是根据冷热的角度来划分的,后三种是根据存放盘的性质来划分的。ONE_SSD只有第一个块的副本块是此类型的 ,其余全部是DISK。ALL_SSD则是全部是SSD的存储。 - 异构存储的不足之处
用户A在HDFS目录上创建了自己的存储目录/user/A,不设置任何策略,默认是DISK,有一天发现数据不怎么使用了,设置为CLOD,设置setStoragePolicy命令,是否目的就到达了呢?
这里需要额外的执行hdsf -mover命令做文件目录的扫描。在mover命令扫描的过程中如果发现文件目录的实际存储类型与其设置的storagePolicy策略不同,将会进行数据块的迁移。
思考
HDFS的存储,首先要做的是需要区分哪些是经常使用的热数据,哪些是不常使用的冷数据。而这凭感觉多少会很有偏差,以此,对数据资产的管理,清楚的知道哪些数据有用,经常被使用,还是蛮重要的一件事情。