一. Hbase读流程

  1. META表记录着表的原信息,根据rowkey查询META表,获取所在region信息
  2. 客户端去相应的regionServer查询数据,先查询memStore(memstore是一个按key排序的树形结构缓冲区),有就返回,没有继续查找
  3. 查询regionServer的读缓存BlockCache是否存在rowkey的对应数据,有就返回,没有就继续查询。每次get一次时,hbase把相邻的一段数据也放到内存中缓存起来,方便顺序读
  4. 查询HFile中是否有相应记录
    (1)hfile的block索引会放在内存中,block是一段氛围内的键值对,通过rowkey找到block
    (2)下载hfile查找记录

二. 写流程

  1. client向region server提交写请求
  2. region server找到目标region
  3. region检查数据是否与schema一致
  4. 如果客户端没有指定版本,则获取当前系统时间作为数据版本
  5. 将更新写入WAL log (hlog)
  6. 将更新写入Memstore
  7. 判断Memstore的是否需要flush为Store文件。

    每 一个put的操作实际上是RPC的操作,它将客户端的数据传送到服务器然后返回,这只适合小数据量的操作,如果有个应用程序需要每秒存储上千行数据到 HBase表中,这样处理就不太合适了。HBase的API配备了一个客户端的写缓冲区,缓冲区负责收集put操作,然后调用RPC操作一次性将put送 往服务器。默认情况下,客户端缓冲区是禁止的。可以通过自动刷写设置为FALSE来激活缓冲区。 table.setAutoFlush(false);void flushCommits () throws IOException这个方法是强制 将数据写到服务器。用户还可以根据下面的方法来配置客户端写缓冲区的大小。 void setWritaeBufferSize(long writeBufferSize) throws IOException;默认大小是 2MB,这个也是适中的,一般用户插入的数据不大,不过如果你插入的数据大的话,可能要考虑增大这个值。从而允许客户端更高效地一定数量的数据组成一组通 过一次RPC请求来执行。给每个用户的HTable设置一个写缓冲区也是一件麻烦的事,为了避免麻烦,用户可以在

三.Hbase优化

  1. 行健设计
    (1)使用复合行健 (使用更多的条件查询) eg: 上述问题采用( 手机号倒置 : 时间戳倒置 )
    (2)行健要尽量离散而不是连续 , 使得连续插入的记录分散到多个HregionServer中 , 查询时达到并发查
    (3)尽量保证行健的数据长度短 , 减少Hfile加载到内存的内存空间

    表存储数据,按照行健存储,划分region时,也是按照region划分
    热点问题 : hbase的查询插入集中在某几个region中,不能分散.
    (时间戳 手机号) 存储
    eg: 不能用时间戳作为行健, 时间戳单调递增, 添加数据时会全部写在一个region, 降低并发查询添加效率
    可以把手机号倒置作为行健, 因为手机号末尾数字1-9等概率,可以做到分散存储

  2. 布隆过滤器
    (用一个数组,数组的每个元素的值是0或1,表示该位置是否存在数据, 数组角标是被判断集合元素值的hash值与数组长度取模)
    用极小的空间判断一个元素不在一个集合中
    (1)极小空间 : 一个位数组
    (2)判断不在一个集合 : 这个位数组, 元素值只是0/1表示该位是否有元素; 元素哈希值对维数组长度取模
    (3)把位数组模位置上的元素置1 . 当查询时发现该位置为0说明元素不在集合中 . 这种过滤器不能100%确定元素的存在, 但是能发现元素不在集合中

    【注】:客户端查数据,先查到数据属于哪个region,根据region找到hfile ,结合block的索引和hfile在磁盘中找到block块, 再根据行健,列祖,列标识符找到block中的kv键值对. hbase把查到的数据缓存在内存中. 使用bloom过滤器. 在查找结果缓存阶段,可以快速判断要查找的键值对是否已经在内存中
    可以设置对每个行健设置bloom过滤器. 也可以对每个列设置bloom过滤器

  3. 列族的块
    (1)HFile读取数据的最小单位是block , 这个block默认大小是64k , 查找某一个值时 , 要遍历这个块中的所有
    (2)如果存在大量随机读 , block块小一点好
    (3)如果存在大量顺序读 , block块大一点好

  4. 设置autoFlush=false

hbase读写流程的更多相关文章

  1. hbase读写流程分析

    前言 最近被大佬问到一个问题,hbase查询数据在最坏的场景下需要进行几次rpc,当时就懵了..下面主要对client端代码进行分析.阅读文章和看源码更配~ 读数据 流程总览 1. 从zookeepe ...

  2. Hbase读写流程和寻址机制

    写操作流程 (1) Client通过Zookeeper的调度,向RegionServer发出写数据请求,在Region中写数据. (2) 数据被写入Region的MemStore,直到MemStore ...

  3. Hbase的读写流程

    HBase读写流程 1.HBase读数据流程 HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先去访问zookeeper,从zookeeper里面获取meta表所在 ...

  4. HBase二级索引、读写流程

    HBase二级索引.读写流程 一.HBse二级索引方案 1.1 基于Coprocessor方案 1.2 Phoenix二级索引特点 1.3 Phoenix 二级索引方案 二.HBase读写流程 2.1 ...

  5. HBase 数据读写流程

    HBase 数据读写流程 2016-10-18 杜亦舒 读数据 HBase的表是按行拆分为一个个 region 块儿,这些块儿被放置在各个 regionserver 中 假设现在想在用户表中获取 ro ...

  6. Hbase架构和读写流程

    转载自:http://www.cnblogs.com/muzili-ykt/p/muzili_ykt.html 在HBase读写时,相同Cell(RowKey/ColumnFamily/Column相 ...

  7. 【从零单排HBase 03】深入HBase读写

    在了解HBase架构的基础上,我们需要进一步学习HBase的读写过程,一方面是了解各个组件在整个读写过程中充当的角色,另一方面只有了解HBase的真实请求过程,才能为后续的正确使用打下初步基础,毕竟, ...

  8. HDFS文件读写流程

    一.HDFS HDFS全称是Hadoop Distributed System.HDFS是为以流的方式存取大文件而设计的.适用于几百MB,GB以及TB,并写一次读多次的场合.而对于低延时数据访问.大量 ...

  9. 【转】linux IO子系统和文件系统读写流程

    原文地址:linux IO子系统和文件系统读写流程 我们含有分析的,是基于2.6.32及其后的内核. 我们在linux上总是要保存数据,数据要么保存在文件系统里(如ext3),要么就保存在裸设备里.我 ...

随机推荐

  1. HTMO DOM部分---小练习;列表之间移动、日期选择、好友选中、滑动效果、滚动条效果、飞入飞出效果。

    一:列表之间数据移动 第一个列表里面有内容,第二个里面没有 实现功能: 点击左侧列表选中一项内容,点击按钮,复制到右侧 点击复制所有按钮,将左侧列表所有数据,复制到右侧 扩展功能:右侧列表实现去重复 ...

  2. java基础之:详解内部类(转载)

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  3. spring源码学习【准备】之jdk动态代理和cglib动态代理的区别和性能

    一:区别:---->JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了.--->JDK的动态代理机制只能代理实现了接口的类,而不能 ...

  4. Machine Learning and Data Science 教授大师

    http://www.cs.cmu.edu/~avrim/courses.html Foundations of Data Science Avrim Blum, www.cs.cornell.edu ...

  5. note: declarations in dependent base ‘std::basic_ios<char>’ are not found by unqualified lookup

    错误信息如题所示. 修改前: template< typename _CharT, typename _Traits = std::char_traits<_CharT> > ...

  6. 了解oracle数据库的情况

    1.了解你的数据库版本号 2.是否配置了DataGuard? SQL> select protection_mode, protection_level, remote_archive,data ...

  7. rac ASM下最简单归档开启方法

    原创作品,出自 "深蓝的blog" 博客,深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/47172639本次先 ...

  8. [机器学习之13]降维技术——主成分分析PCA

    始终贯彻数据分析的一个大问题就是对数据和结果的展示,我们都知道在低维度下数据处理比较方便,因而数据进行简化成为了一个重要的技术.对数据进行简化的原因: 1.使得数据集更易用使用.2.降低很多算法的计算 ...

  9. easyUI之Form(表单)组件

    一.对于在easyui中使用的组件,具有输入.输出功能的使用<input>标签,其它的使用<div>标签. 二.对于<input>标签,在使用过程,将name属性和 ...

  10. Open vSwitch

    https://github.com/openvswitch/ovs/blob/master/INSTALL.RHEL.md