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

HDFS中的内存存储支持

* 介绍 <https://blog.csdn.net/oDaiLiDong/article/details/86188017#Introduction>
* 管理员配置
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Administrator_Configuration>
* 限制副本使用的内存
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Limit_RAM_used_for_replicas_in_Memory>
* 在数据节点上设置RAM磁盘
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Setup_RAM_Disks_on_Data_Nodes>
* 选择tmpfs(vs ramfs)
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Choosing_tmpfs_vs_ramfs>
* 挂载RAM磁盘
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Mount_RAM_Disks>
* 使用RAM_DISK存储类型标记tmpfs卷
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Tag_tmpfs_volume_with_the_RAM_DISK_Storage_Type>
* 确保已启用存储策略
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Ensure_Storage_Policies_are_enabled>
* 应用用法
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Application_Usage>
* 使用LAZY_PERSIST存储策略
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Use_the_LAZY_PERSIST_Storage_Policy>
* 为目录调用hdfs storagepolicies命令
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Invoke_hdfs_storagepolicies_command_for_directories>
* 为目录调用setStoragePolicy方法
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Call_setStoragePolicy_method_for_directories>
* 通过LAZY_PERSIST CreateFlag获取新文件
<https://blog.csdn.net/oDaiLiDong/article/details/86188017#Pass_LAZY_PERSIST_CreateFlag_for_new_files>
<>介绍


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

此功能从Apache Hadoop 2.6.0开始提供,并在Jira HDFS-6581
<https://issues.apache.org/jira/browse/HDFS-6581>下开发。




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

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

<>管理员配置

本节列举了应用程序开始使用这个功能之前所需的步骤。

<>限制用于内存中副本的RAM

首先确定专用于存储在内存中的副本的内存量。在hdfs-site.xml中相应地设置dfs.datanode.max.locked.memory。这与
集中式缓存管理
<http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/CentralizedCacheManagement.html>
功能使用的设置相同。数据节点将确保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)以匹配此参数(请参阅有关操作系统限制
<http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/CentralizedCacheManagement.html#OS_Limits>
的相关部分)。设置此值时,请记住内存中还需要其他内容空间,例如数据节点和应用程序JVM堆以及操作系统页面缓存。如果在与数据节点相同的节点上运行YARN节点管理器进程,则还需要YARN容器的内存。

<>在数据节点上设置RAM磁盘


在每个数据节点上初始化RAM磁盘。RAM磁盘的选择允许跨数据节点进程重启更好的数据持久性。以下设置适用于大多数Linux发行版。目前不支持在其他平台上使用RAM磁盘。

<>选择tmpfs(vs ramfs)


Linux支持使用两种RAM磁盘--tmpfs和ramfs。tmpfs的大小受Linux内核的限制,而ramfs增长以填充所有可用的系统内存。tmpfs有一个缺点,因为它的内容可以在内存压力下交换到磁盘。但是,许多对性能敏感的部署在禁用交换的情况下运行,因此我们不希望这在实践中成为问题。

HDFS目前支持使用tmpfs分区。正在进行对添加ramfs的支持(参见HDFS-8584
<https://issues.apache.org/jira/browse/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卷视为非易失性存储,并且数据不会保存到持久存储中。您将丢失有关节点重新启动的数据。

<>确保已启用存储策略

确保打开存储策略的全局设置启用作为记录在这里
<http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html#Configuration>
。默认情况下,此设置处于启用状

<>应用用法

<>使用LAZY_PERSIST存储策略

应用程序表明HDFS可以将Lazy Persist Writes用于具有LAZY_PERSIST存储策略的文件。管理权限是不是
需要设置策略,它可以通过以下三种方式之一进行设置。

<>为目录调用hdfs storagepolicies命令

在目录上设置策略会使其对目录中的所有新文件生效。在HDFS storagepolicies命令可以被用作中所述设置策略存储策略文档
<http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html#Storage_Policy_Commands>

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);
 

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信