vlambda博客
学习文章列表

Hbase/HDFS存储扩容实践

一、场景描述:

在Hbase的日常使用中,难免会遇到存储瓶颈的问题,本文描述了基于Hadoop框架自建Hbase集群的存储扩容操作细则

hbase集群依赖于HDFS分布式文件系统和zookeeper;功能说明如下:

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

    • 横向扩容:即通过新增DataNode节点的方式
    • 纵向扩容:即通过给已有节点添加数据盘或者扩容数据盘的方式
  2. zk主要用于:

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

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

二、【纵向扩容 - 详述】:给已有节点添加数据盘(基于滴滴云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等信息根据实际情况修改):
    1. 获取磁盘UUID: ls -al /dev/disk/by-uuid | grep vdb
    2. 备份fstab文件: cp /etc/fstab /etc/fstab.orig
    3. 编辑 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

    1. 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节点(仅描述大致流程):

  • 新的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 查看集群情况
- END -