HBase集群管理

物联网

  通过之前文章的描述,我们已经有能力设计并部署搭建HBase集群了

  当我们的HBase集群开始运行的时候,新的挑战又来了

  例如,我们可能会遇到在集群运行的时候添加或者删除节点

  又或者需要拷贝/备份整个集群的数据等等

  如何在集群运行的时候以最小的代价来执行这些操作呢?

  下面总结一下HBase集群的相关运维和管理知识点

  运维任务

  添加/删除节点

  在HBase中动态添加/删除节点非常简单,只需要一些命令操作即可,HBase会自动帮你处理节点上下线需要做的事情

  添加节点

  1.修改conf目录下的regionservers文件,将新节点的主机名另起一行添加进去

  2.复制该文件到集群中的所有机器

  3.启动该机器完成节点的添加

  节点启动之后会在ZK上注册创建对应的znode, 然后它会加入集群被分配region等

  启动该节点的方式有两种:

  master节点上执行start-hbase.sh脚本,其会检查regionservers文件并跳过已经启动的子节点,将其中未启动的节点启动

  对应的子节点上执行hbase-daemon.sh start regionserver命令,随后该机器上的RegionServer服务启动

  删除节点

  首先到需要停止运行的机器上执行:

  hbase-daemon.sh stop regionserver

  随后该节点关闭所有region,停止进程

  ZK中的znode临时节点将会过期,master会注意到该region服务器停止了, 并按照故障处理的流程将该机器上的所有region重新分配到其他机器上

  下线节点需要注意两点:

  1.如果负载均衡进程正在执行,请先停止,因为其可能会和master转移region产生竞争

  2.如果该节点上的数据量很大,移动region的过程可能很漫长

  另外,在HBase0.90.2以上的版本中可以使用graceful_stop.sh hostname来下线节点

  顾名思义,该脚本可以让节点的下线过程变得“优雅”起来:将region从对应的服务器上一个个移动出来以减少扰动

  添加备份master节点

  由于HBase本身并没有自动提供像HDFS那样的Namenode双节点方案,所以一个潜在的风险就是单点故障问题

  但是HBase允许我们手动启动一个备份的master节点来避免这个问题

  多个master节点存在的情况下,它们会竞争ZK中专用的znode,第一个竞争到的master来提供服务

  其余的master进程只是轮询检查这个znode,当它消失时再次竞争

  我们可以在集群中的另外一台配置一样的机器上启动备用master:

  hbase-daemon.sh start master

  从0.90.x版本开始,也可以在conf目录下的backup-master文件来执行备用服务器

  编辑方式和regionservers一样

  该文件中的master会在集群中的主master和regionserver都启动之后才会启动

  由于master只被设计为集群运行时的协调者,并不占用太多资源

  所以启动多个备用master并没有什么影响,反而启动太少可能会留下隐患

  建议启动两到三个备用master比较合适

  数据迁移任务

  导入和导出

  HBase的jar包中包含了两个以MapReduce作业形式来导入导出数据的工具

  使用方式为:

  hadoop jar ${hbase.jar} export ${tablename} ${outputdir}

  该工具其余的参数可以做到增量导出、控制导出的数据版本等功能,具体使用请看jar包的帮助信息

  导出的数据将会存储在HDFS指定的目录上,之后可以使用hadoop distcp命令拷贝到其他集群上,并在该集群上进行导入操作

  需要注意的是,导出的表和导入的表需要有相同的表模式

  将export导出的文件数据导入到hbase中,使用方式如下:

  hadoop jar hbase-server-*.jar import -D <propertyproperty=value>* 表名 生成文件路径

  其中-D后面的参数包括但不限于为以下几个

  HBASE_IMPORTER_RENAME_CFS:重命名列族,格式为”旧列族名:新列族名”

  import.filter.class:指定过滤器类型,在数据写入前进行过滤

  import.filter.args:指定过滤器之后提供的参数

  import.bulk.output:指定了该参数之后不会直接写入数据,而是生成hfile文件用于bulkload

  可能会有人注意到,其实我们是可以直接使用hadoop distcp命令将HDFS上的hbase根目录整个拷贝到其他集群中