我们知道,hbase表可以设置一个至多个列簇(column families),但是为什么说越少的列簇越好呢?

官网原文:

HBase currently does not do well with anything above two or three column families so keep the number of column families in your schema low. Currently, flushing and compactions are done on a per Region basis so if one column family is carrying the bulk of the data bringing on flushes, the adjacent families will also be flushed even though the amount of data they carry is small. When many column families exist the flushing and compaction interaction can make for a bunch of needless i/o (To be addressed by changing flushing and compaction to work on a per column family basis).

回顾下hbase表,每张表会切分为多个region,每个region也就是表的一部分子集数据,region会分散到hbase 集群regionserver上;

region中每个columnFamily的数据组成一个Store。每个Store由一个Memstore和多个HFile组成(一个列簇对应一个memstore和N个HFile);

在达到flush条件时候,每个memstore都会flush生成一个HFile文件;另外随着HFile文件的生成,后台minorCompact线程会触发合并HFile文件;

重点来了!flush和compact都是在region的基础上进行的!!!

比如在flush时候,如果有多个memstore(多个列簇),只要有一个memstore达到flush条件,其他的memstore即使数据很小也要跟着执行flush,这也就导致了很多不必要的I/O开销。触发flush的条件如下:

Memstore级别限制:当Region中任意一个MemStore的大小达到了上限(hbase.hregion.memstore.flush.size,默认128MB),会触发Memstore刷新。

Region级别限制:当Region中所有Memstore的大小总和达到了上限(hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size,默认 2* 128M = 256M),会触发memstore刷新。

Region Server级别限制:当一个Region Server中所有Memstore的大小总和达到了上限(hbase.regionserver.global.memstore.upperLimit * hbase_heapsize,默认 40%的JVM内存使用量),会触发部分Memstore刷新。Flush顺序是按照Memstore由大到小执行,先Flush Memstore最大的Region,再执行次大的,直至总体Memstore内存使用量低于阈值(hbase.regionserver.global.memstore.lowerLimit * hbase_heapsize,默认 38%的JVM内存使用量)。

当一个Region Server中HLog数量达到上限(可通过参数hbase.regionserver.maxlogs配置)时,系统会选取最早的一个 HLog对应的一个或多个Region进行flush

HBase定期刷新Memstore:默认周期为1小时,确保Memstore不会长时间没有持久化。为避免所有的MemStore在同一时间都进行flush导致的问题,定期的flush操作有20000左右的随机延时。

同样在compact时候,由于是建立在region的基础上,同样会产生不必要的I/O开销,触发compcat(minor_compact)条件:

hbase.hstore.compactionThreshold

Description

Ifmore than this number of HStoreFiles in any one HStore (one HStoreFile is written per flush of memstore) thena compaction is run to rewrite all HStoreFiles files as one.     Larger numbers put off compaction but when it runs, it takes longer to complete.

default3

Where multiple ColumnFamilies exist in a single table, be aware of the cardinality (i.e., number of rows). If ColumnFamilyA has 1 million rows and ColumnFamilyB has 1 billion rows, ColumnFamilyA’s data will likely be spread across many, many regions (and RegionServers). This makes mass scans for ColumnFamilyA less efficient.

另外,如果一个表中存在多个列族,请注意数据量(即,行数)。如果ColumnFamilyA有100万行,而ColumnFamilyB有10亿行,ColumnFamilyA的数据很可能分布在许多许多regions(和regionservers)。这使得ColumnFamilyA的大规模scan效率降低。(我们知道hbase split是由参数hbase.hregion.max.filesize值来控制的,但是,触发region split不是说该region下所有的HFile文件大小达到这个值就会触发split,而是region下某个HFile文件达到了这个值才会执行split,也就是说这里ColumnFamilyB在做split时候,ColumnFamilyA的数据量还很小很小,但是也会被带着执行split,这也就会导致更多的HDFS小文件,并且分散到更多的region和regionservers上)

hbase中列簇和列_为什么不建议在hbase中使用过多的列簇相关推荐

  1. Mysql要在表s中增加一列可用什么语句_要在基本表S中增加一列CN(课程名),可用语句()_学小易找答案...

    [填空题]在SQL中,要删除一个表,应使用的语句是( )TABLE. [单选题]精神检查的方法主要有( ) [单选题]护士从病人的书信.日记了解病人的情况是属于( ) [单选题]显示当前所有数据库的命 ...

  2. java中为按钮添加图片_我们可以在Java接口中为成员定义私有和受保护的修饰符吗?...

    java中为按钮添加图片 No, it is not possible to define private and protected modifiers for the members in int ...

  3. 心理学在生活中的表现和应用_心理学在我们日常生活中的应用

    心理学在我们日常生活中的应用 2015-12-09 14:55公开日志已被浏览4821次 心理学看起来很神秘,离我们很遥远,但实际上在我们生活中无处不在.比如"从众效应",&quo ...

  4. java数组是行优先还是列优先的语言_详解C语言数组中是以列优先吗

    如果我们按照C语言的方式存储它,也就是行优先存储的话,那么在内存中,它的形状是这样的: 这种存储方式又被称作C contiguous array. C语言数组结构列优先顺序存储的实现 (GCC编译). ...

  5. 实现文件中名词的统计计数_通过勤哲EXCEL和Excel中的rank函数实现排名统计

    如今,信息化已成为各行业企业转型和发展的关键所在,信息化技术最明显的特点是企业不同部门的人在信息技术的支撑下,可以利用丰富的资源与工具展开协作学习,在相对自由的模式和环境下,改变传统设计相对局限.固定 ...

  6. mysql 2003报错_为什么不建议在 MySQL 中使用 UTF-8?

    正文 记得去年我在往MySQL存入emoji表情 时,一直出错,无法导入.后来找到办法 -- 通过把 utf8 改成 utf8mb4 就可以了,并没有深究. 一年后,我看到一篇文章讲到emoji文字占 ...

  7. 表格中复制后出现空格_软件应用在Excel表格中怎样批量删除空格?

    在日常办公中对于Excel的使用有没有全部掌握呢?怎样快速整理表格中的数据呢?这些都是职场必备技能,了解更多的Excel知识可以让你在数据管理,表格管理中游刃有余.下面为大家分享一些经常使用的Exce ...

  8. cxgrid中纵横单元格合并_逆向查询合并单元格中的数据,这两种方法你值得拥有...

    ​有同事询问了一个问题,说下面的这种表格,我有部门和人员的清单列表,如果我想根据人员清单去查询其所在的部门要怎么实现呢? 因为部门列的数据内容是经过合并的,如果我们直接使用Vlookup进行查找,查找 ...

  9. python中encode是什么意思_【转 记录】python中的encode以及decode

    从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种. ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码.例如,数5678的存储形式为 ...

最新文章

  1. python画二维散点图-python3实现绘制二维点图
  2. 一个简单的Ajax开发框架
  3. mysql 存储地理信息_使用Amazon Aurora存储和处理地理信息数据
  4. STM32 进阶教程 12 - M4的硬件乘法器使用
  5. ---innerHTML---
  6. 【slighttpd】基于lighttpd架构的Server项目实战(4)—简单的echo服务器
  7. vue animation css实现左右折叠面板
  8. 实例63:python
  9. AXFR和IXFR区域传输及原理
  10. db2 兼容 oracle 语法,db2 case when和oracle兼容有关问题
  11. 监控硬盘脚本linux,shell脚本实现磁盘监控系统
  12. sklearn之KNN详解+GridSearchCV使用方法
  13. 科技爱好者周刊:第 78 期
  14. 中国互联网大人物直播简史
  15. APICloud AVM框架列表组件list-view的使用、flex布局教程
  16. Qt中undefined reference to报错的三种可能性和解决方法(以libgdal为例)
  17. 安卓android+rom定制,移植,安卓Android ROM定制移植教程。.doc
  18. USDT信用卡和转账入账接口
  19. 中国工程科学院计算机院士,重磅!中国科学院和中国工程院2019新院士名单公布!50所高校新晋院士77人...
  20. 编码实现字符串类CNString实现运算符重载

热门文章

  1. bootstrap 学习网址
  2. 数据库实验四 用户权限管理
  3. jQuery api学习笔记
  4. 如何在linux里面运行ncl,NCL基础讲解(二)——NCL安装与运行
  5. 手机内存卡转化linux,Android 往手机内存卡上存储用户名与密码的操作
  6. java前言_Java Web前言
  7. NanUI文档 - 如何实现C#与Javascript的相互通信
  8. 互评Beta版本(Hello World!——SkyHunter)
  9. shell 提示符个性化设置
  10. grafana授权公司内部邮箱登录 ldap配置