- 浏览: 37437 次
- 来自: 杭州
最新评论
文章列表
HBase通过租约来控制每个scanner的操作时间。
1. 租约线程初始化:
HRegionServer的run方法会调用一次preRegistrationInitialization方法,再调用initializeThreads时,会new lease
this.leases = new Leases((int) conf.getLong(
HConstants.HBASE_REGIONSERVER_LEASE_PERIOD_KEY,
HConstants.DEFAULT_HBASE_REGIONSERVER_LEASE_PERIOD),
...
HFile和Hlog是HBase中两大文件存在格式,HFile用于存储数据,Hlog用于保证数据写入HFile中。
两者都有自己的cleaner逻辑。HFileCleaner和LogCleaner都是继承CleanerChore类
public class HFileCleaner extends CleanerChore<BaseHFileCleanerDelegate>
public class LogCleaner extends CleanerChore<BaseLogCleanerDelegate>
需要说明的是LogCleaner 除了默认的org.apac ...
在分享replication时,有同事提出replication延时怎么样,(基于0.94.3)
本文主要代码分析一下Hlog生成及对relication的影响。具体replication请参考
http://brianf.iteye.com/blog/1776936
首先分析hlog什么时候产生:
在生成HLog对象时,会调用HLog的rollWriter(),此时由于this.writer为null,所以通过rollWriter方法会创建第一个hlog文件,之后会调用replicaton相关的参见http://brianf.iteye.com/blog/1776936
// r ...
1. Cache 读写
调用逻辑:
hmaster.handleCreateTable->HRegion.createHRegion-> HRegion. initialize->initializeRegionInternals->instantiateHStore
->Store.Store->new CacheConfig(conf, family)-> CacheConfig.instantiateBlockCache->new LruBlockCache
传入参数
/**
* Configurable constructor ...
随着HBase的大规模应用,HBase的容灾显得特别的重要。
本文主要从代码层面分析HBase replication (基于HBase0.94.3)
分为正常replication处理逻辑和RS Fail两块。
1.正常replication处理逻辑
首先是HLog的rollwrite方法,调用prelogRoll, 在ZK上加上新的Hlog
再调用postlogRoll,调用Replication的postLogRoll
/**
* Gateway to Replication. Used by {@link org.apache.hadoop.hbase.regio ...
为什么HBase没有大集群?
因为如果一个HBase集群很大,有很多应用在上面,这些应用的应用场景可能不同,如有些是读,有些写,有些写的多,有些读的多,有些很重要,有些不重要,如果不加以区分,那么这个集群就无法运行下去。
如何做?
对多租户(Multi-tenancy)的这种情况,对资源进行隔离显得尤为重要,比如可以用虚拟的group来代表若干台RS,将这个虚拟的Group给某个应用,不同的group之间互不影响 ,比如各自有不同的Memstore大小,不同的参数。
待续···
HBase MVCC(Multi Version Consistencey Control)
mvcc多版本并发控制,是相对锁来说对并发处理的一种方法,
在HBase中,当writernumber > reade number
表明这个memstore在写,如此时读需要等待。
1. MVCC初始化
在HRegion 的initializeRegionInternals方法中,初始化
Return the largest memstoreTS found across all storefiles in the given list. Store files that were c ...
如果一个文件正在写,那么NN不会执行Replication,因为此时file处于under_construction。
但是如果HDFS 在做某个block的Replication时会读这个block,且正读了一半block,有client过来append这个文件会怎么样???
什么时候split?
当某store所有文件总大小大于某个值时split,注意,并不是判断某个storefile大小大于某个值。
什么时候compact?
检查整个region内所有store中任一个store 的总storefile是不是太多了(大于hbase.hstore.blockingStoreFiles(7)),太多了则会先进行compact。
flush会遍历这个region的所有store,并一个个执行。
compact遍历这个region找到符合条件的store进行compact.
1. 在flush之后会判断是否需要split和compact
这里的split有一个判断条 ...
HBase rpc 0.94中
例如在client put数据时,会调用htable的flushCommits,再调HConnectionImplementationr的processBatch,再调processBatchCallback
中,在这里异步调用线程,并使用future取得结果,最终执行的是call方法。
// step 2: make the requests
Map<HRegionLocation, Future<MultiResponse>> futures =
new HashMap ...
我们都知道compact分为两类,一类叫Minor compact ,一类叫Major compact,
两者有什么区别呢?
两者的区别在于:Minor compact只是进行文件merge操作,而Major compact除了做文件Merge操作,还会将其中的delete项删除。
引用There are two types of compactions: minor and major. Minor compactions will usually pick up a couple of the smaller adjacent StoreFiles and rewrite them as o ...
zookeeper中,任何节点的写都会影响到整体的读。
这个怎么理解呢,任何一个节点的更改,都会block各个follow的queue,只有此次两阶级提交完成之后,follow收到leader的commit后,这台机器上的后继的操作才能进行。
情景假设
leader:A
follow: B,C
client向及提交一个更改请求,后面两阶段提交(leader发propose, 等待follow ack,leader收到ACK后,向所有follow发送commit),
在两阶段提交中,C接到A的propose,然后放入队列后,这时假设client向C发出读请求,这时C会将读请求放入队列,要等到前面 ...
在HBase上传时,会通过配置参数hbase.client.keyvalue.maxsize来检查是否符合要求,如果没有设置此值,那么HBase不会限制大小 ,如果是这样,可以会在compact时候一次加载导致OOM。
可能的解决办法是设置一个合适的值给hbase.client.keyvalue.maxsize。
1. Put及flush
a. Client提交put,若设置autoflush=false,则直接提交到regionserver,若为true,则等到2M或者执行hbase.flushcommits()提交给rs.
b. Put到Regionserver层次,先判断则这台regionserver的 所有memstore的总占用内存是否大于最 ...