我们知道,一张 HBase 表包含一个或多个列族。HBase 的官方文档中关于 HBase 表的列族的个数有两处描述:A typical schema has between 1 and 3 column families per table. HBase tables should not be designed to mimic RDBMS tables. 以及 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.

上面两句话其实都是说一件事,HBase 中每张表的列族个数建议设在1~3之间。其实,HBase 支持的列族个数并没有限制,但为什么文档建议在1~3之间呢?我将从几个方面来阐述这么做的原因。

列族数对 Flush 的影响

在 HBase 中,调用 API 往对应的表插入数据是会写到 MemStore 的,而 MemStore 是一种内存结构,每个列族对应一个 MemStore(和零个或多个 HFile)。如果我们的表有两个列族,那么相应的 Region 中存在两个 MemStore,如下图:

如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

从上图可以看出,越多的列族,将会导致内存中存在越多的 MemStore;而储存在 MemStore 中的数据在满足一定条件的时候将会进行 Flush 操作;每次 Flush 的时候,每个 MemStore 将在磁盘生产一个 HFile 文件,如下:

如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

这样会导致越多的列族最终持久化到磁盘的 HFile 越多。更要命的是,当前 Flush 操作是 Region 级别的,也就是说, Region 中某个 MemStore 被 Flush,同一个 Region 的其他 MemStore 也会进行 Flush 操作。当表有很多列族,而且列族之间数据不均匀,比如一个列族有100W行,一个列族只有10行,这样会导致持久化到磁盘的文件数很多,同时有很多小文件,而且每次 Flush 操作也涉及到一定的 IO 操作。

列族数对 Split 的影响

我们知道,当 HBase 表中某个 Region 过大(比如大于 hbase.hregion.max.filesize 配置的大小。当然,Region 分裂并不是说整个 Region 大小加起来大于 hbase.hregion.max.filesize 就拆分,而是说 Region 中某个最大的 Store/HFile/storeFile 大于 hbase.hregion.max.filesize 才会触发 Region 拆分的),会被拆分成两个。如果我们有很多个列族,而这些列族之间的数据量相差悬殊,比如有些列族有 100W 行,而有些列族只有10行,这样在 Region Split 的时候会导致原本数据量很小的 HFile 文件进一步被拆分,从而产生更多的小文件。注意,Region Split 是针对所有的列族进行的,这样做的目的是同一行的数据即使在 Split 后也是存在同一个 Region 的。

列族数对 Compaction 的影响

与 Flush 操作一样,目前 HBase 的 Compaction 操作也是 Region 级别的,过多的列族也会产生不必要的 IO。

列族数对 HDFS 的影响

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

列族数对 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 的缓存就会占用很多的内存。

关于列族数设置的建议

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

猜你喜欢

欢迎关注本公众号:iteblog_hadoop:

回复 spark_summit_201806 下载 Spark Summit North America 201806 全部PPT

回复 spark_summit_eu_2018 下载 Spark+AI Summit europe 2018 全部PPT

回复 HBase_book 下载 2018HBase技术总结 专刊

0、回复 电子书 获取 本站所有可下载的电子书

1、Apache Spark 统一内存管理模型详解

2、Elasticsearch 6.3 发布,你们要的 SQL 功能来了

3、即将发布的 Apache Spark 2.4 都有哪些新功能

4、干货 | 深入理解 Spark Structured Streaming

5、Apache Spark 黑名单(Blacklist)机制介绍

6、Kafka分区分配策略(Partition Assignment Strategy)

7、Spark SQL 你需要知道的十件事

8、干货 | Apache Spark 2.0 作业优化技巧

9、[干货]大规模数据处理的演变(2003-2017)

10、Flink Forward 201809PPT资料下载

11、更多大数据文章欢迎访问https://www.iteblog.com及本公众号(iteblog_hadoop)12、Flink中文文档:http://flink.iteblog.com13、Carbondata 中文文档:http://carbondata.iteblog.com

hbase占用内存过高_为什么不建议在 HBase 中使用过多的列族相关推荐

  1. hbase占用内存过高_内存占用率过高怎么办?Win10电脑内存占用率很高原因和解决方法...

    内存占用率过高,是电脑十分常见的电脑故障,出现的现象就是什么软件还没有打开,内存占用了70%以上,甚至是99%,出现电脑明显卡顿的问题.不过想要解决内存占用率高不是简单的事情,因为可能性比较多,可能是 ...

  2. svchost占用内存过高_是什么导致你的Java服务器内存和CPU占用过高呢

    一.内存占用过高 1.造成服务器内存占用过高只有两种情况:内存溢出或内存泄漏 (1)内存溢出:程序分配的内存超出物理内存的大小,导致无法继续分配物理内存,出现OOM报错. (2)内存泄漏:不再调用的对 ...

  3. svchost占用内存过高_「电脑常用技巧」电脑卡的原因(占用过高怎么办)?

    大部分人在使用电脑时候,对于卡的定义都没什么概念.因为所谓的电脑卡实际上是有很多种原因导致的 关于常见的数据占用过高导致电脑卡顿的原因和解决技巧. 检测电脑数据使用的管理器(任务管理器)打开方式:ct ...

  4. 电脑一开机内存(共8G)就用了70%以上,任务管理器里面查看没有占用内存很高的进程

    我的解决方法: 1. 安装360驱动大师 2. 点击全面诊断 3. 驱动更新 4. 360优化加速-->启动项管理-->禁止不必要的启动项. 我执行了以上3项之后,笔记本的内存占用变小了. ...

  5. Java进程占用内存过高,排查解决方法

    Java进程占用内存过高,排查解决方法 参考文章: (1)Java进程占用内存过高,排查解决方法 (2)https://www.cnblogs.com/eeexu123/p/10913389.html ...

  6. java内存问题怎么排查,java占内存高排查 java应用占用内存过高排查的解决方案...

    想了解java应用占用内存过高排查的解决方案的相关内容吗,zhaixing_0307在本文为您仔细讲解java占内存高排查的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:java,占内存过 ...

  7. antimalware service executable占用内存过高_SQLServer占用服务器内存过高,更改这个设置就能降低内存使用率

    前两天我的服务器突然告警提示我的内存占用过高,使用率高达94.3%.当时我就有点纳闷了,服务器配置 互联网服务器 是4核8G的,只装了4个应用程序,其中就有SQL SERVER2012,而且使用频率也 ...

  8. 桌面内存管理器(dwn.exe)占用内存过高时怎么办?

    桌面内存管理器(dwn.exe)占用内存过高,可以解决的办法多种多样. 桌面内存管理器(dwn.exe)占用内存过高主要是因为存在DWM内存泄漏, 也正是因为这样,DWN内存泄露,不会自动回收内存,导 ...

  9. 笔记本桌面窗口管理器占用内存过高怎么办?

    桌面窗口管理器占用内存过高怎么办?很多小伙伴们在使用电脑时,明明没有打开多少程序,却莫名奇妙出现内存占用过高的情况,这样十分影响电脑的使用,还可能对cpu造成损害,但是小伙伴们也不知道如何解决,那么今 ...

  10. win11占用内存太高怎么解决?

    win11占用内存太高怎么办?win11系统对于系统的占用量会更大.很多的用户安装了这个系统之后都有遇到内存被大量占用的情况.那么我们如何通过系统内部优化的方法来解决这个问题呢?今天我们一起来看看解决 ...

最新文章

  1. java .classpath配置_轻松玩转Java配置的Classpath
  2. XMPP键盘订制实现图文混排
  3. php与java的关系_PHP基本语法以及和Java的区别
  4. 【模块化开发】之 Webpack、Rollup、Parcel
  5. html和css动画效果,css过渡和css动画的区别是什么?
  6. ping 中的“TTL是什么意思
  7. ambari mysql 密码_Ambari 切换 mysql 数据库
  8. (4)Jquery1.8.3快速入门_基本选择器
  9. Github删除一个无用库
  10. WPF+prism框架实战源码和展示
  11. 南京大学计算机考研资料汇总
  12. Linux应用开发-GPS电子围栏设计
  13. java制作主页,JSP教程基础篇之简单首页制作
  14. 双目立体相机的基线如何求?
  15. cad角度怎么画_女孩都喜欢的公主抱怎么画?各种不同角度公主抱漫画素材绘画教程...
  16. amd625和mx250比较_笔记本电脑中的1050ti与mx250哪个显卡的性能比较好一些?
  17. 2022/7/14小记
  18. Canceling statement due to conflict with reco
  19. 神州优车拟41亿元收购宝沃汽车67%股权
  20. 苹果和谷歌应用商店的APP搜索排名算法

热门文章

  1. 2009年十大Java技术解决方案
  2. 关于Web2.0概念解释
  3. Yii集成PHPWord
  4. JavaScript——exec和match
  5. VIm中Python自动补全插件Pydiction
  6. 微信小程序之 ----组件
  7. Protocol(协议)(二十)
  8. 20200716每日一句
  9. 【Python】SyntaxError: Non-ASCII character '\xe8' in file
  10. Atitit 定时器timer 总结 目录 1. 定时器 循环定时器 和timeout超时定时器 1 2. Spring定时器 1 2.1. 大概流程 1 2.2. 核心源码springboot 1