通过之前文章的描述,我们已经有能力设计并部署搭建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根目录整个拷贝到其他集群中