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

介绍

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

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

目标用例是可以通过低延迟从写入相对较少量的数据(从几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);
展开阅读全文

Hdfs存储原理

08-22

HDFS实现思想:rn1.hdfs是通过分布式集群来存储文件rn2.文件存储到hdfs集群中去时被切分成blockrn3.文件的block存放在若干Datanode节点上rn4.hdfs文件系统中的文件与真实的block之间有映射关系,有Namenode管理rn5.每一个block在集群中会存储多个副本,可以提高数据可靠性和访问吞吐量rnrn工作原理:客户端存储数据内容到某一个路径下,首先发送申请去Namenode节点。Namenode节点查询存储内容是否存在,若不存在则Namenode返回给客户端许可,客户端将内容分配到Datanode上。rn 客户端存入数据将信息传入Namenode,Namenode将存储记录存入edits log;rn namenode返回客户端存储分配的Datanode;rn 客户端向Namenode中的block中写入存储文件rn 写完一个block将edits log中的记录更新到Namenode的内存中rn Namenode中的内存与fsimage互为镜像,fsimage中存储着数据内容rnrnedits log中的新存储记录与fsimage合并:rn Namenode内存中有元数据,磁盘上的文件fsimage中也存有元数据,而日志edits log中存着最新的存储记录。当edits log中存储记录存满后,SecondaryNamenode进行checkpoint操作:SecondaryNamenode向Namenode发出信号使Namenode停止向edits log中写数据,此时Namenode产生一个新的日志文件New edits log记录客户端上传的文件。而Namenode中的fsimage和edits log被下载到SecondaryNamenode中进行合并成一个新的元数据镜像文件,生成后上传给Namenode。新的元数据文件将替换原来的文件,New edits log也会替换原来的edits log日志。rn 论坛

没有更多推荐了,返回首页