Hadoop生产调优手册(2)

HDFS —存储优化
纠删码
纠删码原理
HDFS 默认情况下,一个文件有 3 个副本,这样提高了数据的可靠性,但也带来了 2
的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约 50 %左右的存储空间。

 1)纠删码操作相关的命令

 2)查看当前支持的纠删码策略

 3)纠删码策略解释:

RS-3-2-1024k :使用 RS 编码,每 3 个数据单元,生成 2 个校验单元,共 5 个单元,也
就是说:这 5 个单元中,只要有任意的 3 个单元存在(不管是数据单元还是校验单元,只要
总数 =3 ),就可以得到原始数据。每个单元的大小是 1024k=1024*1024=1048576

 

RS-10-4-1024k :使用 RS 编码,每 10 个数据单元( cell ),生成 4 个校验单元,共 14
个单元,也就是说:这 14 个单元中,只要有任意的 10 个单元存在(不管是数据单元还是校
验单元,只要总数 =10 ),就可以得到原始数据。每个单元的大小是 1024k=1024*1024=1048576
RS-6-3-1024k :使用 RS 编码,每 6 个数据单元,生成 3 个校验单元,共 9 个单元,也
就是说:这 9 个单元中,只要有任意的 6 个单元存在(不管是数据单元还是校验单元,只要
总数 =6 ),就可以得到原始数据。每个单元的大小是 1024k=1024*1024=1048576
RS-LEGACY-6-3-1024k :策略和上面的 RS-6-3-1024k 一样,只是编码的算法用的是 rs
legacy
XOR-2-1-1024k :使用 XOR 编码(速度比 RS 编码快),每 2 个数据单元,生成 1 个校
验单元,共 3 个单元,也就是说:这 3 个单元中,只要有任意的 2 个单元存在(不管是数据
单元还是校验单元,只要总数 = 2 ),就可以得到原始数据。每个单元的大小是
1024k=1024*1024=1048576
纠删码案例实操

 

纠删码策略是 给具体一个路径设置 。所有往此路径下存储的文件,都会执行此策略。
默认只开启对 RS-6-3-1024k 策略的支持 ,如要使用别的策略需要提前启用。
1 )需求: /input 目录设置为 RS-3-2-1024k 策略
2 )具体步骤
1 )开启对 RS-3-2-1024k 策略的支持
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs ec -enablePolicy -
policy RS-3-2-1024k
Erasure coding policy RS-3-2-1024k is enabled
(2)在 HDFS 创建目录,并设置 RS-3-2-1024k 策略

 

(3)上传文件,并查看文件编码后的存储情况
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs dfs -put web.log /input
注:你所上传的文件需要大于 2M 才能看出效果。(低于 2M ,只有一个数据单元和两
个校验单元)
(4)查看存储路径的数据单元和校验单元,并作破坏实验
异构存储(冷热数据分离)
异构存储主要解决,不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。

 异构存储 Shell 操作

1 )查看当前有哪些存储策略可以用
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies - listPolicies
(2)为指定路径 (数据存储目录) 设置指定的存储策略
hdfs storagepolicies - setStoragePolicy -path xxx -policy xxx
(3)获取指定路径(数据存储目录或文件)的存储策略
hdfs storagepolicies - getStoragePolicy -path xxx
(4)取消存储策略;执行改命令之后该目录或者文件,以其上级的目录为准,如果是根
目录,那么就是 HOT
hdfs storagepolicies - unsetStoragePolicy -path xxx
(5)查看文件块的分布
bin/hdfs fsck xxx -files -blocks -locations
(6)查看集群节点
hadoop dfsadmin -report
测试环境准备
1 )测试环境描述
服务器规模: 5
集群配置:副本数为 2 ,创建好带有存储类型的目录(提前创建)
集群规划:

 2)配置文件信息

1)为 hadoop102 节点的 hdfs-site.xml 添加如下信息

<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.storage.policy. enabled </name>
<value> true </value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value> [SSD] file:///opt/module/hadoop-
3.1.3/hdfsdata/ssd, [RAM_DISK] file:///opt/module/hadoop-
3.1.3/hdfsdata/ram_disk</value>
</property>
2 )为 hadoop103 节点的 hdfs-site.xml 添加如下信息
<property>
<name>dfs.replication</name> 
<value>2</value>
</property>
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value> [SSD] file:///opt/module/hadoop-
3.1.3/hdfsdata/ssd, [DISK] file:///opt/module/hadoop-
3.1.3/hdfsdata/disk</value>
</property>
3 )为 hadoop104 节点的 hdfs-site.xml 添加如下信息
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value> [RAM_DISK] file:///opt/module/hdfsdata/ram_disk, [DISK] file:///o
pt/module/hadoop-3.1.3/hdfsdata/disk</value>
</property>
4 )为 hadoop105 节点的 hdfs-site.xml 添加如下信息
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value> [ARCHIVE] file:///opt/module/hadoop-
3.1.3/hdfsdata/archive</value>
</property>
5 )为 hadoop106 节点的 hdfs-site.xml 添加如下信息
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value> [ARCHIVE] file:///opt/module/hadoop-
3.1.3/hdfsdata/archive</value>
</property>
3 )数据准备
1 )启动集群
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs namenode -format
[atguigu@hadoop102 hadoop-3.1.3]$ myhadoop.sh start
1 )并在 HDFS 上创建文件目录
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /hdfsdata
(2)并将文件资料上传
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -put /opt/module/hadoop-
3.1.3/NOTICE.txt /hdfsdata
HOT 存储策略案例
1 )最开始我们未设置存储策略的情况下,我们获取该目录的存储策略
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -getStoragePolicy
-path /hdfsdata
(2)我们查看上传的文件块分布
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -
locations
[DatanodeInfoWithStorage[192.168.10. 104 :9866,DS-0b133854-7f9e-48df-939b-
5ca6482c5afb, DISK ], DatanodeInfoWithStorage[192.168.10. 103 :9866,DS
ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b, DISK ]]
未设置存储策略,所有文件块都存储在 DISK 下。所以, 默认存储策略为 HOT

 

WARM 存储策略测试
1 )接下来我们为数据降温
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy
-path /hdfsdata -policy WARM
(2)再次查看文件块分布,我们可以看到文件块依然放在原处。
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -
locations
(3)我们需要让他 HDFS 按照存储策略自行移动文件块
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs mover /hdfsdata
(4)再次查看文件块分布,
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -
locations
[DatanodeInfoWithStorage[192.168.10. 105 :9866,DS-d46d08e1-80c6-4fca-b0a2-
4a3dd7ec7459, ARCHIVE ], DatanodeInfoWithStorage[192.168.10. 103 :9866,DS
ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b, DISK ]]
文件块一半在 DISK ,一半在 ARCHIVE ,符合我们设置的 WARM 策略
COLD 策略测试
1 )我们继续将数据降温为 cold
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy
-path /hdfsdata -policy COLD
注意:当我们将目录设置为 COLD 并且我们未配置 ARCHIVE 存储目录的情况下,不
可以向该目录直接上传文件,会报出异常。
(2)手动转移
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs mover /hdfsdata
(3)检查文件块的分布
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks
-locations
[DatanodeInfoWithStorage[192.168.10. 105 :9866,DS-d46d08e1-80c6-4fca-b0a2-
4a3dd7ec7459, ARCHIVE ], DatanodeInfoWithStorage[192.168.10. 106 :9866,DS-
827b3f8b-84d7-47c6-8a14-0166096f919d, ARCHIVE ]]
所有文件块都在 ARCHIVE ,符合 COLD 存储策略。
ONE_SSD 策略测试
1 )接下来我们将存储策略从默认的 HOT 更改为 One_SSD
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy
-path /hdfsdata -policy One_SSD
(2)手动转移文件块
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs mover /hdfsdata
(3)转移完成后,我们查看文件块分布,
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks
-locations
[DatanodeInfoWithStorage[192.168.10. 104 :9866,DS-0b133854-7f9e-48df-939b-
5ca6482c5afb, DISK ], DatanodeInfoWithStorage[192.168.10. 103 :9866,DS-
2481a204-59dd-46c0-9f87-ec4647ad429a, SSD ]]
文件块分布为一半在 SSD ,一半在 DISK ,符合 One_SSD 存储策略
ALL_SSD 策略测试
1 )接下来,我们再将存储策略更改为 All_SSD
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy
-path /hdfsdata -policy All_SSD
(2)手动转移文件块
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs mover /hdfsdata
(3)查看文件块分布,我们可以看到,
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks
-locations
[DatanodeInfoWithStorage[192.168.10. 102 :9866,DS-c997cfb4-16dc-4e69-a0c4-
9411a1b0c1eb, SSD ], DatanodeInfoWithStorage[192.168.10. 103 :9866,DS-
2481a204-59dd-46c0-9f87-ec4647ad429a, SSD ]]
所有的文件块都存储在 SSD ,符合 All_SSD 存储策略。
LAZY_PERSIST 策略测试
1 )继续改变策略,将存储策略改为 lazy_persist
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy
-path /hdfsdata -policy lazy_persist
(2)手动转移文件块
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs mover /hdfsdata
(3)查看文件块分布
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -
locations
[DatanodeInfoWithStorage[192.168.10. 104 :9866,DS-0b133854-7f9e-48df-939b-
5ca6482c5afb, DISK ], DatanodeInfoWithStorage[192.168.10. 103 :9866,DS
ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b, DISK ]]
这里我们发现所有的文件块都是存储在 DISK ,按照理论一个副本存储在 RAM_DISK
其他副本存储在 DISK 中,这是因为,我们还需要配置“ dfs.datanode.max.locked.memory ”,
dfs.block.size ”参数。
那么出现存储策略为 LAZY_PERSIST 时,文件块副本都存储在 DISK 上的原因有如下两
点:
1 )当客户端所在的 DataNode 节点没有 RAM_DISK 时,则会写入客户端所在的
DataNode 节点的 DISK 磁盘,其余副本会写入其他节点的 DISK 磁盘。
(2)当客户端所在的 DataNode RAM_DISK ,但“ dfs.datanode.max.locked.memory
参数值未设置或者设置过小(小于“ dfs.block.size ”参数值)时,则会写入客户端所在的
DataNode 节点的 DISK 磁盘,其余副本会写入其他节点的 DISK 磁盘。
但是由于虚拟机的“ max locked memory” 64KB ,所以,如果参数配置过大,还会报
出错误:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in
secureMain
java.lang.RuntimeException: Cannot start datanode because the configured
max locked memory size (dfs.datanode.max.locked.memory) of 209715200
bytes is more than the datanode's available RLIMIT_MEMLOCK ulimit of
65536 bytes.
我们可以通过该命令查询此参数的内存
[atguigu@hadoop102 hadoop-3.1.3]$ ulimit -a
max locked memory (kbytes, -l) 64
HDFS —故障排除
注意:采用三台服务器即可,恢复到 Yarn 开始的服务器快照。
NameNode 故障处理(一般不这样处理,因为nn都有HA,这种情况可能会丢数据)

 

1 )需求:
NameNode 进程挂了并且存储的数据也丢失了,如何恢复 NameNode
2 )故障模拟
1 kill -9 NameNode 进程
[atguigu@hadoop102 current]$ kill -9 19886
(2)删除 NameNode 存储的数据( /opt/module/hadoop-3.1.3/data/tmp/dfs/name
[atguigu@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop-
3.1.3/data/dfs/name/*
3 )问题解决
1 )拷贝 SecondaryNameNode 中数据到原 NameNode 存储数据目录
[atguigu@hadoop102 dfs]$ scp -r
atguigu@hadoop104:/opt/module/hadoop-
3.1.3/data/dfs/namesecondary/* ./name/
(2)重新启动 NameNode
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode
(3)向集群上传一个文件
集群安全模式 & 磁盘修复
1 )安全模式: 文件系统只接受读数据请求,而不接受删除、修改等变更请求
2 )进入安全模式场景
NameNode 在加载镜像文件和编辑日志期间处于安全模式;
NameNode 再接收 DataNode 注册时,处于安全模式

 3)退出安全模式条件

dfs.namenode.safemode.min.datanodes: 最小可用 datanode 数量,默认 0
dfs.namenode.safemode.threshold-pct: 副本数达到最小要求的 block 占系统总 block 数的
百分比,默认 0.999f 。(只允许丢一个块)
dfs.namenode.safemode.extension: 稳定时间,默认值 30000 毫秒,即 30
4 )基本语法
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模
式。
1 bin/hdfs dfsadmin -safemode get
(功能描述:查看安全模式状态)
2 bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
3 bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
4 bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)
5 )案例 1 :启动集群进入安全模式
1 )重新启动集群
[atguigu@hadoop102 subdir0]$ myhadoop.sh stop
[atguigu@hadoop102 subdir0]$ myhadoop.sh start
(2)集群启动后,立即来到集群上删除数据,提示集群处于安全模式

 案例 2:磁盘修复

需求:数据块损坏,进入安全模式,如何处理
1 ) 分 别 进 入 hadoop102 hadoop103 hadoop104 /opt/module/hadoop-
3.1.3/data/dfs/data/current/ BP-1015489500-192.168.10.102-
1611909480872 /current/finalized/subdir0/subdir0 目录,统一删除某 2 个块信息

 

 说明:hadoop103/hadoop104 重复执行以上命令

(2)重新启动集群
[atguigu@hadoop102 subdir0]$ myhadoop.sh stop
[atguigu@hadoop102 subdir0]$ myhadoop.sh start
(3)观察 http://hadoop102:9870/dfshealth.html#tab-overview

 说明:安全模式已经打开,块的数量没有达到要求。

(4)离开安全模式

 

(5)观察 http://hadoop102:9870/dfshealth.html#tab-overview

 

(6)将元数据删除

 

 案例 3

需求:模拟等待安全模式
1 )查看当前模式
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -safemode get
Safe mode is OFF
2 )先进入安全模式
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode
enter
3 )创建并执行下面的脚本
/opt/module/hadoop-3.1.3 路径上,编辑一个脚本 safemode.sh

 

4 )再打开一个窗口,执行
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode
leave
5 )再观察上一个窗口
Safe mode is OFF
6 HDFS 集群上已经有上传的数据了

 

慢磁盘监控
“慢磁盘”指的时写入数据非常慢的一类磁盘。其实慢性磁盘并不少见,当机器运行时
间长了,上面跑的任务多了,磁盘的读写性能自然会退化,严重时就会出现写入数据延时的
问题。
如何发现慢磁盘?
正常在 HDFS 上创建一个目录,只需要不到 1s 的时间。如果你发现创建目录超过 1
钟及以上,而且这个现象并不是每次都有。只是偶尔慢了一下,就很有可能存在慢磁盘。
可以采用如下方法找出是哪块磁盘慢:
1 )通过心跳未联系时间。
一般出现慢磁盘现象,会影响到 DataNode NameNode 之间的心跳。正常情况心跳时
间间隔是 3s 。超过 3s 说明有异常。

 

2 fio 命令,测试磁盘的读写性能
1 )顺序读测试

 结果显示,磁盘的总体顺序读速度为 360MiB/s

(2)顺序写测试

 结果显示,磁盘的总体顺序写速度为 341MiB/s

(3)随机写测试

 

 结果显示,磁盘的总体随机写速度为 309MiB/s

(4)混合随机读写:

 结果显示,磁盘的总体混合随机读写,读速度为 220MiB/s,写速度 94.6MiB/s

小文件归档
1 HDFS 存储小文件弊端

 

每个文件均按块存储,每个块的元数据存储在 NameNode 的内存中,因此 HDFS 存储
小文件会非常低效。因为大量的小文件会耗尽 NameNode 中的大部分内存。但注意,存储小
文件所需要的磁盘容量和数据块的大小无关。例如,一个 1MB 的文件设置为 128MB 的块
存储,实际使用的是 1MB 的磁盘空间,而不是 128MB
2 )解决存储小文件办法之一
HDFS 存档文件或 HAR 文件,是一个更高效的文件存档工具,它将文件存入 HDFS 块,
在减少 NameNode 内存使用的同时,允许对文件进行透明的访问。具体说来, HDFS 存档文
件对内还是一个一个独立文件,对 NameNode 而言却是一个整体,减少了 NameNode 的内
存。

 

3 )案例实操
1 )需要启动 YARN 进程
[atguigu@hadoop102 hadoop-3.1.3]$ start-yarn.sh
(2)归档文件
/input 目录里面的所有文件归档成一个叫 input.har 的归档文件,并把归档后文件存储
/output 路径下。
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop archive -archiveName
input.har -p /input /output
(3)查看归档
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -ls
/output/input.har
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -ls
har:///output/input.har
(4)解归档文件
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cp
har:///output/input.har/* /
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据开发工程师-宋权

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值