内存存储
HDFS的数据存储由多种,内存存储是其中的一种,其以机器作为数据存储的载体。
内存可能存储的缺点:
1.数据临时保存在内存中,服务一旦停止(或宕机),数据就丢失
2.数据存在内存中,服务停止时持久化到磁盘
为避免以上出现的问题,选用异步持久化的方式处理,即在内存存储新数据时,持久化最旧的数据。
HDFS使用LAZY_PERSIST内存存储策略:
异步存储步骤如下:
l )对目标文件目录设置 StoragePolicy 为 LAZY_PERSIST 的内存存储策略。
2 )客户端进程向 NameNode 发起创建/写文件的请求 。
3 )客户端请求到具体的 DataNode 后 DataNode 会把这些数据块写入 RAM 内存中,同
时启动异步线程服务将内存数据持久化写到磁盘上 。
文件内存存储策略设置
文件存储策略默认使用的是: StoragePolicy.DEFAULT
如果要使用内存存储,可使用如下方法:
1.命令行
hdfs storagepolicies -setStoragePolicy -path <path> -policy LAZY_ PERSIST
2.调用程序
FSDataOutputStream fos =
fs . create(
path ,
FsPermi ssion.getFileDefault() ,第 1童 HDFS的数据存储 令 5
EnumSet.of(CreateFlag.CREATE , CreateFlag.LAZY_ PERSIST) ,
bufferLength,
replicationFactor,
blockSize,
null) ;
// DFSClient 创建文件方法
public DFSOutputStream create(String src , FsPerm工 S sion permission,EnumSet <CreateFlag> flag, short replication, long blocksize,Progressable progress, int buffersize, ChecksumOpt checksumOpt)throws IOException {
return create(src, permiss 工0口 , flag , true,replication, blockSize, progress, buffersize , checksumOpt,nu11);
}
LAZY_PERSIST的使用
因使用的是内存存储,存储介质是RAM_DISK,因此在使用之前需设置虚拟内存。如tmpfs文件系统,tmpfs被挂在到/dev/shm,实际上存储在该目录下的文件是保存在内存中的。
如果想要更改,则进行设置:
sudo mount t tmpf s -o s 工 ze=16g tmpfs /mnt/dn-tmpfs/
将虚拟内存盘设置到dfs.datanode.data.dir中,如:
<property>
<name>dfs.datanode data . dir</name>
<Value>/grid/0 , /grid/l , /grid/2, [RAM_DISK) /mnt/dn-tmpfs</value>
</property>
使用时应确认异构存储策略是否被关闭,属性dfs.storage.policy.enabled
确认是否设置最大内存, dfs.datanode.max.locked.memory,看看是否超过DataNode界定啊的最大内存大小。