hdfs的异构存储
1 背景
在我们实际的开发过程中,我们的某些数据可能经常使用,但是过了一段时间,这个数据就不怎么使用了,即我们的数据存在一个热
、温
、冷
等这些特性。那么针对数据的热度
,我们可以采用不同的策略,存储到不同的存储介质上。
比如:
- 针对经常访问的数据,我们可以存储在
SSD
上。 - 针对访问频率不高的,我们可以存储在
DISK
,即普通的硬盘上。 - 针对几乎不会访问的数据,保存在归档介质上。
注意:那么hdfs自己知道哪些数据是热数据,哪些数据是冷数据吗,貌似是不知道的,需要我们自己去判断
。
2 hdfs异构存储类型和存储策略
2.1 hdfs支持的存储类型
hdfs
支持如下4
中存储类型
ARCHIVE:
它具有高存储密度
(PB级存储)但计算能力弱
,一般用于归档文件的存储。DISK :
普通磁盘,默认的存储类型
SSD :
SSD固态硬盘RAM_DISK:
支持在内存
中写入单个副本文件
2.2 hdfs如何知道数据存储目录是那种存储类型
hdfs
是不会自动检测我们指定的数据存储目录是何种存储类型的,需要我们在配置的时候告诉hdfs
。
指定目录的存储类型
vim hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>[SSD]file:///var/hadoop/dfs/data1,[DISK]file:///var/hadoop/dfs/data2</value>
</property>
从上面的配置中可以 /var/hadoop/dfs/data1
前面指定了[SSD]
,则说明data1
这个目录是一个 SSD
的存储介质,但是具体是不是真的SSD类型,这个是不会去校验的。
2.3 存储策略
2.3.1 在hdfs中支持如下存储策略
Hot:
用于存储和计算。当我们的数据是热
数据时,可以使用这种存储策略,所有的副本都在DISK中。Warm:
仅适用于计算有限的存储。不再使用的数据或需要归档的数据从热存储移动到冷存储。当一个块冷
时,所有副本都存储在ARCHIVE中。Cold:
部分热和部分冷。当一个块是热的时,它的一些副本存储在DISK中,其余的副本存储在ARCHIVE中。All_SSD:
用于将所有副本存储在SSD中。One_SSD:
用于将其中一个副本存储在SSD中。其余副本存储在DISK中。Lazy_Persist:
用于在内存中写入具有单个副本的块。副本首先用RAM_DISK写入,然后懒惰地保存在DISK中。Provided:
用于在HDFS之外存储数据
2.3.2 存储策略表
2.3.4 Storage Policy Resolution
创建文件或目录时,未指定其存储策略。可以使用storagePolicy -setStoragePolicy
命令指定存储策略。文件或目录的有效存储策略由以下规则解析。
- 如果文件或目录指定了存储策略,则返回它。
- 对于未指定的文件或目录,如果是根目录,则返回默认存储策略。否则,返回其父级的有效存储策略。
有效的存储策略可以通过storagePolicy -getStoragePolicy
命令检索。
2.3.5 配置存储策略
dfs.storage.policy.enabled
用于启用或禁止存储策略特性,默认值是true
dfs.datanode.data.dir
在每个数据节点上,逗号分隔的存储位置应标记其存储类型。这允许存储策略根据策略将块放置在不同的存储类型上。
举例说明
- 如果一个datanode 上的存储位置
/grid/dn/disk0
是DISK
类型,应该配置为[DISK]file:///grid/dn/disk0
- 如果一个datanode 上的存储位置
/grid/dn/disk0
是SSD
类型,应该配置为[SSD]file:///grid/dn/disk0
- 如果一个datanode 上的存储位置
/grid/dn/disk0
是ARCHIVE
类型,应该配置为[ARCHIVE]file:///grid/dn/disk0
如果
没有显式标记
的存储类型,则datanode存储位置的默认存储类型将是DISK
。
2.3.6 基于存储策略的数据移动
在已经存在
的文件/目录
上设置新的存储策略
将改变命名空间中的策略,但它不会在存储介质之间物理移动块。
此处介绍基于Mover
来解决这个问题,具体的细节需要看官方文档。
2.3.7 存储策略命令
2.3.7.1 列出所有存储策略
hdfs storagepolicies -listPolicies
2.3.7.2 为文件或目录设置存储策略
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>
<path>
:需要设置存储策略的文件或目录
<policy>
:存储策略的名字
2.3.7.3 取消存储策略
hdfs storagepolicies -unsetStoragePolicy -path <path>
取消对文件或目录的存储策略设置。在unset命令之后,将应用最近祖先的存储策略,如果没有任何祖先的策略,则将应用默认存储策略。
2.3.7.4 获取文件或目录的存储策略。
hdfs storagepolicies -getStoragePolicy -path <path>
2.3.7.5 查看文件块分布
hdfs fsck xxx -files -blocks -locations
3 hdfs异构存储案例
3.1 环境准备
ip地址 | 节点名 | 存储类型 |
---|---|---|
192.168.121.140 | hadoop01 | DISK,ARCHIVE |
192.168.121.141 | hadoop02 | DISK,SSD |
192.168.121.142 | hadoop03 | SSD,ARCHIVE |
3.2 节点 hdfs-site.xml配置文件
3.2.1 hadoop01
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 开启hdfs异构存储策略 -->
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<!-- 配置block块的存储目录,配置hdfds数据的存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>[DISK]file:///opt/bigdata/hadoop-3.3.4/data/disk,[ARCHIVE]file:///opt/bigdata/hadoop-3.3.4/data/archive</value>
</property>
3.2.2 hadoop02
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 开启hdfs异构存储策略 -->
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<!-- 配置block块的存储目录,配置hdfds数据的存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>[DISK]file:///opt/bigdata/hadoop-3.3.4/data/disk,[SSD]file:///opt/bigdata/hadoop-3.3.4/data/ssd</value>
</property>
3.2.3 hadoop03
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 开启hdfs异构存储策略 -->
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<!-- 配置block块的存储目录,配置hdfds数据的存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>[SSD]file:///opt/bigdata/hadoop-3.3.4/data/ssd,[ARCHIVE]file:///opt/bigdata/hadoop-3.3.4/data/archive</value>
</property>
3.3 重启hdfs集群,并看数据目录存储类型是否正确
3.4 案例演示
此处仅仅只是演示 Warm
类型。
由之前的存储策略表(2.3.2
)可知,Warm
类型的策略,只有一个块存储在DISK
存储上,其余的全部存储在ARCHIVE
存储上。
# hdfs 上创建目录
[hadoopdeploy@hadoop01 hadoop]$ hadoop fs -mkdir -p /var/data/storage
# 上传文件到 hdfs 目录中
[hadoopdeploy@hadoop01 hadoop]$ hadoop fs -put /etc/profile /var/data/storage/profile
# 设置 /var/data/storage 目录的存储策略为 warm
[hadoopdeploy@hadoop01 hadoop]$ hdfs storagepolicies -setStoragePolicy -path /var/data/storage -policy WARM
Set storage policy WARM on /var/data/storage
# 查看 /var/data/storage 目录的文件块分布,发现还是 2个 DISK,说明历史数据需要迁移,使用 mover 命令
[hadoopdeploy@hadoop01 hadoop]$ hdfs fsck /var/data/storage -files -blocks -locations
Connecting to namenode via http://hadoop01:9870/fsck?ugi=hadoopdeploy&files=1&blocks=1&locations=1&path=%2Fvar%2Fdata%2Fstorage
FSCK started by hadoopdeploy (auth:SIMPLE) from /192.168.121.140 for path /var/data/storage at Sat Mar 18 17:49:48 CST 2023
/var/data/storage <dir>
/var/data/storage/profile 2098 bytes, replicated: replication=2, 1 block(s): OK
0. BP-1760725553-192.168.121.140-1676791226380:blk_1073741858_1036 len=2098 Live_repl=2 [DatanodeInfoWithStorage[192.168.121.141:9866,DS-e86f80ba-6f04-4074-ab96-f58212c3c0e2,DISK], DatanodeInfoWithStorage[192.168.121.140:9866,DS-ca40e8cf-4d38-4a42-bfcb-e636087e9025,DISK]]
......
# 将 /var/data/storage 按照存储策略移动数据块
[hadoopdeploy@hadoop01 hadoop]$ hdfs mover /var/data/storage
2023-03-18 17:52:04,620 INFO mover.Mover: namenodes = {hdfs://hadoop01:8020=null}
2023-03-18 17:52:04,630 INFO balancer.NameNodeConnector: getBlocks calls for hdfs://hadoop01:8020 will be rate-limited to 20 per second
2023-03-18 17:52:05,368 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.121.142:9866
2023-03-18 17:52:05,368 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.121.140:9866
2023-03-18 17:52:05,368 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.121.141:9866
2023-03-18 17:52:05,402 INFO balancer.Dispatcher: Start moving blk_1073741858_1036 with size=2098 from 192.168.121.140:9866:DISK to 192.168.121.140:9866:ARCHIVE through 192.168.121.140:9866
2023-03-18 17:52:05,412 INFO balancer.Dispatcher: Successfully moved blk_1073741858_1036 with size=2098 from 192.168.121.140:9866:DISK to 192.168.121.140:9866:ARCHIVE through 192.168.121.140:9866
Mover Successful: all blocks satisfy the specified storage policy. Exiting...
2023-3-18 17:52:15 Mover took 10sec
# 重新查看 /var/data/storage 目录的文件块分布,发现还是 一个是 DISK 另外一个 ARCHIVE,说明存储策略生效了
pdeploy@hadoop01 hadoop]$ hdfs fsck /var/data/storage -files -blocks -locations
Connecting to namenode via http://hadoop01:9870/fsck?ugi=hadoopdeploy&files=1&blocks=1&locations=1&path=%2Fvar%2Fdata%2Fstorage
FSCK started by hadoopdeploy (auth:SIMPLE) from /192.168.121.140 for path /var/data/storage at Sat Mar 18 17:53:23 CST 2023
/var/data/storage <dir>
/var/data/storage/profile 2098 bytes, replicated: replication=2, 1 block(s): OK
0. BP-1760725553-192.168.121.140-1676791226380:blk_1073741858_1036 len=2098 Live_repl=2 [DatanodeInfoWithStorage[192.168.121.141:9866,DS-e86f80ba-6f04-4074-ab96-f58212c3c0e2,DISK], DatanodeInfoWithStorage[192.168.121.140:9866,DS-cf50253c-ea3f-46f6-bdd9-4ac1ad3907d2,ARCHIVE]]
4 参考文档
1、https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html
2、https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
hdfs的异构存储的更多相关文章
- HDFS & MapReduce异构存储性能测试白皮书
- HDFS 的内存存储是什么?
引言 HDFS 的定位就是一个文件系统,用于存储文件,而 HDFS 对于文件的存储方式有两种: 内存存储 异构存储 内存存储 什么是内存存储? 首先,我们来了解一下到底什么是 "内存存储&q ...
- Hadoop第三天---分布式文件系统HDFS(大数据存储实战)
1.开机启动Hadoop,输入命令: 检查相关进程的启动情况: 2.对Hadoop集群做一个测试: 可以看到新建的test1.txt和test2.txt已经成功地拷贝到节点上(伪分布式只有一个节 ...
- hive表中字段显示为NULL时,HDFS文件中存储为\N
hive数据落地到hdfs,null会默认用'\N'存储 解决方式1:利用命令(这个我没起效果) alter table adl_cici_test_fdt set serdeproperties(' ...
- 搭建基于 HDFS 碎片文件存储服务
安装 JDK HDFS 依赖 Java 环境,这里我们使用 yum 安装 JDK 8,在终端中键入如下命令: yum -y install java-1.8.0-openjdk* 使用如下命令查看下 ...
- HDFS各个进程存储在磁盘上的数据含义和注意事项
本文地址:http://www.cnblogs.com/qiaoyihang/p/6293402.html (一)Namenode的目录结构 HDFS进行初次格式化之后将会在$dfs.namenode ...
- Hive查看table在HDFS上的存储路径
hive>show databases;hive>use databasename;hive>show create table tablename; --查看table的存储路径h ...
- 4.1-4.2 基于HDFS云盘存储系统分析及hadoop发行版本
一.基于HDFS云盘存储系统 如:某度网盘 优点: *普通的商用机器 内存 磁盘 *数据的安全性 操作: *put get *rm mv *java api *filesystem 核心: *H ...
- Hdfs的列存储和行存储
列可以分开存储,对于重复性高的数据压缩比会高,但是在元组(行shi)恢复会比较消耗性能 于传统列存储不同 是行组会存储于同一节点中,列扫描会比较快(因为只需扫描一个行组)
- hdfs冷热数据分层存储
hdfs如何让某些数据查询快,某些数据查询慢? hdfs冷热数据分层存储 本质: 不同路径制定不同的存储策略. hdfs存储策略 hdfs的存储策略 依赖于底层的存储介质. hdfs支持的存储介质: ...
随机推荐
- UF_OBJ_delete_array_of_objects函数vector转数组用法
1 UF_initialize(); 2 std::vector<tag_t>tool_tag; 3 tag_t ObjectTag = NULL_TAG; 4 int Type, ...
- px 转化 为 rpx
小程序 的 px 转化为rpx 在 获取 屏幕高度 后 ,这个单位是px ,可是我的项目是用rpx,所以这里就涉及一个转化的公式了 1rpx = 750 / 设备屏幕宽度 所以 wx.getSyste ...
- python读取Excel文件的操作
①通过xlutils在已有表中写数据(这种方法会改变excel的样式) import xlrd,xlwt from xlutils.copy import copy 将已存在的Excel表格赋值给变量 ...
- ES6 之 Promise
promise 与ajax 实现两个ajax返回参数的拼接 // 函数 fetch() { return new Promise((resolve, reject) => { Utils.sen ...
- 求小于N的最大素数
问题 求小于N的最大素数 分析 枚举:从可能的集合中一一列举各元素 枚举过程中需要考虑的问题: 给出解空间 减少搜索的空间 采用合适的搜索顺序 枚举关键字(枚举核心):减少规模 代码实现 1 impo ...
- Vue+SSM+Element-Ui实现前后端分离(2)
前言:后台使用ssm搭建,对以前学习知识的一个回顾,与此同时来发现自己不足.这里主要采用配置文件方式进行,有部分注解. 目标:搭建ssm框架,并测试成功:(其中也有aop切面的编写) 一.开发工具 I ...
- Windows server 防火墙开放oracle监听端口
Windows server 防火墙开放oracle监听端口 Windows server 2008 开放1521端口 Windows server 2003 开放监听程序例外先开防火墙,再开监听例外 ...
- java15配置环境后java_version无反应(不显示“不是内部或外部命令”)
重新装了jdk15来使用eclipse 配置完环境变量之后打开cmd输入 java -version 好家伙,居然一点反映都没有, 然后傻乎乎的跑回去重新配置JAVA_HOME和path 还是没用,细 ...
- NOIP2019 树的重心
Description \[\sum_{(u,v)\in E}\Biggl(\sum_{x为S_u重心}x+\sum_{y为S_v重心}y\Biggr) \] \(1\leqslant n\leqsl ...
- android系统上编写、运行C#代码
最近找到个好玩的APP,C#Shell (Compiler REPL),可以在安卓系统上编写和运行C#代码,配合sqlite数据库,写了个小爬虫,运行还不错: 运行一些小爬虫或者定时任务可以用这个,毕 ...