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丢失等不一致问题。

解决方案

  1. sh hbase hbck –details:检查hbase是否存在不一致问题。

Status:OK,表示没有发现不一致问题。

Status:INCONSISTENT,表示有不一致问题。

  1. 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。

  1. orphan问题:一张表中存在一个起始region和一个结束region。两者缺失一个就是orphan。这里有两种可能,

a.刚好起始的region丢失,使用-fixHdfsOrphans,修复Orphan region(hdfs上面没有.regioninfo的region)

b.tableinfo错误,使用-fixTableOrphans。

  1. overlap问题:指多个region的startrow和endrow中有部分或全部重叠,导致数据不知应该放在那个region上。使用-fixHdfsOverlaps修复重叠 region。另外-maxMerge <n>可以将几个重叠的region合并,一次合并的region数最大不超过n。
  2. meta丢失:hbase中维护了一张描述表信息的表,描述了每张表的region等基本信息。可以通过hbase shell scan’hbase:meta’查看。若meat表错误或丢失,该region就无法上线。可通过-fixMeta修复。

-fixMeta通过hdfs上的regioninfo修复meta信息,所以若regioninfo丢失无法正确生成meta表。

  1. regioninfo丢失:regioninfo丢失,数据无法恢复了,只能把它当做holes来处理,使用- repairHoles生成新的regioninfo,而数据已经丢失。

hbase针对常见的不一致问题给出了一些组合技能,下面介绍组合命令

1、-repairHoles:用于修复黑洞等regioninfo丢失的问题。等价于-fixAssignments -fixMeta –fixHdfsHoles。数据会丢失。

2、- repair:用于修复所有常见问题,相当于一键修复。等价于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps -fixReferenceFiles –fixTableLocks

posted on 2017-06-13 11:07  一笑之奈何  阅读(798)  评论(0编辑  收藏  举报