HBase的FlushLargeStoresPolicy多例族支持

原创 2015年11月18日 11:40:29

众所周知,HBase的一个例族flush时,会导致所有例族都跟着被flush。在HBase-0.94的官方说明(http://hbase.apache.org/0.94/book/number.of.cfs.html)也明确HBase不能很好的支持一个以上的例族。

 

HBase-2.0.0HBase-1.1.0https://issues.apache.org/jira/browse/HBASE-10201)引入FlushLargeStoresPolicy来解决这个问题。

 

FlushLargeStoresPolicy的实现非常简单,就是在flush之前先判断下Store的大小,当超过指定大小时才flush注:实际上不仅仅受此决定,具体可查看HRegion类的shouldFlushStore()的实现)。

 

相关的类(之前只有FlushAllStoresPolicy一种flush策略,也就是flush一个例族时也会flush其它所有例族):

 

 

flush过程:

 

相关源代码:

public abstract class FlushPolicy {

    protected HRegion region;

    

    protected void configureForRegion(HRegion region) {

        this.region = region;

    }

    

    public abstract Collection<Store> selectStoresToFlush();

}

 

public class FlushLargeStoresPolicy extends FlushPolicy {

    private boolean shouldFlush(Store store) {

        if (store.getMemStoreSize() > this.flushSizeLowerBound) {

            return true;

        }

        

        // 请注意下面这句

        return region.shouldFlushStore(store);

    }

    

    public Collection<Store> selectStoresToFlush() {

        Collection<Store> stores = region.stores.values();

        Set<Store> specificStoresToFlush = new HashSet<Store>();

        for (Store store : stores) {

            if (shouldFlush(store)) {

                specificStoresToFlush.add(store);

            }

        }

        

        return specificStoresToFlush;

    }

}

 

public class FlushAllStoresPolicy extends FlushPolicy {

  public Collection<Store> selectStoresToFlush() {

    return region.stores.values();

  }

}

 

public class HRegion {

    boolean shouldFlushStore(Store store) {

        if ((maxFlushedSeqId > 0)

           && (maxFlushedSeqId + flushPerChanges < sequenceId.get())) {

            return true;

        }

        

        if (flushCheckInterval <= 0) {

            return false;

        }

        

        long now = EnvironmentEdgeManager.currentTime();

        if (store.timeOfOldestEdit() < now - flushCheckInterval) {

            return true;

        }

        

        return false;

    }

}

 

 

相关文章推荐

Spring In Action-3.2@Scope单例、多例Bean

  • 2017年09月06日 22:52
  • 13.59MB
  • 下载

怎么让一个单列类能够变成多例的类

我们知道一个单例类正常情况下只可以产生一个实例,为了能够达到将单例类转换成多例类(这里纯粹为了实现而实现没有必要) 我们可以让单例类实现Serializable接口,进行序列化 然后反序列化,在进...

单例模式和多例模式

  • 2014年04月04日 14:07
  • 30KB
  • 下载

单例多例模式

  • 2017年04月27日 09:55
  • 13KB
  • 下载

Spring(06)——单例注入多例之注入ApplicationContext

6 单例注入多例之注入ApplicationContextSpring bean容器中的bean有单例bean,也有多例bean。当我们需要给一个单例beanA注入一个单例beanB,或者给一个多例b...
  • elim168
  • elim168
  • 2017年07月10日 13:57
  • 2510

C#描述中的单例与多例模式

  • 2012年08月15日 19:51
  • 9KB
  • 下载

spring中创建bean对象时多例和单例的区别

Oracle(四)--> 高级子查询(多例详解难度高,实在不信进来看~)

这一节将讨论一下子查询更加复杂的应用,主要在于简化 SQL,从侧面提高性能,当然。。提高性能的地方有很多很多。。今天听了一场关于 Oracle 的性能调优的讲座,了解了 Oracle 性能、优化要注意...

Java单例和多例的性能

公用类ThreadUtils,用于父线程等待子线程运行结束。import java.util.List;public class ThreadUtils { // 注册runnable ...
  • xlxxcc
  • xlxxcc
  • 2016年08月25日 14:27
  • 1014
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HBase的FlushLargeStoresPolicy多例族支持
举报原因:
原因补充:

(最多只允许输入30个字)