现有hbase1.3集群集成了phoenix 4.14.1版本,在nifi的PutSql执行upsert into xxx select xxx from xxx时,等待很久之后返回报错,数据写不进,后用命令行sqlline.py执行也是如此:
Error: ERROR 730 (LIM02): MutationState size is bigger than maximum allowed number of bytes (state=LIM02,code=730)
尝试解决,按照网上的方法修改如下参数:
hbase-site.xml
<property>
<name>phoenix.mutate.batchSize</name>
<value>15000000</value>
</property>
<property>
<name>phoenix.mutate.maxSize</name>
<value>200000</value>
</property>
<property>
<name>phoenix.mutate.maxSizeBytes</name>
<value>1048576000</value>
</property>
重试无效,但是在图形界面客户端工具dbeaver和SQuirreL(瘦客户端)下均能很快返回正常。
遂决定升级phoenix4.15.0-hbase1.3,升级很顺利,重启hbase成功。但是发现phoenix4.15.0没有thin-client.jar包,是不是取消了瘦客户端连接,有人知道吗?再次在sqlline.py执行upsert into,显示成功,但是耗时太长,在dbeaver和SQuirreL基本上6秒返回,数据量100万,nifi上还是报错
决定还是退回phoenix4.14.1,将jar包替换成4.14.1,这时hbase regionserver起不来了,报错:
2020-05-28 09:01:22,333 ERROR [RS_OPEN_PRIORITY_REGION-HDP-002:16020-2] handler.OpenRegionHandler: Failed open of region=SYSTEM:TASK,,1590570526285.64d8dd51d95a9de78c4e258ca4bf8631., starting to roll back the global memstore size.
java.io.IOException: Class org.apache.phoenix.coprocessor.TaskRegionObserver cannot be loaded
at org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost.testTableCoprocessorAttrs(RegionCoprocessorHost.java:341)
at org.apache.hadoop.hbase.regionserver.HRegion.checkClassLoading(HRegion.java:6763)
at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:6707)
at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:6669)
at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:6640)
at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:6596)
at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:6547)
at org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.openRegion(OpenRegionHandler.java:362)
at org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.process(OpenRegionHandler.java:129)
at org.apache.hadoop.hbase.executor.EventHandler.run(EventHandler.java:129)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
且有好多Failed open of region,原因是 hbase数据和元数据不吻合,下面开始解决:
1、备份hdfs的表数据
hdfs dfs -mv /hbase/data/default /hbase.default.back
hdfs dfs -mv /hbase/data/ODS_JBYL /hbase.ODS_JBYL.back
hdfs dfs -mv /hbase/data/SYSTEM /hbase.SYSTEM.back
2、删除hdfs中的hbase数据目录的全部数据
hdfs dfs -rm -r /hbase
3、恢复hbase表数据
hdfs dfs -mkdir -p /hbase/data/
hdfs dfs -mv /hbase.default.back /hbase/data/default
hdfs dfs -mv /hbase.ODS_JBYL.back /hbase/data/ODS_JBYL
hdfs dfs -mv /hbase.SYSTEM.back /hbase/data/SYSTEM
4、删除zk中的hbaes元数据
zkCli.sh
rmr /hbase
5、删除多余的phoenix表数据
hdfs dfs -rm -r /hbase/data/SYSTEM/CHILD_LINK
hdfs dfs -rm -r /hbase/data/SYSTEM/MUTEX
hdfs dfs -rm -r /hbase/data/SYSTEM/TASK
6、重启hbase
此时hbase可以正常启动,下面开始恢复元数据,所有报错的表全部都要按照如下步骤修复:
注意:一定要在所有Region都上线之后再修复,否则修复之后可能出现重复Region
步骤1. hbase hbck 检查输出所以ERROR信息,每个ERROR都会说明错误信息,类似如下:
ERROR: Found inconsistency in table SYSTEM:TASK
ERROR: There is a hole in the region chain between and . You need to create a new .regioninfo and region dir in hdfs to plug the hole.
步骤2. hbase hbck -fixTableOrphans 先修复tableinfo缺失问题,根据内存cache或者hdfs table 目录结构,重新生成tableinfo文件。
步骤3. hbase hbck -fixHdfsOrphans 修复regioninfo缺失问题,根据region目录下的hfile重新生成regioninfo文件
步骤4. hbase hbck -fixHdfsOverlaps 修复region重叠问题,merge重叠的region为一个region目录,并从新生成一个regioninfo
步骤5. hbase hbck -fixHdfsHoles 修复region缺失,利用缺失的rowkey范围边界,生成新的region目录以及regioninfo填补这个空洞。
步骤6. hbase hbck -fixMeta 修复meta表信息,利用regioninfo信息,重新生成对应meta row填写到meta表中,并为其填写默认的分配regionserver
步骤7. hbase hbck -fixAssignments 把这些offline的region触发上线,当region开始重新open 上线的时候,会被重新分配到真实的RegionServer上 , 并更新meta表上对应的行信息。
一切完成后可以查询测试一下。
在phoenix里删除多余的元数据表信息:
delete from system.catalog where table_name = 'CHILD_LINK';
delete from system.catalog where table_name = 'MUTEX';
delete from system.catalog where table_name = 'TASK';
最后再看phoenix4.15.0和phoenix4.14.1还是有很大区别的,回退版本时可能会导致一系列问题。