zoukankan      html  css  js  c++  java
  • HBase flush

    flush触发方式

    1. Server端执行更新操作(put、delete、multi(MultiAction<R>multi)、(privatecheckAndMutate、mutateRow (byte[] regionName, RowMutations rm))执行前后触发内存检查

    • 操作执行前

    MemStoreFlusher .reclaimMemStoreMemory,如果regionserver使用memstore大于upper,则循环创建flush任务加入flushQueue,每次循环sleep5秒钟,这种检查是调用flushOneForGlobalPressure的flush

    • 操作执行前

    HRegion. checkResources(),如果当前region的memstore大于flushsize * multiplier,则循环调用requestFlush(),每次循环sleep(hbase.server.thread.wakefrequency),否则直接返回。

    • 执行操作HRegion的internal*
    • 执行操作后

    如果当前region达到flushsize,则触发requestFlush() 生成FlushRegionEntry包含当前region信息并加入flushQueue进行对指定region的flush。

     

    所有执行flush操作的过程都是通过MemStoreFlusher的flushRegion完成。

    HRegion.flushRegion过程

    1.    判断文件数是否达到block要求hbase.hstore.blockingStoreFiles

    如果达到的话,判断是否超过block时长hbase.hstore.blockingWaitTime

    如果已经超过,则执行HRegion.flushcache()

    如果没有超时

    并且是第一次进入queue,则检查是否执行split和compact。

    否则重新加入flushQueue延迟blockingWaitTime/100

    2.    执行

    HRegion.flushcache()->HRegion.internalFlushcache()

    执行完成后再检查一次是否需要split和compact

     

    HRegion.internalFlushcache过程

    1.    为Region下的每个store创建一个StoreFlusherImpl

    2.    为memstore生成snapshot,实际就是把集合赋值给flusher的内部集合,然后给memstore重新new一个集合。

    3.    Store. internalFlushCache,生成memstoreScanner将数据通过StoreFile.Writer写成HFile

    MemStoreFlusher周期性检查flushQueue,触发队列的region flush或者根据内存使用情况选择region来进行flush。

    如果queue为空并且server内存使用高于lower的限制,则调用flushOneForGlobalPressure flush一个region。

    flushOneForGlobalPressure

    首先找到如下2个region

    bestFlushableRegion:选择内存使用最大且文件数未达到compact block文件数限制的region,并且没有在flush队列中region。

    bestAnyRegion:选择内存使用最大,不管文件数是否达到compact block文件数限制的region,并且没有在flush队列中region。

    这俩中再二选一,策略如下

          if (bestFlushableRegion != null &&

    bestAnyRegion.memstoreSize.get() > 2 * bestFlushableRegion.memstoreSize.get()) {

            regionToFlush = bestAnyRegion;

          }else {

           if (bestFlushableRegion == null) {

              regionToFlush = bestAnyRegion;

            }else {

              regionToFlush = bestFlushableRegion;

            }

          }

    选择好region后进行flush完成后返回。如果失败的话则会选择其他region flush。

    如果queue不为空,则从queue中poll一个region flush。

    最后一种触发flush的方式是client端执行HBaseAdmin.flush(HRegionInfo regionInfo)

    这种方式会判断client端flush的表名还是region名

    如果是region,则调用HRegionServer的flushRegion(HRegionInfo regionInfo)

    如果是表名,则通过MetaReader获取此表的所有region,循环flush


  • 相关阅读:
    hdu4472-Count
    Codeforces Beta Round #55 (Div. 2)
    优化素数表
    Codeforces Beta Round #49 (Div. 2)-D. Physical Education
    Codeforces Beta Round #49 (Div. 2)-C. Little Frog
    一些不知道的函数
    kmp算法详解
    STL之accumulate用法小结
    STL——list学习笔记
    maven打war包包含源文件-eclipse
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205171.html
Copyright © 2011-2022 走看看