以下内容均翻译自官方文档.
介绍
HDFS 支持写入数据节点管理的堆外内存。数据节点会异步地将内存中的数据刷新到磁盘,从而从性能敏感的 IO 路径中删除昂贵的磁盘 IO 和校验和计算,因此我们称之为此类写入惰性持久写入。HDFS 为延迟持久写入提供了尽力而为的持久性保证。在将副本保留到磁盘之前,节点重新启动时可能会丢失很少的数据丢失。应用程序可以选择使用延迟持久写入来换某些持久性保证,以利于减少延迟。
此功能从 Apache Hadoop 2.6.0 开始提供,是在 Jira HDFS-6581 下开发的。

目标用例是能够以低延迟写入相对较少的数据量(从几个 GB 到几十 GB(取决于可用内存)中受益的应用程序。内存存储适用于在集群内运行且与 HDFS 数据节点并存的应用程序。我们已经观察到,网络复制的延迟开销抵消了写入内存的好处。
如果内存不足或未配置,使用惰性持久化写的应用程序将通过回退到磁盘存储继续工作。
管理员配置
本节枚举应用程序在群集中开始使用该功能之前所需的管理步骤。
限制内存中用于副本的 RAM
首先确定要专用于存储在内存中的副本的内存量。在hdfs-site.xml中设置dfs.datanode.max.locked.memory。这与集中式缓存管理功能使用的设置相同。数据节点将确保延迟持久写入和集中缓存管理使用的组合内存不超过 dfs.datanode.max.locked.memory 中配置的内存量。
例如,为内存中的副本保留 32 GB:
<property>
<name>dfs.datanode.max.locked.memory</name>
<value>34359738368</value>
</property>
此内存未由启动时的数据节点分配。
在与 Unix 一样系统上,数据节点用户的"locked-in-memory size" ulimit (ulimit -l) 也需要增加以匹配此参数(请参阅有关操作系统限制的相关部分)。设置此值时,请记住,在内存中还需要空间来处理其他内容,例如数据节点和应用程序 JVM 堆以及操作系统页面缓存。如果存在与数据节点在同一节点上运行的 YARN 节点管理器进程,您还需要 YARN 容器的内存。
在数据节点上设置 RAM 磁盘
在每个数据节点上初始化 RAM 磁盘。RAM 磁盘的选择允许在数据节点进程重新启动时实现更好的数据持久性。以下设置将在大多数 Linux 发行版上有效。当前不支持在其他平台上使用 RAM 磁盘。
选择tmpfs(vs ramfs)
Linux支持使用两种RAM磁盘——tmpfs和ramfs。tmpfs的大小受Linux内核的限制,而ramfs会增长到填满所有可用的系统内存。tmpfs有一个缺点,因为在内存压力下它的内容可以交换到磁盘。然而,许多性能敏感部署在运行时禁用了交换,因此我们不认为这在实践中是一个问题。
HDFS目前支持使用tmpfs分区。对添加ramfs的支持正在进行中(请参阅HDFS-8584)。
安装 RAM 磁盘
Unix Mount命令挂载RAM磁盘分区。例如,在/mnt/dn-tmpfs/下挂载一个32 GB的tmpfs分区:
sudo mount -t tmpfs -o size=32g tmpfs /mnt/dn-tmpfs/
建议您在 etc/fstab 中创建一个条目,以便在节点重新启动时自动重新创建 RAM 磁盘。另一种选择是使用 dev/shm 下的子目录,该子目录是大多数 Linux 发行版默认可用的 tmpfs 装载。确保装载的大小大于或等于 dfs.datanode.max.locked.memory设置,否则在 etc/fstab 中覆盖它。不建议每个数据节点使用多个 tmpfs 分区进行惰性持续写入。
标记RAM_DISK存储类型的tmpfs卷
通过对hdfs-site.xml中的dfs.datanode.data.dir进行配置,使用RAM_DISK存储类型标记tmpfs目录。例如,在有三个硬盘卷/grid/0、/grid/1和/grid/2和tmpfs mount 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 存储策略命令
在目录上设置策略会导致它对目录中的所有新文件生效。hdfs 存储策略命令可用于设置策略,如存储策略文档中所述。
hdfs storagepolicies -setStoragePolicy -path <path> -policy LAZY_PERSIST
目录的调用集存储方法
从 Apache Hadoop 2.8.0 开始,应用程序可以使用 FileSystem.setStorage 政策以编程方式设置存储策略。例如:
fs.setStoragePolicy(path, "LAZY_PERSIST");
通过LAZY_PERSIST文件的创建标志
使用 API FileSystem#create 创建新文件时,应用程序可以传递参数CreateFlag#LAZY_PERSIST。例如:
FSDataOutputStream fos =
fs.create(
path,
FsPermission.getFileDefault(),
EnumSet.of(CreateFlag.CREATE, CreateFlag.LAZY_PERSIST),
bufferLength,
replicationFactor,
blockSize,
null);




