事情起因:原大数据集群单个节点磁盘太小(才200G),运行一段时候磁盘空间快满了,因为用的是阿里云的服务器就挂载了一个新的磁盘(1T左右),
1.初始化阿里云的新盘并挂载到服务器指定目录下,可以见阿里云的文档:
这里有个问题补充下:
新磁盘挂载的目录需要是 / 根节点下的一级目录,如果是多级目录则配置到datanode就不能用了,会报磁盘节点的异常,具体问题没有截图,重启hdfs的时候会显示datanode节点启动失败!当然挂错了也是可以修改的,阿里云的文档里没有,这里我补充下:
2.重新设置新磁盘的挂载点:
在上面阿里云的文档里,配置了自动挂载,此时如果第一次挂载错误的话,直接执行
umount <path> 这个命令是会报错:比如
原因就是上面配置了开机自动挂载,会显示这个目录路径被占用,(不建议使用lsof <路径> , 然后kill -9 PID的方式给它干掉)
此时,我们需要先修改vim /etc/fstab (建议:这里最好先备份下fstab的文件,比如: cp /etc/fstab /etc/fstab.bak),下图第二行就是配置的开机自动挂载的配置文件内容,我之前指定的是/hadoo/hdfs/data1的旧路径,发现不能用就修改为/b* 这个根节点下的一级目录了
修改 UUID值后的第一个路径为你想配置的 / 跟路径下的一级目录(UUID的值不要动,这个是磁盘文文件系统的标识,修改之后可能会导致ecs实例启动不了了)
执行 mount -a 生效,这时候执行 mount -l 会发现新挂载的磁盘挂载到当前服务器的两个目录下:
一个是旧的挂载路径
一个是新修改的路径
这个时候执行 umount <旧路径> 就可以 取消旧路径的挂载了!
到这里新磁盘的初始化以及挂载或修改到服务器指定目录的操作就完成了
2.进入ambari的管理界面,配置datanode的多个目录如下:
3.重启hdfs,mapreduce,yarn服务
4.进入服务器的/根目录下输入 du -sh *
这里 bigdata1 目录是因为我配置了磁盘数据平衡了,所以它的大小 和之前的数据目录 hadoop的大小差不多,实际刚添加完多个目录时,bigdata1的目录只有100多K的大小!此时大量的数据还在之前的hadoop的目录下,所以我们需要平衡该节点的两个目录下的文件数据;网上很多数据平衡都是使用hdfs balancer的命令(这个是平衡集群节点的数据,不是针对单个节点下多个目录的数据平衡,这个命令对于这个情况没用)
5.(因为这里涉及hdfs的文件移动,所以最好将任务都关了操作)这里首先需要hdfs开启dfs.disk.balancer.enable=true这个配置,支持datanode进行节点磁盘的数据rebalance,我这里ambari的hadoop版本是3.1.1的默认可以开启了就不需要配置直接下一步
6.这里实现节点多目录的数据平衡需要先创建执行计划,然后运行执行即可(所以这一步需要在集群的所有datanode节点全部依次执行一遍)
6.1进入hadoop的bin目录下:
执行命令 : hdfs diskbalancer -plan 域名 (单磁盘多目录不会生成计划,只有在不同的磁盘才有效),成功之后会将计划生成的路径返回到控制台如下:这个*.plan.json就是计划
之后执行 hdfs diskbalancer -execute /system/diskbalancer/2023-Dec-17-17-55-34/*****.plan.json
这个计划会执行一段时间(需要看数据情况),可以通过hdfs diskbalancer -query 域名 查看计划执行的情况,显示
我这里是执行过了 所以显示 NO_PLAN 如果是计划执行完 会显示PLAN_DONE
7.执行完了 在 /的目录下 输入 du -sh * 就可以看到两个目录的数据差不多大小了!
8.但是这里还有个遗留的问题,那就是因为新的盘是后来加上的,所以一般来说比原磁盘大,那么我们写数据的时候就想往大的数据盘写数据,但是默认的datanode的数据是轮询的方式在多个目录写入数据的,需要这里还需要再hdfs-site.xml的文件添加如下配置:
<!-- 设置数据存储策略,默认为轮询,现在的情况显然应该用“选择空间多的磁盘存”模式 --> <property> <name>dfs.datanode.fsdataset.volume.choosing.policy</name> <value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value> </property>
好 完活!