原创

HDFS中的内存存储支持

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://lidong.blog.csdn.net/article/details/86188017

因工作中olap场景中对性能的极致要求,我们将部分业务数据的hdfs路径的存储策略设置为放在内存中(RAM_DISK)中,这是在hadoop2.6以后的版本支持的。抽空翻译了官网的文章

HDFS中的内存存储支持

介绍

HDFS支持写入由DataNode管理的堆外内存。DataNode将异步刷新内存中的数据到磁盘,从而从性能敏感的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系统上,还需要增加数据节点用户的“锁定内存大小”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卷

使用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 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 创建新文件时,应用程序可以传递FileSystem#create API。例如

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

 

0 个人打赏
文章最后发布于: 2019-01-10 00:03:37
展开阅读全文

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

©️2019 CSDN 皮肤主题: 酷酷鲨 设计师: CSDN官方博客

打赏

开源调度DolphinScheduler

“你的鼓励将是我创作的最大动力”

5C币 10C币 20C币 50C币 100C币 200C币

分享到微信朋友圈

×

扫一扫,手机浏览