欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hadoop3.2.0 HDFS中的内存存储支持

程序员文章站 2022-07-14 15:17:37
...

介绍

HDFS支持写入由数据节点管理的堆外内存。数据节点将异步刷新内存中的数据到磁盘,从而从性能敏感的IO路径中删除昂贵的磁盘IO和校验和计算,因此我们称这种写入为Lazy Persist写入。HDFS为Lazy Persist Writes提供尽力而为的持久性保证。如果在将副本持久保存到磁盘之前重新启动节点,则可能会丢失数据。应用程序可以选择使用Lazy Persist Writes来换取一些持久性保证,以减少延迟。

此功能从Apache Hadoop 2.6.0开始提供,并在Jira HDFS-6581下开发。

Hadoop3.2.0 HDFS中的内存存储支持

目标用例是可以通过低延迟从写入相对较少量的数据(从几GB到几十GB,具体取决于可用内存)中受益的应用程序。内存存储适用于在群集内运行并与HDFS数据节点并置的应用程序。我们观察到网络复制的延迟开销否定了写入内存的好处。

如果内存不足或未配置,使用Lazy Persist Writes的应用程序将继续工作,退回DISK存储。

管理员配置

本节列举了应用程序开始使用群集中的功能之前所需的管理步骤。

限制用于内存中副本的RAM

首先确定专用于存储在内存中的副本的内存量。在hdfs-site.xml中相应地设置dfs.datanode.max.locked.memory。这与集中式缓存管理功能使用的设置相同。数据节点将确保Lazy Persist Writes和Centralized Cache Management使用的组合内存不超过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挂载。确保mount的大小大于或等于dfs.datanode.max.locked.memory设置,否则在/ etc / fstab中覆盖它。建议不要为每个数据节点使用多个tmpfs分区进行Lazy Persist Writes。

使用RAM_DISK存储类型标记tmpfs卷

使用RAM_ISK存储类型通过hdfs-site.xml中的dfs.datanode.data.dir配置设置标记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 Writes用于具有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");

通过LAZY_PERSIST CreateFlag获取新文件

在使用FileSystem#create API 创建新文件时,应用程序可以传递CreateFlag#LAZY_PERSIST。例如

FSDataOutputStream fos =
        fs.create(
            path,
            FsPermission.getFileDefault(),
            EnumSet.of(CreateFlag.CREATE, CreateFlag.LAZY_PERSIST),
            bufferLength,
            replicationFactor,
            blockSize,
            null);