On Mon, Sep 6, 2010 at 11:34 PM, Tao Xie <xietao.mail...@gmail.com> wrote:

> But when I directly load data into HDFS using HDFS API, the disks are
> balanced.
> I use hadoop-0.20.2.
>
>
Yes, the bugs occur when processing a large volume of block deletions. See
HADOOP-5124 and HDFS-611. HBase's compactions cause a larger deletion rate
than typical HDFS usage.

-Todd


> 2010/9/7 Todd Lipcon <t...@cloudera.com>
>
> > On Mon, Sep 6, 2010 at 9:08 PM, Jonathan Gray <jg...@facebook.com>
> wrote:
> >
> > > You're looking at sizes on disk?  Then this has nothing to do with
> HBase
> > > load balancing.
> > >
> > > HBase does not move blocks around on the HDFS layer or deal with which
> > > physical disks are used, that is completely the responsibility of HDFS.
> > >
> > > Periodically HBase will perform major compactions on regions which
> causes
> > > data to be rewritten.  This creates new files so could change what is
> in
> > > HDFS.
> > >
> >
> > There are some bugs in HDFS in 0.20 which can create this out-of-balance
> > scenario.
> >
> > If you use CDH3b2 you should have a few patches which help to rectify the
> > situation, in particular HDFS-611.
> >
> > Thanks
> > -Todd
> >
> >
> > >
> > > JG
> > >
> > > > -----Original Message-----
> > > > From: Tao Xie [mailto:xietao.mail...@gmail.com]
> > > > Sent: Monday, September 06, 2010 8:38 PM
> > > > To: user@hbase.apache.org
> > > > Subject: Re: question about RegionManager
> > > >
> > > > Actually, I'm a newbie of HBase. I went to read the code of assigning
> > > > region
> > > > because I met a load imbalance problem in my hbase cluster. I run 1+6
> > > > nodes
> > > > hbase cluster, 1 node as master & client, the other nodes as region
> > > > server
> > > > and data nodes. I run YCSB to insert records. In the inserting time,
> I
> > > > find
> > > > the data written to data nodes have different data size on disks.  I
> > > > think
> > > > HDFS is doing well in balancing write. So is this problem due to
> HBase?
> > > >
> > > > Btw, after finished writing for minutes, the disks get balanced
> > > > finally. I
> > > > think maybe there is a LoadBalance like deamon thread working on
> this.
> > > > Can
> > > > anyone explain this? Many thanks.
> > > >
> > > > After inserting 160M 1k records, my six datanodes are greatly
> > > > imbalanced.
> > > >
> > > > 10.1.0.125: /dev/sdb1             280G   89G  178G  34%
> /mnt/DP_disk1
> > > >
> > > > 10.1.0.125: /dev/sdc1             280G   91G  176G  35%
> /mnt/DP_disk2
> > > >
> > > > 10.1.0.125: /dev/sdd1             280G   91G  176G  34%
> /mnt/DP_disk3
> > > >
> > > > 10.1.0.121: /dev/sdb1             280G   15G  251G   6%
> /mnt/DP_disk1
> > > >
> > > > 10.1.0.121: /dev/sdc1             280G   16G  250G   6%
> /mnt/DP_disk2
> > > >
> > > > 10.1.0.121: /dev/sdd1             280G   15G  251G   6%
> /mnt/DP_disk3
> > > >
> > > > 10.1.0.122: /dev/sdb1             280G   15G  251G   6%
> /mnt/DP_disk1
> > > >
> > > > 10.1.0.122: /dev/sdc1             280G   15G  252G   6%
> /mnt/DP_disk2
> > > >
> > > > 10.1.0.122: /dev/sdd1             280G   13G  253G   5%
> /mnt/DP_disk3
> > > >
> > > > 10.1.0.124: /dev/sdb1             280G   14G  253G   5%
> /mnt/DP_disk1
> > > >
> > > > 10.1.0.124: /dev/sdc1             280G   15G  252G   6%
> /mnt/DP_disk2
> > > >
> > > > 10.1.0.124: /dev/sdd1             280G   14G  253G   6%
> /mnt/DP_disk3
> > > >
> > > > 10.1.0.123: /dev/sdb1             280G   66G  200G  25%
> /mnt/DP_disk1
> > > >
> > > > 10.1.0.123: /dev/sdc1             280G   65G  201G  25%
> /mnt/DP_disk2
> > > >
> > > > 10.1.0.123: /dev/sdd1             280G   65G  202G  25%
> /mnt/DP_disk3
> > > >
> > > > 10.1.0.126: /dev/sdb1             280G   14G  252G   6%
> /mnt/DP_disk1
> > > >
> > > > 10.1.0.126: /dev/sdc1             280G   14G  252G   6%
> /mnt/DP_disk2
> > > >
> > > > 10.1.0.126: /dev/sdd1             280G   13G  253G   5%
> /mnt/DP_disk3
> > > >
> > > > 2010/9/7 Tao Xie <xietao.mail...@gmail.com>
> > > >
> > > > > I have a look at the following method in 0.89. Is the the following
> > > > line
> > > > > correct ?
> > > > >
> > > > > nRegions *= e.getValue().size();
> > > > >
> > > > >
> > > > > private int regionsToGiveOtherServers(final int
> numUnassignedRegions,
> > > > >     final HServerLoad thisServersLoad) {
> > > > >     SortedMap<HServerLoad, Set<String>> lightServers =
> > > > >       new TreeMap<HServerLoad, Set<String>>();
> > > > >     this.master.getLightServers(thisServersLoad, lightServers);
> > > > >     // Examine the list of servers that are more lightly loaded
> than
> > > > this
> > > > > one.
> > > > >     // Pretend that we will assign regions to these more lightly
> > > > loaded
> > > > > servers
> > > > >     // until they reach load equal with ours. Then, see how many
> > > > regions
> > > > > are left
> > > > >     // unassigned. That is how many regions we should assign to
> this
> > > > > server.
> > > > >     int nRegions = 0;
> > > > >     for (Map.Entry<HServerLoad, Set<String>> e:
> > > > lightServers.entrySet()) {
> > > > >       HServerLoad lightLoad = new HServerLoad(e.getKey());
> > > > >       do {
> > > > >         lightLoad.setNumberOfRegions(lightLoad.getNumberOfRegions()
> +
> > > > 1);
> > > > >         nRegions += 1;
> > > > >       } while (lightLoad.compareTo(thisServersLoad) <= 0
> > > > >           && nRegions < numUnassignedRegions);
> > > > >       nRegions *= e.getValue().size();
> > > > >       if (nRegions >= numUnassignedRegions) {
> > > > >         break;
> > > > >       }
> > > > >     }
> > > > >     return nRegions;
> > > > >   }
> > > > >
> > > > >
> > > > >
> > > > > 2010/9/7 Jonathan Gray <jg...@facebook.com>
> > > > >
> > > > > That code does actually exist in the latest 0.89 release.
> > > > >>
> > > > >> It was a protection put in place to guard against a weird behavior
> > > > that we
> > > > >> had seen during load balancing.
> > > > >>
> > > > >> As Ryan suggests, this code was in need of a rewrite and was just
> > > > >> committed last week to trunk/0.90.  If you're interested in the
> new
> > > > load
> > > > >> balancing code, it's in o.a.h.h.regionserver.LoadBalancer
> > > > >>
> > > > >> At the least, you should upgrade to 0.20.6 as there are some
> > > > important
> > > > >> fixes from 0.20.4 (until 0.90 is released, at which point everyone
> > > > should
> > > > >> move to it).
> > > > >>
> > > > >> JG
> > > > >>
> > > > >> > -----Original Message-----
> > > > >> > From: Ryan Rawson [mailto:ryano...@gmail.com]
> > > > >> > Sent: Monday, September 06, 2010 7:10 PM
> > > > >> > To: user@hbase.apache.org
> > > > >> > Subject: Re: question about RegionManager
> > > > >> >
> > > > >> > That code was completely rewritten in 0.89/0.90... its pretty
> > > > dodgy so
> > > > >> > I'd
> > > > >> > highly consider upgrading to 0.89 asap.
> > > > >> > > hi, all
> > > > >> > >
> > > > >> > > I'm reading the code of RegionManager, I find in the following
> > > > method
> > > > >> > there
> > > > >> > > is an situation when nRegionsToAssign <= nregions, the code
> only
> > > > >> > assigns 1
> > > > >> > > region.
> > > > >> > > Is this correct? Hbase version 0.20.4.
> > > > >> > >
> > > > >> > > private void assignRegionsToMultipleServers(final HServerLoad
> > > > >> > > thisServersLoad,
> > > > >> > > final Set<RegionState> regionsToAssign, final HServerInfo
> info,
> > > > >> > > final ArrayList<HMsg> returnMsgs) {
> > > > >> > > boolean isMetaAssign = false;
> > > > >> > > for (RegionState s : regionsToAssign) {
> > > > >> > > if (s.getRegionInfo().isMetaRegion())
> > > > >> > > isMetaAssign = true;
> > > > >> > > }
> > > > >> > > int nRegionsToAssign = regionsToAssign.size();
> > > > >> > > // Now many regions to assign this server.
> > > > >> > > int nregions = regionsPerServer(nRegionsToAssign,
> > > > thisServersLoad);
> > > > >> > > LOG.debug("Assigning for " + info + ": total nregions to
> > > > assign=" +
> > > > >> > > nRegionsToAssign + ", nregions to reach balance=" + nregions +
> > > > >> > > ", isMetaAssign=" + isMetaAssign);
> > > > >> > > if (nRegionsToAssign <= nregions) {
> > > > >> > > // I do not know whats supposed to happen in this case. Assign
> > > > one.
> > > > >> > > LOG.debug("Assigning one region only (playing it safe..)");
> > > > >> > > assignRegions(regionsToAssign, 1, info, returnMsgs);
> > > > >> > > } else {
> > > > >>
> > > > >
> > > > >
> > >
> >
> >
> >
> > --
> > Todd Lipcon
> > Software Engineer, Cloudera
> >
>



-- 
Todd Lipcon
Software Engineer, Cloudera

Reply via email to