自建Hbase空间不足?扩HDFS的容!

公众号:yunops

一、场景描述:

hbase 分布式集群依赖于 hadoop 和 zookeeper 集群;说明如下:

  1. zk 主要用于: - 实现高可靠性:包括 HDFS 的 NameNode 和 YARN 的 ResourceManager 的 HA - 存贮所有 Region 的寻址入口,实时监控 Region Server 的上线和下线信息,并实时通知 Master - 存储 HBase 的 Schema 和 table 元数据

    在这种应用场景下,一般三节点的 zk 集群足够使用了,如果没有明显的 zk 瓶颈,在 hbase 及其相关组件的扩容操作中无需进行 zk 集群相关变更

  2. hadoop 系统为 HBase 提供给了分布式文件存储系统:HDFS。所以对 HBase 的扩容场景又分为性能提升和数据存储容量提升等场景,如果要提升 HBase 的性能,则需要添加新的节点或者提升已有节点的规格;如果是数据容量的扩容,其实就是提升其依赖的 HDFS 进行存储上限,本文主要记录后者,即:扩容 HDFS 的存储空间,可选两种扩容方式:
    • 横向扩容:即通过新增 DataNode 节点的方式
    • 纵向扩容:即通过给已有节点添加数据盘或者扩容数据盘的方式

二、【纵向扩容 - 详述】:给已有节点添加数据盘(基于滴滴云 VM 主机自建 hadoop 集群):

  1. 在公有云上创建磁盘并分配到主机
  2. 登录主机执行命令(裸盘挂载,新的数据存储目录、盘符等信息根据实际情况修改):
    • 查看磁盘列表: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
  3. 修改需要扩容的 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>
  1. 在新增数据盘的主机上重启 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:
          1. 创建目录:mkdir /lxapp/hbase-2.2.4/pids
          2. 停止服务:/lxapp/hbase-2.2.4/bin/stop-hbase.sh
          3. 修改 hbase 配置(hbase-2.2.4/conf/hbase-env.sh):export HBASE_PID_DIR=/lxapp/hbase-2.2.4/pids
          4. 启动 hbase:/lxapp/hbase-2.2.4/bin/start-hbase.sh
        • hadoop:
          1. 创建目录:mkdir /lxapp/hbase-2.2.4/pids
          2. 停止服务:/lxapp/hadoop-3.2.1/sbin/stop-all.sh
          3. 修改 hadoop 配置(hadoop-3.2.1/etc/hadoop/hadoop-env.sh):export HADOOP_PID_DIR=/lxapp/hadoop-3.2.1/pids
          4. 启动 hadoop:/lxapp/hadoop-3.2.1/sbin/start-all.sh
  2. 由于已有 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
  3. 操作无误后即可访问 ui 控制台:http://x.x.x.x:50070 观察 datanode 节点状态、容量、以及 Last Connect 的指标是否正常;
  4. 检查 hbase 状态(UI 或者命令行),如果状态异常,重启 hbase:
    • 停止:/lxapp/hbase-2.2.4/bin/stop-hbase.sh
    • 启动:/lxapp/hbase-2.2.4/bin/start-hbase.sh

三、【横向扩容 - 详述】新增 DataNode 节点(仅描述大致流程):