HDFS 的内存存储是什么?
引言
HDFS 的定位就是一个文件系统,用于存储文件,而 HDFS 对于文件的存储方式有两种:
内存存储
异构存储
内存存储
什么是内存存储?
首先,我们来了解一下到底什么是 “内存存储”?
那还用说嘛,当然就是使用内存来存储数据的方式咯!是的,在 HDFS 中,“内存存储” 就是我们常听到的 " LAZY_PERSIST "。
我们可以在 HDFS 上创建某个文件时设定它的存储模式为 "LAZY_PERSIST" 模式,如此一来,后续在这个文件上所追加的所有数据都会被直接保存在对应数据节点的内存上。而使用内存来作为数据的存储介质的好处想必就不用我多说了,但同时在内存上保存数据的坏处也很让人头疼啊。内存的容量小、掉电数据尽数丢失,无论哪一个问题都能让相关人员头皮炸裂。但又不能为了避免这些风险而完全放弃内存存储,毕竟它的好处也实在是太诱人了。
那怎么办呢?尽可能地去解决它的缺点呗!最合适的解决方案就是 “异步持久化” 了。
什么是 “异步持久化”?
说白了就是对于使用内存存储模式的那些文件数据,再另外开一个线程,在后台将一些老旧的数据持久化到磁盘上去,在系统正常停服时,可能只需要很短的时间就能将剩余的在内存中的数据全部持久化到磁盘中去了,而对于服务器掉电、宕机等情况,可能也只是损失一小部分数据而已,工程师们是能够容忍一小部分数据丢失的情况的 。而这个 “异步持久化” 过程对于终端用户而言是透明的。也正是由于这种延时落地数据到磁盘的机制,才使得内存存储得到一个 "LAZY_PERSIST" 的英文名称。
如何使用内存存储模式?
那前面我们了解了内存存储的基本概念以后,在日常开发过程中又要如何来使用内存存储模式呢?
其实可以有两种方式来设置使用内存存储模式:
命令行设置
使用命令行设置的方式,可以使用如下命令
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>
但是一定要注意,只能给目录设置。下面是一条使用命令设置内存存储模式的实例
[root@hdp-01 ~]$ hdfs storagepolicies -setStoragePolicy -path lemontea2 -policy LAZY_PERSIST
Set storage policy LAZY_PERSIST on lemontea2
上面的命令表示我在 . 目录下创建了一个 lemontea2 目录,并将这个目录设置成 LAZY_PERSIST 模式,后续所有在这个目录下创建的文件都会以内存存储模式来保存。
Java 代码设置
使用 Java 代码来设置的方式也是发生在文件创建时。我们可以发现在 org.apache.hadoop.fs.FileSystem 抽象类中有这样一个方法
public FSDataOutputStream create(Path f,
FsPermission permission,
EnumSet<CreateFlag> flags,
int bufferSize,
short replication,
long blockSize,
Progressable progress) throws IOException {
return create(f, permission, flags, bufferSize, replication,
blockSize, progress, null);
}
这个方法中的参数 flags 就是用于设置存储模式的,这个 flags 所支持的所有模式有如下所示
CreateFlag specifies the file create semantic. Users can combine flags like:
EnumSet.of(CreateFlag.CREATE, CreateFlag.APPEND)
Use the CreateFlag as follows:
1. CREATE - to create a file if it does not exist,else throw FileAlreadyExists.
2. APPEND - to append to a file if it exists,else throw FileNotFoundException.
3. OVERWRITE - to truncate a file if it exists,else throw FileNotFoundException.
4. CREATE|APPEND - to create a file if it does not exist,else append to an existing file.
5. CREATE|OVERWRITE - to create a file if it does not exist,else overwrite an existing file.
6. SYNC_BLOCK - to force closed blocks to the disk device.In addition Syncable.hsync() should be called after each write,if true synchronous behavior is required.
7. LAZY_PERSIST - Create the block on transient storage (RAM) ifavailable.
8. APPEND_NEWBLOCK - Append data to a new block instead of end of the lastpartial block.
我们在 Java 代码中创建某个文件时使用这个方法来创建就可以设置了。
内存存储模式在 DataNode 中如何运转?
在 DataNode 中有三种角色共同参与到内存存储模式的 “日常运维” 过程中去。
RamDiskReplicaLruTracker:它是一个大管家,负责整理整个内存中所有的数据信息。
LazyWriter:它是一个监督员,它的任务就是不断地从数据块列表中取出数据,好将它扔给第三个角色来将数据持久化到磁盘中去。
RamDiskAsyncLazyPersistService:它本质上是一个线程池,但是专门负责将数据持久化到磁盘中去。
开发过程中如何使用内存存储模式?
我们知道,内存存储模式是将数据保存在内存上的,但我们的 HDFS 的数据文件说白了还是在我们的物理机器的本地文件系统上。HDFS 的数据不能真的在接收到以后直接就缓存在电脑内存中。
那有什么办法可以让 HDFS 在做了这种写出数据到本地文件系统,实际上又还是在内存上保存的方法呢?
答案就是 Linux 的虚拟硬盘。
虚拟硬盘其实就是将内存映射成硬盘,像访问硬盘一样来访问内存。那关于 Linux 虚拟硬盘的设置这里也不详说了,总之就是将 /dev/shm 节点以 tmpfs 的模式挂载到某个目录下,然后再将这个目录填到 hdfs-site.xml 中去。
总的来说,要想使用内存存储模式,得满足以下三个条件:
- 确保本地文件系统中有虚拟硬盘的存在,并将它填写在 hdfs-site.xml 中的 dfs.datanode.data.dir 配置项中,以逗号分隔开。虚拟硬盘的前面要加上标识符 [RAM_DISK]。
<property>
<name>dfs.datanode.data.dir</name>
<value>/var/data/1,/var/data/2,[RAM_DISK]/mnt/mytmpfs/0</value>
</property>
确保 HDFS 的异构存储策略是打开状态的,即配置项 dfs.storage.policy.enabled
确保内存值设置的正确性,即配置项 dfs.datanode.max.locked.memory
HDFS 的内存存储是什么?的更多相关文章
- Hadoop:HDFS NameNode内存全景
原文转自:https://tech.meituan.com/namenode.html 感谢原作者 一.概述 从整个HDFS系统架构上看,NameNode是其中最重要.最复杂也是最容易出现问题的地方, ...
- HDFS NameNode内存详解
前言 <HDFS NameNode内存全景>中,我们从NameNode内部数据结构的视角,对它的内存全景及几个关键数据结构进行了简单解读,并结合实际场景介绍了NameNode可能遇到的问题 ...
- HDFS NameNode内存全景
一.概述 从整个HDFS系统架构上看,NameNode是其中最重要.最复杂也是最容易出现问题的地方,而且一旦NameNode出现故障,整个Hadoop集群就将处于不可服务的状态,同时随着数据规模和集群 ...
- Redis内存存储结构分析
1 Redis 内存存储结构 本文是基于 Redis-v2.2.4 版本进行分析. 1.1 Redis 内存存储总体结构 Redis 是支持多key-value数据库(表)的,并用 RedisDb 来 ...
- C/C++内存存储
#include <stdio.h> #include "string.h" #include "malloc.h" void Swap(int a ...
- memcached全面剖析–2. 理解memcached的内存存储
Slab Allocation机制:整理内存以便重复使用 最近的memcached默认情况下采用了名为Slab Allocator的机制分配.管理内存. 在该机制出现以前,内存的分配是通过对所有记录简 ...
- C/C++内存存储问题
#include <stdio.h> #include "string.h" #include "malloc.h" void Swap(int a ...
- 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)
技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...
- 【解惑】剖析float型的内存存储和精度丢失问题
问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么? 现在我们就详细剖析一下浮点型运算为什么会造成精度丢失? 1.小数的二进制表示问题 首先我们要搞清楚下面两 ...
随机推荐
- Dynamics CRM使用Web Api时如果参数里面包含"&"的时候的处理方法
当我们使用Dynamics CRM的Api的时候如果遇到查询字段的参数里面有&符号的话会影响Api的取值直接报错.原因是因为&符号在Url上面是一个关键字,这个关键字可以截断Url表示 ...
- 美团点评技术专家 帮你快速上手跨平台开发框架Flutter
Flutter并没有开创新的概念,它背后的框架原理和底层设计思想,与原生Android/iOS开发并没有本质区别,甚至从React.Native中吸收了不少优秀的设计理念. Flutter是Googl ...
- 01-Verilog基本语法元素
不知道能不能更新完,毕竟咱学校计院对硬件向来不太重视,现在对竞赛也不咋地重视了,也不加分,也没啥用.嘛,就随便写写玩玩吧. 一只狸无聊的时候对Verilog的业余描述笔记:以<Verilog数字 ...
- php常用错误码的意思
总揽 200:服务器响应正常. 304:该资源在上次请求之后没有任何修改(这通常用于浏览器的缓存机制,使用GET请求时尤其需要注意). 400:无法找到请求的资源. 401:访问资源的权限不够. 40 ...
- php浮点数(float)运算中转整形(int)问题
今天工作中遇见了一个浮点数转整形的问题,特此记录一下,防止以后再次踩坑. 实例: $f = 0.58; var_dump(intval($f * 100.0)); 也许你认为他会输出58,但是实际上他 ...
- hdu 3721 树的最小直径
题意: 给你一棵树,让你改变一条边,改变之后依然是一棵树,然后问你怎样改变才能让树的直径最短.这里的改变一条边指的是指把一条边长度不变,连在别的两个点上. 思路: 首先求出树的 ...
- Python socket(TCP阻塞模式)基础程式
前置知识:Python基础语法,socket库 tips: 1. 默认HOST_IP:127.0.0.1 2. 默认HOST_PORT:7676 参考代码: 1. 客户端程式 #!/usr/bin/e ...
- ART模式下基于Xposed Hook开发脱壳工具
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78092365 Dalvik模式下的Android加固技术已经很成熟了,Dalvik ...
- hdu4966 最小树形图(最少辅导花费)
题意: 以一些科目,和辅导班,每个科目最终要求修到某个等级,可以花一定的钱在辅导班把某一科目修到某一等级,进入辅导班的时候会有一个限制,那就是达到他给出的科目和等级限制,比如a b c d ...
- cf534D 枚举握手次数
题意: 有n个学生进教室,先后顺序不同,每个人进去后会和当前在教室里的人握手,并且记录人数,而且当教室里有超过三个人的时候 他们有可能组队去参加比赛,后来的人看不到他们. 思路: ...