zoukankan      html  css  js  c++  java
  • 读写、合并

    写操作

    1.客户端提交业务请求,会先向ZK请求meta表所在的RegionServer(meta位于hbase命名空间的一张表,记录其他表所处的位置)

    2.ZK返回meta表所在RegionServer,客户端到指定位置请求,返回对应表的meta(并缓存下来,下次请求就不用再经过ZK了),获取对应的RegionServer(比如步骤1中要插入某个表一条数据)

    3.向对应的RegionServer发送业务请求,比如,put请求,此时会先写入wal,再写进内存(与源码有出入,其实原理是一样的,wal同步之后,才算写入成功),此时客户端的请求就执行完毕了,不用等flush进磁盘(StroeFile)

    • 内部机制:
      • 1.获取锁,这里用的是JUC的lock锁
      • 2.更新时间戳
      • 3.在内存中构建wal,此时并没有写到HDFS
      • 4.添加最后一次编辑到wal,但是不同步到HDFS
      • 5.将数据写入内存
      • 6.释放锁
      • 7.同步wal(到HDFS中)1-7有事务控制,此时有个doRollBackMemory=false,如果写入失败,会将内存的数据弹出

    关于flush的配置。

    <!--regionServer的全局memstore大小,超过该大小就触发flush到磁盘操作,默认是堆大小的40%,flush操作会阻塞客户端读写-->
    <property>
        <name>hbase.regionserver.global.memstore.size</name>
        <value></value>
    </property>
    
    <!--集群的写负载非常高,写入量通常情况都会超过flush的量,这时候读写操作会一直被阻塞,因此我们希望memstore不要超过一定的安全设置,默认堆大小*0.4*0.95,也就是一直阻塞到这个值为止-->
    <property>
        <name>hbase.regionserver.global.memstore.size.lower.limit</name>
        <value></value>
    </property>
    
    <!--内存中的文件在启动flush之前能够存活的最长时间,默认1h(最后一次编辑)-->
    <property>
        <name>hbase.regionserver.optionalcacheflushinterval</name>
        <value>3600000</value>
    </property>
    
    <!--单个region里memstore的缓存大小,超过就会flush,默认128M-->
    <property>
        <name>hbase.hregion.memstore.size</name>
        <value>134217728</value>
    </property>
    

    4.当WAL文件的数量超过hbase.regionserver.max.logs,region会按照时间顺序依次进行刷写,知道WAL文件数量减小到hbase.regionserver.max.log以下(该属性在新版本已经废弃,无需手动设置,最大值为32)

    5.hbase.regionserver.hlog.blocksize,hlog大小上限,达到该值则block,进行roll掉,默认配置为hdfs配置的block大小

    读操作

    1.直接在hbase中查看HFile的命令:

    $ bin/hbase org.apache.hadoop.hbase.io.hfile.HFile -a -b -e -k -p -f hdfs中的位置
    

    HBase读操作并不是先从内存中读,找不到再从磁盘中读,而是两者一起读,放进Block cache中比较时间戳,返回时间戳大的那个一记录

    2.读操作流程:
    -client先访问zk,获取hbase:meta表的位置
    -访问对应的RegionServer,获取meta表,根据读请求的namespace:table、rowkey,查询出目标数据位于哪个RegionServer中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache中,方便下次访问。
    -与目标Region Server通讯,分别在Block Cache(读缓存),MemStore和Store File(HFile)中查询目标数据,并将查询到的所有数据进行合并,此处所有数据是指同一条数据的不同版本(timestamp)或者不同的类型(put/Delete)
    -将从文件中查询到的数据块(Block,HFile数据存储单元,默认64kb)缓存到Block Cache
    -将最终结果返回客户端

    Compact合并

    分为minor compact和major compact
    1.相关配置

    <property>
        <name>hbase.hregion.majorcompaction</name>
        <value>604800000</value> #默认7天进行一次大合并,非常消耗资源,一般设置为0将其关闭,手动在空闲时间进行合并
    </property>
    <property>
        <name>hbase.hstore.compactionThreshold</name>
        <value>3</value> #在一个Store中,超过3个HStoreFile就会发生小合并
    </property>
    

    2.手动compact时,如果超过3个storehfile,此时的compact是大合并
    3.删除数据:
    -flush(当同一条数据的版本在同一个内存中是,会删除,如果在不同的内存中,即在磁盘里则不会删)
    -major compact

    这里有个特殊例子,当同一个rowkey多次flush时,最后一次在flush之前将其delete,delete标记不会在flush阶段被清掉,否则会出现诈尸现象。

    切分

    当一个region中的某个store下所有StoreFile的总大小超过Min(R^2*"hbase.hregion.memstore.flush.size",hbase.hregion.max.filesize"),该Region就会进行拆分,其中R为当前RegionServer中属于该Table的个数

  • 相关阅读:
    js中属性节点的应用
    改变属性的值的方法
    获取所有节点的一些方法的属性(有待改善)
    JS中修改属性
    获取节点的几种小案例
    在页面上点击按钮,出现弹出框
    SelectionSort,选择排序
    BubbleSort冒泡排序
    混合app
    使用(Unicode字符)让inline水平元素换行
  • 原文地址:https://www.cnblogs.com/zqzhen/p/12780469.html
Copyright © 2011-2022 走看看