自建Hbase空间不足?扩HDFS的容!
一、场景描述:
hbase 分布式集群依赖于 hadoop 和 zookeeper 集群;说明如下:
- zk 主要用于: - 实现高可靠性:包括 HDFS 的 NameNode 和 YARN 的 ResourceManager 的 HA - 存贮所有 Region 的寻址入口,实时监控 Region Server 的上线和下线信息,并实时通知 Master - 存储 HBase 的 Schema 和 table 元数据
在这种应用场景下,一般三节点的 zk 集群足够使用了,如果没有明显的 zk 瓶颈,在 hbase 及其相关组件的扩容操作中无需进行 zk 集群相关变更
- hadoop 系统为 HBase 提供给了分布式文件存储系统:HDFS。所以对 HBase 的扩容场景又分为性能提升和数据存储容量提升等场景,如果要提升 HBase 的性能,则需要添加新的节点或者提升已有节点的规格;如果是数据容量的扩容,其实就是提升其依赖的 HDFS 进行存储上限,本文主要记录后者,即:扩容 HDFS 的存储空间,可选两种扩容方式:
- 横向扩容:即通过新增 DataNode 节点的方式
- 纵向扩容:即通过给已有节点添加数据盘或者扩容数据盘的方式
二、【纵向扩容 - 详述】:给已有节点添加数据盘(基于滴滴云 VM 主机自建 hadoop 集群):
- 在公有云上创建磁盘并分配到主机
- 登录主机执行命令(裸盘挂载,新的数据存储目录、盘符等信息根据实际情况修改):
- 查看磁盘列表:
fdisk -l
- 为新盘创建文件系统:
mkfs.xfs /dev/vdb
- 创建新的数据目录:
mkdir -p /lxdata01
- 执行挂载:
mount /dev/vdb /lxdata01
- 创建数据目录:
mkdir -p /lxdata01/data/datanode/
- 查看挂载结果:
df -h
- 添加开机自动挂载(数据存储目录、盘符、磁盘 UUID 等信息根据实际情况修改):
- 获取磁盘 UUID:
ls -al /dev/disk/by-uuid | grep vdb
- 备份 fstab 文件:
cp /etc/fstab /etc/fstab.orig
- 编辑 fstab 文件,添加挂载项,内容:
UUID=5859dc5f-8978-4592-b766-beea3260408a /lxdata01 xfs defaults 0 0
- 获取磁盘 UUID:
- 查看磁盘列表:
- 修改需要扩容的 DataNode 节点的 hadoop/hdfs-site.xml 配置文件,新增或修改磁盘选择策略、修改增加 dfs.datanode.data.dir 数据目录(用逗号分隔),示例:
<!-- 设置datanode存放的路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/lxapp/data/datanode,/lxdata01/data/datanode</value>
</property>
<!-- 设置磁盘选择策略-->
<property>
<name>dfs.datanode.fsdataset.volume.choosing.policy</name>
<value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
</property>
- 在新增数据盘的主机上重启 DataNode:
- 停止 datanode 进程(停止后使用 jps 观察是否正常停止,没有正常停止的话可以手动 kill):
hdfs --daemon stop datanode
低版本可以进入 hadoop 目录执行:
./sbin/hadoop-daemon.sh stop datanode
- 启动 datanode 进程(停止后使用 jps 观察是否正常启动,没有正常启动的话检查配置文件):
hdfs --daemon start datanode
低版本可以进入 hadoop 目录执行:
./sbin/hadoop-daemon.sh start datanode
- 在 ui 控制台:http://x.x.x.x:50070 观察 datanode 节点状态、容量、以及 Last Connect 的指标是否正常;
- 【注】默认 hadoop 的 pid 存储文件夹为/tmp,把 pid 文件放在这儿很容易丢失从而导致集群无法停止,临时处理方法就是手动 kill 进程,长期处理办法为更换目录并重启,描述如下:
- 建议 hbase 和 hadoop 分开操作:
- hbase:
- 创建目录:
mkdir /lxapp/hbase-2.2.4/pids
- 停止服务:
/lxapp/hbase-2.2.4/bin/stop-hbase.sh
- 修改 hbase 配置(hbase-2.2.4/conf/hbase-env.sh):
export HBASE_PID_DIR=/lxapp/hbase-2.2.4/pids
- 启动 hbase:
/lxapp/hbase-2.2.4/bin/start-hbase.sh
- 创建目录:
- hadoop:
- 创建目录:
mkdir /lxapp/hbase-2.2.4/pids
- 停止服务:
/lxapp/hadoop-3.2.1/sbin/stop-all.sh
- 修改 hadoop 配置(hadoop-3.2.1/etc/hadoop/hadoop-env.sh):
export HADOOP_PID_DIR=/lxapp/hadoop-3.2.1/pids
- 启动 hadoop:
/lxapp/hadoop-3.2.1/sbin/start-all.sh
- 创建目录:
- hbase:
- 建议 hbase 和 hadoop 分开操作:
- 停止 datanode 进程(停止后使用 jps 观察是否正常停止,没有正常停止的话可以手动 kill):
- 由于已有 DataNode 上的原有磁盘数据快满,新加的磁盘又是空的,就导致磁盘间的数据不平衡。在 Hadoop3.0 以下版本里,可以通过设置新增数据的磁盘选择策略(参数 dfs.datanode.fsdataset.volume.choosing.policy,值为: org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy,这样新来数据会尽量往空闲磁盘上写,但是它需要一个较长的时间的过程才能达到平衡。Hadoop3.0+版本提供了 disk-balancer 工具用以手动执行存储平衡,操作说明如下:
- 创建平衡计划(最后一个字段为 nodename,以 lx-dev-hbase01 为例):
hdfs diskbalancer -plan lx-dev-hbase01
- 查看计划:
hdfs dfs -ls /system/diskbalancer/
- 执行计划(最后一个字段为 planID,后台执行):
nohup hdfs diskbalancer -execute /system/diskbalancer/xxxx-xxx-xx-xx-xx-xx &
- 异步执行,需要一些时间,查看计划执行状态:
hdfs diskbalancer -query lx-dev-hbase01
- 取消执行:
hdfs diskbalancer -cancel planID -node nodename
- 创建平衡计划(最后一个字段为 nodename,以 lx-dev-hbase01 为例):
- 操作无误后即可访问 ui 控制台:http://x.x.x.x:50070 观察 datanode 节点状态、容量、以及 Last Connect 的指标是否正常;
- 检查 hbase 状态(UI 或者命令行),如果状态异常,重启 hbase:
- 停止:
/lxapp/hbase-2.2.4/bin/stop-hbase.sh
- 启动:
/lxapp/hbase-2.2.4/bin/start-hbase.sh
- 停止:
三、【横向扩容 - 详述】新增 DataNode 节点(仅描述大致流程):
- 新的 DataNode 节点初始化(JAVA 运行环境、数据盘等)
- 所有节点修改 hosts 文件添加新节点信息,各节点间建立 ssh 互信(主要实现 NameNode 免密访问 DataNode,为避免故障期间发生漂移,建议所有节点间都建立 ssh 互信)
- 修改节点的 slave 文件(hadoop-3.2.1/etc/hadoop/workers)添加新节点信息(该文件主要是 master 节点上使用,建议也是所有节点上都配置且保持一致)
- 将完成修改的 hadoop 目录整个拷贝到新节点上,启动 DataNode(会自动加入集群):
/lxapp/hadoop-3.2.1/sbin/hadoop-daemon.sh start datanode
- 在 namenode 通过:
hdfs dfsadmin -report
查看集群情况 - 通过脚本进行数据均衡:
/lxapp/hadoop-3.2.1/sbin/start-balancer.sh -threshold 5
- 启动 yarn 的 Nodemanager(会自动加入集群):
yarn-daemon.sh start nodemanager
- 在 ResourceManager 节点上,通过
yarn node -list
查看集群情况