Hbase跨集群迁移以及常用命令

场景:

由于Hbase版本升级以及集群切换,现需要将Hbase从A集群(源)迁移至B集群(目的)

迁移过程:

将源A集群的Hbase需要迁移的表(注意namespace)通过snapshot方式打成快照,然后再通过ExportSnapshot方式迁移至目的B集群,此时目的集群的HDFS目录下的hbase目录会生成 .hbase_snapshot和archive目录,最后在目的集群恢复快照即可。

步骤如下:

(1) 进入集群A,执行hbase shell;
(2) 执行 snapshot 操作:snapshot ‘表名’,‘快照名’;
(3) 通过 ExportSnapshot 将快照数据迁移到集群B 中,权限开启情况下需在hbase 用户下执行命
令,该命令在目的集群B 执行,命令示例如下:

进入hbase用户

su hbase
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot 快照名 -copy-to hdfs://目的集群ip:8020/ apps/hbase/data/
(4) 进入集群B,执行hbase shell;
(5) 恢复快照,命令如下:restore_snapshot ‘快照名’。

迁移脚本

A集群(源)执行脚本

#!/bin/bash

dst_ip=10.10.10.1
echo "开始Hbase迁移"
echo "start : $(date)"
# 将源集群中的Hbase和dbb相关的表输出到本地文件
echo "list" | hbase shell | grep '^dbbd_namespace*'>/root/jws/hbase_list.txt

# 读取列表的数据循环执行快照,如果存在该快照,先删除同名快照
while read line
do
    #echo "$line"
    dst_name=`echo "$line" | awk -F ':' '{print $2}'`
    #echo "$dst_name"
    echo "snapshot '$line','snapshot_$dst_name'" | hbase shell
done < /root/jws/hbase_list.txt

echo "list_snapshots" | hbase shell | grep '^ snapshot_*'>/root/jws/snapshots_list.txt

# 使用hbase用户执行命令
while read line
do
    dst_name=`echo "$line" | awk -F ':' '{print $2}'`
    echo "$dst_name"
    # 迁移快照
    su hbase -c "hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot --mappers 200 -snapshot snapshot_${dst_name} -copy-to hdfs://${dst_ip}:8020/apps/hbase/data/"
done < /root/jws/hbase_list.txt

echo "迁移完成"
echo "end : $(date)"

# 开始在目的集群执行恢复操作
echo "开始恢复快照"
sshpass -p "Password" ssh root@${dst_ip} "nohup sh /root/jws/restore_snapstots.sh &"
echo "执行完成,请在目的集群查看恢复进度日志"

安装sshpass (远程执行工具)

[root@test ~]# yum -y install sshpass

B集群(目的)被执行脚本:

#!/bin/bash

#开始恢复
echo "开始恢复!"
echo "start : $(date)"
#进入Hbase执行list_snapshots重定向到snapshots_list.txt
echo "list_snapshots" | hbase shell | grep '^ snapshot*' > /root/jws/snapshot_list.txt

#判断Hbase中是否有dbbd的namespace,没有则创建
if ! echo "list_namespace" | hbase shell | grep '^dbbd_namespace$';then
    echo "create_namespace 'dbbd_namespace'" | hbase shell
    echo "创建dbbd_namespace成功"
fi

#循环读取快照并恢复
while read line
do
    #echo "$line"
    dst_line=`echo "$line" | awk -F ' ' '{print $1}'`
    echo "$dst_line"
    echo "restore_snapshot '$dst_line'" | hbase shell
done < /root/jws/snapshot_list.txt

echo "执行完成!"
echo "end : $(date)"

遇到的问题

修改HBASE参数,重新异地跨集群迁移
HBase数据迁移过程中遇到的问题:
1) 对HBase表做snapshot时提示超时导致snapshot失败,报错信息:org.apache.hadoop.hbase.errorhandling.TimeoutException: Timeout elapsed! Source: Timeout caused Foreign Exception Start:1637651485261, End:1637651785262, diff:300001, max:300000 ms
调整HBase服务hbase.snapshot.master.timeout.mills和hbase.snapshot.region.timeout至10分钟。
2) 在恢复HBase快照的时候,提示HFile文件不存在,该问题是由于HBase单表数据过大,达到T级别,HFile文件被定时清理,定时由参数hbase.master.hfilecleaner.ttl控制,默认值5分钟,调整到10个小时,可以恢复快照。

#添加至HBASE自定义配置中(hbase-site.xml)

 

 可参考:https://blog.csdn.net/b6ecl1k7BS8O/article/details/94918595

常用命令:

禁用表
disable 'dbbd_namespace:dm_customize_task_result_config_statistics'

删除表
drop 'dbbd_namespace:dm_customize_task_result_config_statistics'

删除快照
delete_snapshot 'snapshot_dm_customize_task_result_config_statistics'

删除快照时,同时要删除HDFS中/apps/hbase/data/archive/data/下命名空间中的具体快照数据,如果源数据有变更需要重新做快照迁移,在源集群中也需要删除快照和快照数据。
hdfs dfs -du -h /apps/hbase/data/archive/data/dbbd_namespace/dm_customize_task_result_config_statistics hdfs dfs -rm -r -skipTrash /apps/hbase/data/archive/data/dbbd_namespace/dm_customize_task_result_config_statistics

恢复快照
restore_snapshot 'snapshot_dm_customize_task_result_config_statistics'

  

 

HBase入门基本:命名空间、建表、增删改查

进入HBase数据库

# hbase shell

注意HBase Shell 中的回格键没用,要用【Ctrl+Backspace】,每个命令之后不需要分号(;)结束。

HBase帮助命令:

hbase> help 'create'

  

命名空间

列出所有命名空间

hbase> list_namespace

新建命名空间

hbase> create_namespace 'ns1'

删除命名空间

hbase> drop_namespace 'ns1'

  该命名空间必须为空,否则会报错。

修改命名空间

hbase> alter_namespace 'ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}

  

列出所有表

hbase> list

  

新建表

hbase> create 'ns1:t1', 'cf1'

  新建一个以命名空间ns1的表t1,列族为cf1。

删除表

hbase> disable 'ns1:t1'
hbase> drop 'ns1:t1' 

修改表名
HBase没有rename命令,可以通过快照功能修改表名,详见下述。

查看表内容

hbase> scan 'ns1:t1'
hbase> scan 'ns1:t1', {LIMIT=>5} # 查看前5行数据

插入

hbase> put 'ns1:t1', 'r1', 'cf1:c1', 'value'

 

快照

查看快照

hbase> list_snapshots

新建快照:

hbase> snapshot 'sourceTable', 'snapshotName'

从快照复制生成一个新表:

hbase> clone_snapshot 'snapshotName', 'gld:student'

删除快照:

hbase> delete_snapshot ‘snapshotName’

  

命令罗列:

1、进入到hbase shell
hbase shell

2、查看当前版本
version

3、查看命名空间
list_namespace

4、查看命名空间下的表
list_namespace_tables 命名空间

5、创建namespace(命名空间)
create_namespace 'test'

6、删除namespace(命名空间),删除表空间前,要先把表空间内的表全部删除
drop_namespace 'test'

7、查看命名空间下有多少表
list_namespace_tables 'test'

8、创建表
create 'test:student','baseInfo','schoolInfo'

9、删除表操作,删除表之前先禁用表,否则删除失败
disable 'test:student'
drop 'test:student'

10、查询表结构
describe 'test:student'

11、插入数据
put 'test:student','rowkey1','baseInfo:name','zhangsan'

12、查询表数据
get 'test:student','rowkey1','baseInfo'

13、查看状态
status

14、帮助命令
help '命令'

15、判断表是否存在
exists 'test:student'

16、新增列簇
alter 'test:student','teacherInfo'

17、删除列簇
alter 'test:student','teacherInfo',,{NAME=>'teacherInfo',METHOD=>'delete'}

18、设置列簇记录三个版本
alter 'test:student',{NAME=>'baseInfo',VERSIONS=>3}

19、全表扫描查询
scan 'test:student'

20、条件过滤查询
scan 'test:student',{COLUMN=>'baseInfo'}

21、删除指定列簇下的列
delete 'test:student','rowkey1','baseInfo:age''

22、删除指定行 rowkey
exists 'test:student'

 

posted @ 2023-05-08 15:23  香菜哥哥  阅读(327)  评论(0编辑  收藏  举报