1.备份流程
步骤1在原集群HBASE SHELL下创建快照 create_snapshot 'namespace:tablename','snapshot_tablename';其中参数:namespace是命名空间,tablename创建的表面,例如:dev:t_order,参数snapshot_tablename是自定义的快照名称查看是否创建成功用list_snapshots命令查看全部快照信息
步骤2在原集群往目标机器发送快照信息时,有两个点需要注意一个是备份集群的端口是否开放,和各个SLAVE是否已经打开端口(建议先关闭防火墙之类的软件,方便走通流程),不然同步会报各种错误,先发个完整的同步语句,此语句本人是在原集群中使用,并且两个机器网络是互通的:
命令:hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot snapshot_test_t_order \
-copy-from hdfs://192.168.1.121:9000/hbase \
-copy-to hdfs://192.168.1.20:9000/hbase \
-mappers 16 -bandwidth 20 -overwrite
其中copy-from表示原集群的地址 ,copy-to表示目标集群的地址 并且两个集群必须启动了HADOOP和hbase
常见错误提示例如
1.错误提示:
java.io.IOException: Failed on local exception: com.google.protobuf.InvalidProtocolBufferException:
Protocol message end-group tag did not match expected tag.; Host Details :
local host is: “pmaster/192.168.92.135”; destination host is: “pmaster”:50070;
这里的50070端口是我之前看文章写的用的发现不对,同步的时候使用端口应该使用hadoop命令:
hdfs getconf -confKey fs.defaultFS 查看端口号,命令查看到的是9000,原集群和目标机器都需要使用这个命令来查看同步端口号
2.错误提示:
Permission denied: user=hbase, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x
这个提示是目标集群的目录权限和原集群不一致,可以用hdfs dfs -ls / 在原集群和目标集群查看文件夹所属用于和群组
如果目标集群和原集群不一致可以在目标集群修改目录的读写权限解决 hdfs dfs -chmod -R 777 / 来解决目标集群HADOOP权限问题
3.错误提示:
could only be replicated to 0 nodes instead of minReplication (=1).
There are 3 datanode(s) running and 3 node(s) are excluded in this operation.
我的情况是三个SLAVE没有打开端口为了能使同步进行我把三个SLAVE的防火墙和IPTABLES全部关闭了,然后拷贝就没问题了正常拷贝成功的话会有如下信息,看到这个信息你可以手动捂脸庆祝了
2020-02-16 18:26:32,061 INFO [main] mapreduce.Job: map 0% reduce 0%
2020-02-16 18:26:38,133 INFO [main] mapreduce.Job: map 18% reduce 0%
2020-02-16 18:26:39,140 INFO [main] mapreduce.Job: map 36% reduce 0%
2020-02-16 18:26:40,146 INFO [main] mapreduce.Job: map 55% reduce 0%
2020-02-16 18:26:41,151 INFO [main] mapreduce.Job: map 64% reduce 0%
2020-02-16 18:26:42,157 INFO [main] mapreduce.Job: map 91% reduce 0%
2020-02-16 18:26:43,162 INFO [main] mapreduce.Job: map 100% reduce 0%
步骤3,在目标机器中HBASE SHELL查看快照是否同步成功使用list_snapshots,如果同步的表不是使用的默认命名空间就要 使用:create_namespace '命名空间名称',然后在使用restore_snapshot 'snapshot_tablename'即完成了数据备份
我碰到一种情况是原集群中表使用了coprocessor协处理器而备份库没这个JAR就会使表同步一致卡着,然后集群中SLAVE的REGIONSERVER服务宕掉,
查看日志是说某个自定的类执行失败,查看表是否有些处理器使用describe '命名空间:表名' 如果描述中有如下图的内容说明表设置了协处理,
处理方法有
1.把对应的JAR报移到hbase的lib下或者HADOOP的文件目录中,看配置表时的路径
2.使用命令卸载协处理器(在协处理器不使用的情况使用如下方法,看需求使用方法一和二)
a.disbale目标表
hbase> disable 'users'
b. 使用alter命令移除掉Coprocessor
hbase> alter 'users', METHOD => 'table_att_unset', NAME => 'coprocessor$1'
c. enable目标表
hbase> enable 'users'
然后重新生成快照,重新走上面的流程,如果出现同步异常或者其他问题,在目标集群没数据可以修改的情况下使用我后面说的删除数据的方法重新启动HBASE重新进行同步
2.权限问题
a。hdfs权限问题
原集群和目标集群的hadoop目录的权限是否一致,不一致可以修改目标集群的目录权限来解决
查看权限(原集群和目标集群中使用):hdfs dfs -ls / , 修改目标机器:hdfs dfs -chmod -R 777 /
b。liunx防火墙问题
建议是先关闭目标集群和目标集群的SLAVE的所有防火墙,先让同步完成任何在一步步开启防火墙,不如卡在防火墙这都要卡一段时间不知道为什么
3.配置问题
我在目标集群安装的时候出现过NODEMANGE启动不了,是因为集群的配置文件有几个服务器的配置不同导致的,最好在主机器修改完配置文件后,使用 liunx命令scp复制到各个SLAVE机器防止因为配置不一样引起NODEMANGER或者DATANODE启动不了, 本人NODEMANGE启动不了的原因是配置问题,提示的是
ERROR org.apache.hadoop.yarn.server.nodemanager.NodeStatusUpdaterImpl:
Unexpected error starting NodeStatusUpdater org.apache.hadoop.yarn.exceptions.YarnRuntimeException:
Recieved SHUTDOWN signal from Resourcemanager ,Registration of NodeManager failed, Message from ResourceManager:
NodeManager from localhost doesn't satisfy minimum allocations, Sending SHUTDOWN signal to the NodeManager.
解决方法是修改配置文件yarn-site.xml和yarn-env.sh
分别增加和修改内容为
[yarn-site.xml]
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
[yarn-env.sh]
JAVA_HEAP_MAX=-Xmx2048m
然后重启动机有用了,并且这个也非常影响数据同步
4.清理整个hbase数据,如果碰到解决不了的HBASE提示可以使用如下方式重置HBASE
1.清理hadoop里文件夹的数据
使用命令hdfs dfs -rm -r /hbase
2.清理zk里的数据
1.清理ZK数据文件夹里的VERSION数据
2.清理使用zkCli.sh进入的界面清理zk的数据使用命令rmr /hbase (之前配置安装的数据未清理,出现ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing,清理后正常使用)
清理完在重启下HBASE就是新的环境了
5.推荐文章
hbase快照原理
https://www.cnblogs.com/ballwql/p/hbase_data_transfer.html
http://hbasefly.com/2017/09/17/hbase-snapshot/?bulwvo=dw1sw2