我们的HDFS集群中有11个DataNode,初始时每台机器仅上了一块2.4T大的SAS盘/dev/sda,数据分区1.8T。上线运行4个月,集群存储总使用量超过了70%,无法满足日益增长的存储需求,需要改进。
之前我们的HDFS一直采用默认的块副本数3。现在来看,有两个节点同时出现问题的概率非常小,可以降低为2,释放一些空间。
另外,加盘也是十分有必要的。HDFS自带冗余机制,所以数据盘都不用做RAID。每台机器上面还有3个空闲盘位,直接插满。
修改副本数
在CM的HDFS配置中找到dfs.replication项,修改为2,重启HDFS。
但这样只能保证新写入的块副本数变为2,原有块仍然是3副本,因此还需要执行命令hdfs dfs -setrep 2 -R -w /dw
。其中/dw是指定的路径,-R参数则表示包含子目录。
通过执行hdfs fsck /dw
命令,观察“Average block replication”一项,可以看出副本调整的过程是否已经完成。
存储扩容
每个节点各加一块1.2T的盘/dev/sdb,以及两块2.4T的盘/dev/sdc、/dev/sdd。然后将这些盘配置到HDFS中作为数据盘来使用。
由于每块盘的处理流程都相同,因此仅以/dev/sdb为例来描述。
- 创建ext4文件系统
执行:mkfs -t ext4 /dev/sdb
。如果没有创建文件系统,mount时会报错:Unknown filesystem type '(null)'。
因为用途就是纯HDFS存储,无需分区,所以直接省略了fdisk的步骤。在Linux中,磁盘不分区也是可以用的。 - 创建数据目录,并更改其权限和所有者
执行:
mkdir -p /dfs_local/sdb
chmod -R 777 /dfs_local/sdb
chown -R hdfs:hadoop /dfs_local/sdb
hdfs-site.xml中默认指定的权限是755,但可以通过dfs.datanode.data.dir.perm配置项来更改。 - 挂载
简单地执行mount命令就可以挂载。但稳妥起见,应该配置成开机自动挂载。
修改/etc/fstab文件,加入如下一行:
/dev/sdb /dfs_local/sdb ext4 defaults 0 0
普通数据盘既不需要备份也不需要fsck检查,因此dump和pass都设为0。
保存后,执行mount -a
命令,使其立即生效。使用df -h
可以查看是否成功挂载。 - 加入HDFS
进入CM界面,找到HDFS数据目录的配置项dfs.data.dir,加入上面设定的挂载路径,刷新配置即可,无需重启服务。