hdfs内存存储的策略是异构持久化(LAZY_PERSIST),在内存存储新数据的同时,持久化先前存储的数据,新的数据块不断加入,老的快不断从内存切换到磁盘。原理如下图所示。
客户端向namenode发起数据块请求(创建/追加)
namenode返回具体的datanode
client进程和datanode进程通信
datanode进程写数据到内存
返回写数据结果到client进程
本步骤是个异步的过程,检查是否满足落盘条件,满足时写入磁盘
设置内存策略
想让文件存放在内存中,我们需要设置内存策略(默认策略是DEFAULT,存储在磁盘),两种方法设置内存策略。
挂载tmpfs
挂载一块内存到linux文件系统,以tmpfs为例(目前hdfs仅支持tmpfs,ramfs还在开发中),默认情况下tmpfs挂载到/dev/shm,我们自己再挂载2g内存到/mnt/dn-tmpfs,操作步骤如下:
[root@node11 local]# mkdir /mnt/dn-tmpfs[root@node11 local]# mount -t tmpfs -o size=2g tmpfs /mnt/dn-tmpfs/[root@node11 local]# df -hFilesystem Size Used Avail Use% Mounted on /dev/mapper/vg_node11-lv_root 50G 26G 21G 56% / tmpfs 7.8G 72K 7.8G 1% /dev/shm /dev/sda1 485M 39M 421M 9% /boot /dev/mapper/vg_node11-lv_home 42G 596M 39G 2% /home /opt/de/DataEngine-E0103P01-RHEL6-X86_64/iso/CentOS-6.5-x86_64-bin-DVD1.iso 4.2G 4.2G 0 100% /media/cdrom tmpfs 2.0G 0 2.0G 0% /mnt/dn-tmpfs
可以看出,有两块内存盘,分别为/dev/shm和/mnt/dn-tmpfs。我们每个datanode节点做一次上述步骤,挂载个tmpfs。大家可以参考一些网上博文,将挂载关系写到/etc/fstab下,这样将会在节点启动时自动挂载好。
查看hdfsdatanode其他目录的用户及用户组,并设置dn-tmpfs
ll /hadoop/hdfs/data chown hdfs:hadoop /mnt/dn-tmpfs/
配置hdfs
修改hdfs-site.xml,添加挂载好的tmpfs,注意要加上RAM_DISK,否则默认使用DISK存储。
<property> <name>dfs.datanode.data.dir</name> <value>/hadoop/hdfs/data,[RAM_DISK]/mnt/dn-tmpfs</value></property>
获取hdfs有哪些存储策略:
[hdfs@node1 local]$ hdfs storagepolicies -listPolicies Block Storage Policies: BlockStoragePolicy{COLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]} BlockStoragePolicy{WARM:5, storageTypes=[DISK, ARCHIVE], creationFallbacks=[DISK, ARCHIVE], replicationFallbacks=[DISK, ARCHIVE]} BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]} BlockStoragePolicy{ONE_SSD:10, storageTypes=[SSD, DISK], creationFallbacks=[SSD, DISK], replicationFallbacks=[SSD, DISK]} BlockStoragePolicy{ALL_SSD:12, storageTypes=[SSD], creationFallbacks=[DISK], replicationFallbacks=[DISK]} BlockStoragePolicy{LAZY_PERSIST:15, storageTypes=[RAM_DISK, DISK], creationFallbacks=[DISK], replicationFallbacks=[DISK]}
创建test目录,并设置存储策略为LAZY_PERSIST
[hdfs@node1 local]$ hdfs dfs -mkdir /test/ [hdfs@node1 local]$ hdfs storagepolicies -setStoragePolicy -path /test/ -policy LAZY_PERSIST Set storage policy LAZY_PERSIST on /test/
[hdfs@node1 hadoop-hdfs]$ hdfs storagepolicies -getStoragePolicy -path /test/ The storage policy of /test/: BlockStoragePolicy{LAZY_PERSIST:15, storageTypes=[RAM_DISK, DISK], creationFallbacks=[DISK], replicationFallbacks=[DISK]}
上传一个文件测试,通过df -h可以看出,/mnt/dn-tmpfs已存入数据。
[hdfs@node1 hadoop]$ hdfs dfs -put mapreduce.tar.gz /test/ [hdfs@node1 hadoop]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_node11-lv_root 50G 27G 20G 58% / tmpfs 7.8G 72K 7.8G 1% /dev/shm /dev/sda1 485M 39M 421M 9% /boot /dev/mapper/vg_node11-lv_home 42G 596M 39G 2% /home /opt/de/DataEngine-E0103P01-RHEL6-X86_64/iso/CentOS-6.5-x86_64-bin-DVD1.iso 4.2G 4.2G 0 100% /media/cdrom tmpfs 2.0G 203M
作者:dingyuanpu
链接:https://www.jianshu.com/p/b584991889ce