HDFS支持写入由数据节点管理的堆外内存。数据节点将异步将内存中的数据刷新到磁盘,从而从对性能敏感的IO路径中删除了昂贵的磁盘IO和校验和计算,因此我们将这种写入称为“ Lazy Persist”写入。HDFS为懒惰持久写入提供了尽力而为的持久性保证。如果在将副本保留到磁盘之前重新启动节点,则可能会丢失很少的数据。应用程序可以选择使用“持久写入”来权衡一些持久性保证,以减少延迟。
此功能从Apache Hadoop 2.6.0开始可用,并且是在Jira HDFS-6581下开发的。
目标用例是受益于低延迟写入相对少量数据(从几GB到数十GB,具体取决于可用内存)的应用程序。内存存储适用于在群集中运行并与HDFS数据节点并置的应用程序。我们已经观察到,网络复制带来的延迟开销抵消了写入内存的好处。
如果内存不足或未配置,则使用延迟写入的应用程序将继续工作,方法是退回到DISK存储。
首先确定专用于存储在内存中的副本的内存量。在hdfs-site.xml中相应地设置dfs.datanode.max.locked.memory。这与集中式缓存管理功能所使用的设置相同。数据节点将确保“惰性持久写入”和“集中式缓存管理”使用的组合内存不超过dfs.datanode.max.locked.memory中配置的数量。
例如,为内存中的副本保留32 GB
<属性> <name> dfs.datanode.max.locked.memory </ name> <value> 34359738368 </ value> </ property>
启动时,数据节点未分配此内存。
在类似Unix的系统上,还需要增加数据节点用户的“内存大小” ulimit(ulimit -l)以匹配此参数(请参阅OS Limits的相关部分)。设置此值时,请记住,您还需要在内存中留出空间来做其他事情,例如数据节点和应用程序JVM堆以及操作系统页面缓存。如果在与数据节点相同的节点上运行YARN节点管理器进程,则您还将需要用于YARN容器的内存。
在每个数据节点上初始化一个RAM磁盘。RAM磁盘的选择可在整个数据节点进程重新启动时实现更好的数据持久性。以下设置适用于大多数Linux发行版。当前不支持在其他平台上使用RAM磁盘。
Linux支持使用两种RAM磁盘-tmpfs和ramfs。Linux内核限制了tmpfs的大小,而ramfs逐渐增长以填充所有可用的系统内存。tmpfs有一个缺点,因为它的内容可以在内存压力下交换到磁盘上。但是,许多性能敏感的部署在禁用交换的情况下运行,因此我们认为这在实际中不会成为问题。
HDFS当前支持使用tmpfs分区。正在支持添加ramfs(请参阅HDFS-8584)。
使用Unix mount命令挂载 RAM磁盘分区。例如在/ mnt / dn-tmpfs /下挂载32 GB tmpfs分区
须藤安装-t tmpfs -o size = 32g tmpfs / mnt / dn-tmpfs /
建议您在/ etc / fstab中创建一个条目,以便在节点重新启动时自动重新创建RAM磁盘。另一个选择是使用/ dev / shm下的子目录,这是大多数Linux发行版默认可用的tmpfs挂载。确保安装的大小大于或等于dfs.datanode.max.locked.memory设置,否则在/ etc / fstab中覆盖它。不建议在每个数据节点上使用多个tmpfs分区进行延迟持久写入。
通过hdfs-site.xml中的dfs.datanode.data.dir配置设置,用RAM_DISK存储类型标记tmpfs目录。例如,在具有三个硬盘卷/ grid / 0,/ grid / 1和/ grid / 2以及一个tmpfs挂载/ mnt / dn-tmpfs的数据节点上,dfs.datanode.data.dir必须设置如下:
<属性> <name> dfs.datanode.data.dir </ name> <value> / grid / 0,/ grid / 1,/ grid / 2,[RAM_DISK] / mnt / dn-tmpfs </ value> </ property>
此步骤至关重要。如果没有RAM_DISK标签,HDFS会将tmpfs卷视为非易失性存储,并且数据将不会保存到持久性存储中。您将在节点重启时丢失数据。
确保打开存储策略的全局设置启用作为记录在这里。默认情况下,此设置为启用。
应用程序表明HDFS可以使用具有LAZY_PERSIST存储策略的文件使用惰性持久写入。管理权限是不是需要设置策略,它可以通过以下三种方式之一进行设置。
在目录上设置策略会使该策略对目录中的所有新文件生效。在HDFS storagepolicies命令可以用来设置为在所描述的策略存储策略文档。
hdfs storagepolicies -setStoragePolicy -path <路径> -policy LAZY_PERSIST