1.列族是什么?

HBASE表中的每个列,都归属于某个列族。列族是表的schema的一部 分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如 courses:history,courses:math都属于courses 这个列族。

2. 列族的设计

Hbase官网建议每张表的列族数建议设在1-3之间,所以说列族的设计并不是越多越好。

3.为什么不是越多越好

其实可以大致分为5个方面来理解。

3.1 对Flush的影响

回顾一下HBase,每张表会根据RowKey值被切分为多个region,每个region也就是表的一部分子集,region会分散到HBase集群regionserver上;region中每个columnFamily也就是列族的数据组成一个Store。每个Store由一个MemStore和多个HFile组成(一个列族对应一个memstore和N个HFile),如果我们的表有两个列族,那么相应的 Region 中存在两个 MemStore,列族越多,将会导致内存中存在越多的 MemStore;而储存在 MemStore 中的数据在满足一定条件的时候将会进行 Flush 操作;每次 Flush 的时候,每个 MemStore 将在磁盘生产一个 HFile 文件,如下:

比如在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由大到小执行,先FlushMemstore最大的Region,再执行次大的,直至总体Memstore内存使用量低于阈值(hbase.regionserver.global.memstore.lowerLimit* hbase_heapsize,默认 38%的JVM内存使用量)。

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

  • HBase定期刷新Memstore:默认周期为1小时,确保Memstore不会长时间没有持久化。为避免所有的MemStore在同一时间都进行flush导致的问题,定期的flush操作有20000左右的随机延时。
    从HBase 1.1开始,Flush已经不是整个Region进行了,而仅对部分Family进行的

3.2 对Split的影响

hbase split是由参数hbase.hregion.max.filesize值来控制的,但是,触发region split不是说该region下所有的HFile文件大小达到这个值就会触发split,而是region下某个HFile文件达到了这个值才会执行split,也就是说这里ColumnFamilyB在做split时候,ColumnFamilyA的数据量还很小很小,但是也会被带着执行split,这也就会导致更多的HDFS小文件,并且分散到更多的region和regionservers上,注意,Region Split 是针对所有的列族进行的,这样做的目的是同一行的数据即使在 Split 后也是存在同一个 Region 的。

3.3 对 Compaction 的影响

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

3.4 对 HDFS 的影响

dfs.namenode.fs-limits.max-directory-items是说HDFS的子目录下文件个数的限制,一个列族是对应到HDFS上的一个子目录的,不过相同表的数据是放一个目录的,如果我们有 N 个列族,M 个 Region,那么我们持久化到 HDFS 至少会产生 NM 个文件;而每个列族对应底层的 HFile 文件往往不止一个,我们假设为 K 个,那么最终表在 HDFS 目录下的文件数将是 NM*K,这可能会操作 HDFS 的限制。

3.5 对 RegionServer 内存的影响

一个列族在 RegionServer 中对应于一个 MemStore。而 HBase 从 0.90.1 版本开始引入了 MSLAB(Memstore-Local Allocation Buffers,参考HBASE-3455),这个功能默认是开启的(通过hbase.hregion.memstore.mslab.enabled),这使得每个 MemStore 在内存占用了 2MB (通过hbase.hregion.memstore.mslab.chunksize 配置)的 buffer。如果我们有很多的列族,那么光 MemStore 的缓存就会占用很多的内存。

4. 建议

在设置列族之前,我们最好想想,有没有必要将不同的列放到不同的列族里面。如果没有必要最好放一个列族。如果真要设置多个列族,但是其中一些列族相对于其他列族数据量相差非常悬殊,比如1000W相比100行,是不是考虑用另外一张表来存储相对小的列族。

HBase系列--列族设计及影响相关推荐

  1. 【HBase】列族属性详解

    HBase Table 的每个列族都可以设置 VERSION,TTL.BLOOMFLTER 等很多属性: create 'test:user', {NAME => 'b', VERSIONS = ...

  2. Hbase数据模型 列族

    转载于:https://www.cnblogs.com/fanweisheng/p/11188403.html

  3. HBase的列族式存储介绍

  4. hbase 使用lzo_带你快速上手HBase | HBase列族优化

    随着大数据的越来越普及,HBase也变得越来越流行.使用HBase并不困难,但是如何用好HBase,这确是一个难点.为了合理地使用HBase,尽可能发挥HBase的功能,我们需要根据不同的场景对HBa ...

  5. Hbase系列-3、Hbase高级

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 大数据系列文章目录 Hbase的官网 目录 HBase的高可用 Hbase高可用的简介 搭建H ...

  6. HBase基础: 表设计思路

    简介 通过几天的学习对HBase 在存储结构上和过滤器适用上也有了一点了解,同时也遇到很多问题?例如:查询方式,数据版本,查询时部分过滤器可能会导致数据不准确等这些问题如果不熟悉或与特殊业务场景结合很 ...

  7. HBase 列族数据库

    数据模型 我们可以将一个表想象成一个大的映射关系,通过行健.行健+时间戳或行键+列(列族:列修饰符),就可以定位特定数据,HBase是稀疏存储 数据的,因此某些列可以是空白的, Row Key Tim ...

  8. HbaseRowkey设计以及列族和列的关系

    Hbase上Regionserver的内存分为两个部分,一部分作为Memstore,主要用来写:另外一部分作为BlockCache,主要用于读数据:这里主要介绍写数据的部分,即Memstore.当Re ...

  9. hbase数据库介绍,HBASE的特点,表结构逻辑视图,Row Key,列族,时间戳,Cell

    HBASE数据库 1. Hbase基础 1.1 hbase数据库介绍 1.简介nosql hbase是bigtable的开源java版本.是建立在hdfs之上,提供高可靠性.高性能.列存储.可伸缩.实 ...

最新文章

  1. 2014 百度之星题解 1002 - Disk Schedule
  2. python简单项目-Python小项目:快速开发出一个简单的学生管理系统
  3. MIUI 9稳定版即将推送,米粉:升级小米6相机算法比升级系统重要
  4. 使用Spring配置LogBack日志记录
  5. std::string::assign 崩溃的问题
  6. Transformer10个重要问题
  7. 计算器c语言源代码全,C语言的计算器源代码
  8. java jdk官网下载地址
  9. 什么是bug?bug的分类
  10. 前端开发hr面试试题
  11. 7.sqli-labs-Less7
  12. Android—调用高德地图显示定位蓝点
  13. vue和java图片上传
  14. 从提示框:适用于Windows的iPad接口仿真,Easy Access iPhone手电筒和Kindle收藏管理...
  15. 【Python画樱花源码】
  16. 《漫游》之《云依柳俏》
  17. 南瑞服务器cpu型号怎么查看,国电南瑞NSR612RF-DA微机综保
  18. 手动升级11.2.0.3到12.2.0.1
  19. 解决ios浏览器视频无法播放问题
  20. Android上百实例源码分析以及开源分析集合打包

热门文章

  1. SDUT OJ 2978
  2. Linux NetworkManager 的使用方法(nmcli和nmtui)
  3. 【Qt开发笔记】Windows(VS2015或Mingw)环境编译Marble地图库
  4. python面向对象编程结题报告_中国大学 MOOC_Python语言程序设计_章节测验答案
  5. STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)
  6. 开发补充订单平台需要哪些步骤
  7. DRIVR_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 蓝屏分析
  8. Android N实现分屏
  9. 图像处理算法-高斯模糊
  10. R语言拟合ARIMA模型:使用forecast包中的auto.arima函数自动搜索最佳参数组合、模型阶数(p,d,q)、设置seasonal参数指定在模型中是否包含季节信息