Sorry for a long time break of the discussion about this problem.
Till now, I found one possible reason cause this problem.

The main reason of this problem is the splitted region could be online again.
The following is my anylysis:

(The cluster has two HMatser, one active and one standby)

1.While the active HMaster shutdown, the standby one would become the active 
one, and went into the processFailover() method:
    if (regionCount == 0) {
      LOG.info("Master startup proceeding: cluster startup");
      this.assignmentManager.cleanoutUnassigned();
      this.assignmentManager.assignAllUserRegions();
    } else {
      
      LOG.info("Master startup proceeding: master failover");
      this.assignmentManager.processFailover();
    }
2.After that, the user regions would be rebuild.
  Map<HServerInfo,List<Pair<HRegionInfo,Result>>> deadServers = 
rebuildUserRegions(); 

3.Here's how the rebuildUserRegions worked. All the regions(contain the 
splitted regions) would be added to the offlineRegions of offlineServers.

   for (Result result : results) {
      Pair<HRegionInfo,HServerInfo> region =
        MetaReader.metaRowToRegionPairWithInfo(result);
      if (region == null) continue;
      HServerInfo regionLocation = region.getSecond();
      HRegionInfo regionInfo = region.getFirst();
      if (regionLocation == null) {
        // Region not being served, add to region map with no assignment
        // If this needs to be assigned out, it will also be in ZK as RIT
        this.regions.put(regionInfo, null);
      } else if (!serverManager.isServerOnline(
          regionLocation.getServerName())) {
        // Region is located on a server that isn't online
        List<Pair<HRegionInfo,Result>> offlineRegions =
          offlineServers.get(regionLocation);
        if (offlineRegions == null) {
          offlineRegions = new ArrayList<Pair<HRegionInfo,Result>>(1);
          offlineServers.put(regionLocation, offlineRegions);
        }
        offlineRegions.add(new Pair<HRegionInfo,Result>(regionInfo, result));
      } else {
        // Region is being served and on an active server
        regions.put(regionInfo, regionLocation);
        addToServers(regionLocation, regionInfo);
      }
    }

4.It seems that all the offline regions will be added to RIT and online again:
ZKAssign will creat node for each offline never consider the splitted ones. 

AssignmentManager# processDeadServers
  private void processDeadServers(
      Map<HServerInfo, List<Pair<HRegionInfo, Result>>> deadServers)
  throws IOException, KeeperException {
    for (Map.Entry<HServerInfo, List<Pair<HRegionInfo,Result>>> deadServer :
      deadServers.entrySet()) {
      List<Pair<HRegionInfo,Result>> regions = deadServer.getValue();
      for (Pair<HRegionInfo,Result> region : regions) {
        HRegionInfo regionInfo = region.getFirst();
        Result result = region.getSecond();
        // If region was in transition (was in zk) force it offline for reassign
        try {
          ZKAssign.createOrForceNodeOffline(watcher, regionInfo,
              master.getServerName());
        } catch (KeeperException.NoNodeException nne) {
          // This is fine
        }
        // Process with existing RS shutdown code
        ServerShutdownHandler.processDeadRegion(regionInfo, result, this,
            this.catalogTracker);
      }
    }
  }

AssignmentManager# processFailover
    // Process list of dead servers
    processDeadServers(deadServers);
    // Check existing regions in transition
    List<String> nodes = ZKUtil.listChildrenAndWatchForNewChildren(watcher,
        watcher.assignmentZNode);
    if (nodes.isEmpty()) {
      LOG.info("No regions in transition in ZK to process on failover");
      return;
    }
    LOG.info("Failed-over master needs to process " + nodes.size() +
        " regions in transition");
    for (String encodedRegionName: nodes) {
      processRegionInTransition(encodedRegionName, null);
    }

So I think before add the region into RIT, check it at first.

Thanks!

Jieshan Bean


--------------------------------


I didn't run the hbck to check the system. The environment has been recovered 
now, so I need to recreate the problem,and run then run hbck, maybe it could 
give some helpful information.
Thanks!

Jieshan Bean

-------------

Can you run hbck?

J-D

2011/5/17 bijieshan <[email protected]>:
> Yes, you're right. While count the .META., the result will exclude the -ROOT- 
> region and the .META. region. Pardon me ,I should not mention about that.
> Maybe the less 2 region is just a coincidence here, I can show another 
> scenario about this problem:
>
> From WebUI, we can see that:
>
> Address Start Code Load
> C4C3.site:60030 1305620850621 requests=0, regions=10227, usedHeap=2161, 
> maxHeap=8175
> C4C4.site:60030 1305620851291 requests=0, regions=10234, usedHeap=2593, 
> maxHeap=8175
> C4C5.site:60030 1305620851505 requests=0, regions=10227, usedHeap=2191, 
> maxHeap=8175
> Total:  servers: 3   requests=0, regions=30688
>
> From HMaster logs:
>
> 2011-05-18 10:06:08,382 INFO org.apache.hadoop.hbase.master.LoadBalancer: 
> Skipping load balancing.  servers=3 regions=30681 average=10227.0 
> mostloaded=10227 leastloaded=10227
> 2011-05-18 10:06:13,365 DEBUG org.apache.hadoop.hbase.zookeeper.ZKUtil: 
> hconnection opening connection to ZooKeeper with ensemble 
> (C4C3:2181,C4C2:2181,C4C1:2181)
>
>
> 30681 & 30688
>
> 7 region differ from this  scenario.
>
> Thanks!
>
> Regards,
> Jieshan Bean
>
>
> ----- -----
> Re: Regions count is not consistant between the WEBUI and LoaderBalancer
>
> .META. does not include region information for itself or -ROOT- so a count
> of .META. should always be two regions less than the total number.
>
> -chris
>
> On Tue, May 17, 2011 at 4:32 AM, bijieshan <[email protected]> wrote:
>
>> This problem seems happened with high probability, I have saw it several
>> times.
>>
>> Here's the description about this problem:
>>
>> 1.From the WEBUI, I can see the regions count is:35087.
>> 2.From the HBase shell, I counted the '.META.' table, and it showed there's
>> 35085 regions.
>>
>> hbase(main):001:0> count '.META.',10000
>> 11/05/14 14:12:22 INFO jute.BinaryInputArchive: Expecting maxBufferString
>> as an integer but got as null.Hence setting to default value 1048575
>> Current count: 10000, row:
>> hello,080472,1305272720373.ec0eb8c1bb414967241155cf0985241e.
>> Current count: 20000, row:
>> hello,161272,1305272956858.e16008645368590dfa735abc61024db6.
>> Current count: 30000, row:
>> ufdr,061870,1305171874909.eddc77cbfa2f93feef49f4485d9b88a5.
>> 35085 row(s) in 2.5250 seconds
>>
>> 3.From the HMaster logs, I saw that:
>>
>> 2011-05-14 14:13:57,546 INFO org.apache.zookeeper.ClientCnxn: EventThread
>> shut down
>> 2011-05-14 14:14:01,303 INFO org.apache.hadoop.hbase.master.LoadBalancer:
>> Skipping load balancing.  servers=4 regions=35089 average=8772.25
>> mostloaded=8773 leastloaded=8773
>> 2011-05-14 14:14:08,706 DEBUG
>> org.apache.hadoop.hbase.master.CatalogJanitor: Scanned 35085 catalog row(s)
>> and gc'd 0 unreferenced parent region(s)
>>
>> 35087 & 35085 , so where's the problem? Were they from the different sets?
>>
>> Thanks!
>>
>> Regards,
>> Jieshan Bean
>>
>>
>>
>>
>

Reply via email to