Hbase/HDFS存储扩容实践
一、场景描述:
在Hbase的日常使用中,难免会遇到存储瓶颈的问题,本文描述了基于Hadoop框架自建Hbase集群的存储扩容操作细则
hbase集群依赖于HDFS分布式文件系统和zookeeper;功能说明如下:
-
HDFS为 HBase 提供给了分布式文件存储系统:HDFS。所以对HBase的扩容场景又分为性能提升和数据存储容量提升等场景,如果要提升HBase的性能,则需要添加新的节点或者提升已有节点的规格;如果是数据容量的扩容,其实就是提升其依赖的HDFS进行存储上限,本文主要记录后者,即:扩容HDFS的存储空间,可选两种扩容方式:
-
横向扩容:即通过新增DataNode节点的方式 -
纵向扩容:即通过给已有节点添加数据盘或者扩容数据盘的方式 -
zk主要用于:
-
实现高可靠性:包括 HDFS 的 NameNode 和 YARN 的 ResourceManager 的 HA -
存贮所有 Region 的寻址入口,实时监控 Region Server 的上线和下线信息,并实时通知 Master -
存储 HBase 的 Schema 和 table 元数据
在这种应用场景下,一般三节点的zk集群足够使用了,如果没有明显的zk瓶颈,在hbase及其相关组件的扩容操作中无需进行zk集群相关变更
二、【纵向扩容 - 详述】:给已有节点添加数据盘(基于滴滴云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
-
修改需要扩容的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
-
由于已有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
-
操作无误后即可访问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
查看集群情况