HDFS中的内存存储支持
Posted 程序猿码码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS中的内存存储支持相关的知识,希望对你有一定的参考价值。
Apache Hadoop 2.9.0
原文:
http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/MemoryStorage.html
(如果转发,请标明出处)
介绍
HDFS支持写入 Data Nodes管理的off-heap memory。Data Nodes将异步地将内存中的数据刷到磁盘,从而从性能敏感的IO路径中删除昂贵的磁盘IO和校验和计算,因此我们称这种写入为延迟持久( Lazy Persist)写入。HDFS为延迟持久写入提供了尽力持久化保证。在将副本持久化到磁盘之前,如果节点重新启动,可能会出现罕见的数据丢失。应用程序可以在延迟和持久化之间权衡,选择使用延迟持久写入会减少延迟。
这个特性是从Apache Hadoop 2.6.0开始的,并在 Jira HDFS-6581下开发。
目标使用场景是以低延迟写入相对较低数据量(根据可用内存从几GB到几十GB )的应用程序。内存存储适用于在集群内运行并与HDFS数据节点配置在一起的应用程序。我们已经观察到,网络复制的延迟开销抵消了写入内存的好处。
如果内存不足或未配置,使用延迟持久写入的应用程序将返回DISK存储继续工作。
管理员配置
本节列举应用程序在集群中开始使用这项功能之前所需要的管理步骤。
限制用于内存中副本的RAM
首先决定要专用于内存中副本可用的内存量。设置 hdfs-site.xml中的 dfs.datanode.max.locked.memory 。这个跟集中缓存管理(Centralized Cache Management)特性中的设置是一样的。 Data Node 必须保证用于延迟持久化写和集中缓存管理加起来的内存不会超过dfs.datanode.max.locked.memory配置的内存。
例如,为放置副本到内存来保留32G内存
<property>
<name>dfs.datanode.max.locked.memory</name>
<value>34359738368</value>
</property>
内存并不是在Data Node启动时分配的。
在类似Unix系统中,Data Node中的 “locked-in-memory size” ulimit (ulimit -l)也需要调整(请查看相关部分 OS Limits )。设置此值时,请记住您还需要内存中的空间来处理其他事情,例如Data Node 和应用程序JVM堆以及操作系统页缓存,如果在Data Node上还有一个YARN Node Manager进程也在运行,则 YARN containers也需要占用一部分内存。
在Data Nodes上设置RAM Disks
在每个Data Node上初始化一个RAM disk。RAM Disk 的选择允许在Data Node进程重新启动时实现更好的数据持久性。以下设置将适用于大多数Linux发行版,目前不支持在其他平台上使用RAMDisk 。
选择tmpfs (vs ramfs)
Linux支持2种类型的RAM disks - tmpfs和ramfs。tmpfs的大小受Linux内核的限制,而ramfs的增长会填满所有可用的系统内存。tmpfs有一个缺点,因为它的内容可以在内存压力下交换到磁盘。然而,许多性能敏感型部署在禁用交换(swapping )的情况下运行,因此我们不希望这在实践中成为问题。
HDFS目前只支持使用tmpfs部分,支持ramfs的部分正在进行当中 (See HDFS-8584)。
挂载RAM Disks
使用Unix mount 命令来挂载 RAM Disk分区。例如,在/mnt/dn-tmpfs/下,挂载一个32GB tmpfs分区:
sudo mount -t tmpfs -o size=32g tmpfs /mnt/dn-tmpfs/
建议在/ etc / fstab中创建一个entry,以便在节点重新启动时自动重新创建RAM Disk 。另一个选择是使用/ dev / shm下的子目录,默认情况下,这是在大多数Linux发行版上可用的tmpfs挂载。确保挂载的大小大于或等于 配置的dfs.datanode.max.locked.memory ,否则将在/ etc / fstab中覆盖它。不建议每个Data Node使用多个tmpfs分区进行延迟持久写入。
在RAM_DISK存储类型中标记tmpfs卷
在hdfs-site.xml中通过配置dfs.datanode.data.dir来在RAM_DISK存储类型中标记tmpfs 目录。例如:在一个 Data Node中有3个硬盘卷/grid/0, /grid/1 and /grid/2,并且有一个tmpfs挂载 /mnt/dn-tmpfs,则dfs.datanode.data.dir必须这样设置:
<property>
<name>dfs.datanode.data.dir</name>
<value>/grid/0,/grid/1,/grid/2,[RAM_DISK]/mnt/dn-tmpfs</value>
</property>
这一步骤至关重要。如果没有RAM _ DISK标记,HDFS会将tmpfs卷视为非易失性存储,并且不会将数据保存到永久存储。重新启动节点时将丢失数据。
保证存储策略可用
保证全局的配置中存储策略可用开关打开,默认是可用状态。
应用程序使用
使用 LAZY_PERSIST 存储策略
应用程序指示HDFS可以使用Lazy _ Persist存储策略对文件使用延迟持久写入。设置策略不需要管理权限,可以通过以下三种方式之一进行设置。
针对目录调用hdfs storagepolicies 命令
针对一个目录设置策略会导致这个目录下所有新创建的文件都会应用这一策略。hdfs storagepolicies命令可以像存储策略文档中描述的那样设置策略。
hdfs storagepolicies -setStoragePolicy -path <path> -policy LAZY_PERSIST
针对目录,调用setStoragePolicy 方法
从 Apache Hadoop 2.8.0,开始,应用程序可以在程序中调用 FileSystem.setStoragePolicy来设置策略。
fs.setStoragePolicy(path, "LAZY_PERSIST");
为新文件传递 CreateFlag为 LAZY_PERSIST
当应用程序使用 FileSystem#create API来创建一个新文件时,可以传递 CreateFlag#LAZY_PERSIST。例如:
FSDataOutputStream fos =
fs.create(
path,
FsPermission.getFileDefault(),
EnumSet.of(CreateFlag.CREATE, CreateFlag.LAZY_PERSIST),
bufferLength,
replicationFactor,
blockSize,
null);
----------全文完-------------
备注:
HDFS中的内存存储支持:Memory Storage Support in HDFS
以上是关于HDFS中的内存存储支持的主要内容,如果未能解决你的问题,请参考以下文章