HBase问题
1.HBase Region问题
问题
现场反映数据查询错误,界面上显示有总数和分页,但查询的详细信息却为空。排查后总体表现如下:
1、 hbase界面的region存在黑洞。
2、 hbase region界面多出了很多奇怪的region,Startrow和endrow都不是正常数据可能产生的region。
3、 很多region未上线。
存在多个start region和多个end region
事故原因分析
一、hbase split过程
1、 首先各种校验省不了。比如region是否在对应regionServer中,splitPoint是否符合要求等等。
2、 如果没有指定splitPoint,根据策略(共3种)分region。这里使用的是默认的IncreasingToUpperBoundRegionSplitPolicy策略。
3、 调用线程池,开线程执行split
3.1.createDaughters 创建两个region,获得parent region的写锁
3.1.1在zk上创建一个临时的node splitting point,
3.1.2等待master直到这个region转为splitting状态
3.1.3之后建立splitting的文件夹,
3.1.4等待region的flush和compact都完成后,关闭这个region
3.1.5从HRegionServer上移除,加入到下线region中
3.1.6进行regionsplit操作,创建线程池,用StoreFileSplitter类将region下的所有 Hfile(StoreFile)进行split,(split row在hfile中的不管,其他的都进行引用,把引用文件分别写到region下边)
3.1.7.生成左右两个子region,删除meta上parent,根据引用文件生成子region的regioninfo,写到hdfs上
3.2.stepsAfterPONR 调用DaughterOpener类run打开两个子region,调用initilize
3.2.1.向hdfs上写入.regionInfo文件以便meta挂掉以便恢复
3.2.2.初始化其下的HStore,主要是LoadStoreFiles函数:
对于该store函数会构造storefile对象,从hdfs上获取路径和文件,每个文件一个 storefile对象,对每个storefile对象会读取文件上的内容创建一个HalfStoreFileReader读对象来操作该region的父region上的相应的文件,及该region上目前存储的是引用文件,其指向的是其父region上的相应的文件,对该region的所有读或写都将关联到父region上 将子Region添加到rs的online region列表上,并添加到meta表上。
二、原因分析
由于region出现黑洞和多个start region以及多个end region,split应该已经执行了下线父region,创建两个子region的过程。此时断电导致数据写入错误,或者hdfs产生坏块。重启后错误的region上线致使表中的数据部分丢失。但其它未错乱的数据还是有的。
基本上,数据丢失已经无法避免了。下面讨论的问题是介绍和使用hbase hbck工具解决hbase的hole(黑洞)、orphan(孤儿)、overlap(重叠)meta丢失、regioninfo丢失等不一致问题。
解决方案
- sh hbase hbck –details:检查hbase是否存在不一致问题。
Status:OK,表示没有发现不一致问题。
Status:INCONSISTENT,表示有不一致问题。
- hole问题:指一张表中的多个region的startrow和endrow不能连贯,不能完全覆盖所有数据,产生数据空洞。
黑洞的产生基本都是region丢失导致的,可以去hdfs的/hbase/archive目录找找是否存在丢失的region。如果不存在,这个region的数据也就找不回来了。Hbase在split此时数据入录可能丢失,需要修补。可以使用
sh hbase hbck –fixHdfsHoles填补region。fixHdfsHoles只是创建region,并不挂载,需要再执行-fixAssignments -fixMeta 解决问题
所以有了组合拳 -repairHoles 相当于执行了-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans修复region holes。
- orphan问题:一张表中存在一个起始region和一个结束region。两者缺失一个就是orphan。这里有两种可能,
a.刚好起始的region丢失,使用-fixHdfsOrphans,修复Orphan region(hdfs上面没有.regioninfo的region)
b.tableinfo错误,使用-fixTableOrphans。
- overlap问题:指多个region的startrow和endrow中有部分或全部重叠,导致数据不知应该放在那个region上。使用-fixHdfsOverlaps修复重叠 region。另外-maxMerge <n>可以将几个重叠的region合并,一次合并的region数最大不超过n。
- meta丢失:hbase中维护了一张描述表信息的表,描述了每张表的region等基本信息。可以通过hbase shell scan’hbase:meta’查看。若meat表错误或丢失,该region就无法上线。可通过-fixMeta修复。
-fixMeta通过hdfs上的regioninfo修复meta信息,所以若regioninfo丢失无法正确生成meta表。
- regioninfo丢失:regioninfo丢失,数据无法恢复了,只能把它当做holes来处理,使用- repairHoles生成新的regioninfo,而数据已经丢失。
hbase针对常见的不一致问题给出了一些组合技能,下面介绍组合命令
1、-repairHoles:用于修复黑洞等regioninfo丢失的问题。等价于-fixAssignments -fixMeta –fixHdfsHoles。数据会丢失。
2、- repair:用于修复所有常见问题,相当于一键修复。等价于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps -fixReferenceFiles –fixTableLocks