Hbase

  1. Hbase是怎么写数据的?

  2. HDFS和HBase各自使用场景

  3. Hbase的存储结构

  4. 热点现象(数据倾斜)怎么产生的,以及解决方法有哪些

  5. HBase的 rowkey 设计原则

  6. HBase的列簇设计

  7. HBase 中 compact 用途是什么,什么时候触发,分为哪两种,有什么区别

1. Hbase是怎么写数据的?

Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 触发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后(默认10G),触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer 上,使得原先1个Region的压力得以分流到2个Region上

由此过程可知,HBase只是增加数据,没有更新和删除操作,用户的更新和删除都是逻辑层面的,在物理层面,更新只是追加操作,删除只是标记操作。

用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。

2. HDFS和HBase各自使用场景

首先一点需要明白:Hbase是基于HDFS来存储的。

HDFS

  • 一次性写入,多次读取。

  • 保证数据的一致性。

  • 主要是可以部署在许多廉价机器中,通过多副本提高可靠性,提供了容错和恢复机制。

HBase

  • 瞬间写入量很大,数据库不好支撑或需要很高成本支撑的场景。

  • 数据需要长久保存,且量会持久增长到比较大的场景。

  • HBase不适用与有 join,多级索引,表关系复杂的数据模型。

  • 大数据量(100s TB级数据)且有快速随机访问的需求。如:淘宝的交易历史记录。数据量巨大无容置疑,面向普通用户的请求必然要即时响应。

  • 业务场景简单,不需要关系数据库中很多特性(例如交叉列、交叉表,事务,连接等等)。

3. Hbase的存储结构

Hbase 中的每张表都通过行键(rowkey)按照一定的范围被分割成多个子表(HRegion),默认一个HRegion 超过256M 就要被分割成两个,由HRegionServer管理,管理哪些 HRegion 由 Hmaster 分配。HRegion 存取一个子表时,会创建一个 HRegion 对象,然后对表的每个列族(Column Family)创建一个 store 实例, 每个 store 都会有 0 个或多个 StoreFile 与之对应,每个 StoreFile 都会对应一个HFile,HFile 就是实际的存储文件,一个 HRegion 还拥有一个 MemStore实例。

4. 热点现象(数据倾斜)怎么产生的,以及解决方法有哪些

热点现象

某个小的时段内,对HBase的读写请求集中到极少数的Region上,导致这些region所在的RegionServer处理请求量骤增,负载量明显偏大,而其他的RgionServer明显空闲。

热点现象出现的原因

HBase中的行是按照rowkey的字典顺序排序的,这种设计优化了scan操作,可以将相关的行以及会被一起读取的行存取在临近位置,便于scan。然而糟糕的rowkey设计是热点的源头。

热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响同一个RegionServer上的其他region,由于主机无法服务其他region的请求。

热点现象解决办法

为了避免写热点,设计rowkey使得不同行在同一个region,但是在更多数据情况下,数据应该被写入集群的多个region,而不是一个。常见的方法有以下这些:

  • 加盐:在rowkey的前面增加随机数,使得它和之前的rowkey的开头不同。分配的前缀种类数量应该和你想使用数据分散到不同的region的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。

  • 哈希:哈希可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据

  • 反转:第三种防止热点的方法时反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。反转rowkey的例子以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,这样的就避免了以手机号那样比较固定开头导致热点问题

  • 时间戳反转:一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用 Long.Max_Value - timestamp 追加到key的末尾,例如[key][reverse_timestamp],[key]的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据。
    比如需要保存一个用户的操作记录,按照操作时间倒序排序,在设计rowkey的时候,可以这样设计[userId反转] [Long.Max_Value - timestamp],在查询用户的所有操作记录数据的时候,直接指定反转后的userId,startRow是[userId反转][000000000000],stopRow是[userId反转][Long.Max_Value - timestamp]
    如果需要查询某段时间的操作记录,startRow是[user反转][Long.Max_Value - 起始时间],stopRow是[userId反转][Long.Max_Value - 结束时间]

  • HBase建表预分区:创建HBase表时,就预先根据可能的RowKey划分出多个region而不是默认的一个,从而可以将后续的读写操作负载均衡到不同的region上,避免热点现象。

5. HBase的 rowkey 设计原则

  • 长度原则:100字节以内,8的倍数最好,可能的情况下越短越好。因为HFile是按照 keyvalue 存储的,过长的rowkey会影响存储效率;其次,过长的rowkey在memstore中较大,影响缓冲效果,降低检索效率。最后,操作系统大多为64位,8的倍数,充分利用操作系统的最佳性能。

  • 散列原则:高位散列,低位时间字段。避免热点问题。

  • 唯一原则:分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问 的数据放到一块。

6. HBase的列簇设计

  • 原则:在合理范围内能尽量少的减少列簇就尽量减少列簇,因为列簇是共享region的,每个列簇数据相差太大导致查询效率低下。

  • 最优:将所有相关性很强的 key-value 都放在同一个列簇下,这样既能做到查询效率最高,也能保持尽可能少的访问不同的磁盘文件。以用户信息为例,可以将必须的基本信息存放在一个列族,而一些附加的额外信息可以放在另一列族。

7. HBase 中 compact 用途是什么,什么时候触发,分为哪两种,有什么区别

在 hbase 中每当有 memstore 数据 flush 到磁盘之后,就形成一个 storefile,当 storeFile的数量达到一定程度后,就需要将 storefile 文件来进行 compaction 操作。

Compact 的作用:

  • 合并文件

  • 清除过期,多余版本的数据

  • 提高读写数据的效率

HBase 中实现了两种 compaction 的方式:minor and major. 这两种 compaction 方式的区别是:

  • Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过期版本清理,不做任何删除数据、多版本数据的清理工作。

  • Major 操作是对 Region 下的 HStore 下的所有 StoreFile 执行合并操作,最终的结果是整理合并出一个文件。

列一些Hbase面试题相关推荐

  1. HBASE面试题,希望能够帮助到你

    1.HBase是什么? 答:hbase是开源的非关系型分布式数据库,拥有高可靠性.高性能.面向列.可伸缩的分布式存储系统 2.HBase存储结构? 答: 3.HBase中rowkey设计原则? 答:( ...

  2. 大数据学习之Hbase面试题

    1,hbase读流程 首先通过meta表找到要读数据的region所在的RegionServer,然后去BlockCash中读取,如果没有就去Memstore中读取,如果也没有,那就去Hfile中去读 ...

  3. Hbase面试题(持续更新)

    1.每天百亿数据存入HBase,如何保证数据的存储正确和在规定的时间里全部录入完毕,不残留数据 1)百亿数据:证明数据量非常大 2)存入HBase:证明是跟HBase的写入数据有关 3)保证数据的正确 ...

  4. 【大数据HBase系列】 HBase面试题整理

    文章目录 HBase面试题整理(一) 1. HBase的特点是什么? 2.HBase和Hive的区别? 3.HBase适用于怎样的情景? 4.描述HBase的rowKey的设计原则?(☆☆☆☆☆) 5 ...

  5. 一些开源搜索引擎实现——倒排使用原始文件,列存储Hbase,KV store如levelDB、mongoDB、redis,以及SQL的,如sqlite或者xxSQL...

    本文说明:除开ES,Solr,sphinx系列的其他开源搜索引擎汇总于此. A search engine based on Node.js and LevelDB A persistent, net ...

  6. for vue 一行2列_JAVA基础练习试题(2)蓝桥杯 附源代码

    JAVA-基础练习(2) 本篇基础练习试题预览;  03.字母图形 04.数列特征 上篇试题:01.闰年判断.02.01字串 03 字母图形 It's a Title Here 问题描述 利用字母可以 ...

  7. sql 列转行_SQL面试题:如何行列互换?一个万能模板

    三个步骤: 输出行列互换的结构表 再用case...when...来输出数据 用group by及max输出最终结果 1.输出行列互换的结构表 SELECT 学号,'课程编号0001','课程编号00 ...

  8. HBase 面试题(一)

    1.MapRedece从读取数据开始到将最终结果写入HDFS经过哪些步骤? 第一步:inputformat进行数据读读取,将数据发送给split 第二步:split 将数据进行切分,发送给Record ...

  9. hbase面试题整理

    一. 简单介绍下Hbase (1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理. (2) Hbase适合存储半结构化或非结构化数据,对于数据 ...

最新文章

  1. BZOJ 3720 [洛谷P2137] : Gty的妹子树
  2. [转].NET 数字格式化:忽略末尾零
  3. VTK:Filtering之TransformPolyData
  4. 英语笔记-20151209
  5. Unity Shader 序列帧动画
  6. JS实现大整数乘法(性能优化、正负整数)
  7. GRPC: 如何实现分布式日志跟踪?
  8. python多线程操作字典_在Python中使用带有线程的全局字典
  9. 、简述global关键字的作用_二十三、Python变量作用域(局部变量和全局变量)
  10. 书店管理系统(C++初学者友好版)
  11. 易语言超级列表框怎么设置文本颜色_抖音超火的快闪动画怎么做?手把手教你!三分钟学会...
  12. 开源进销存管理系统学习教程
  13. CNN文本分类原理讲解与实战
  14. 网页菜单设计html5,点靓网页的10种导航菜单设计
  15. 手工内存管理规则的总结
  16. App Store评论优化,让你的APP评论上涨
  17. 数据库中存储用户名、密码时如何处理?
  18. 【安全头条】美国政府起诉 Kochava 出售敏感的地理位置数据
  19. WEB开发文档2 总结
  20. 这应该是关于GPS定位写得最详实清晰的文章之一

热门文章

  1. PHP开发APP接口全过程(一)
  2. 推荐系统FM系列文章(一)-- FM模型
  3. linux中重启ssh服务器,重启ssh服务的命令是什么
  4. 【Java】字符串对象的比较(==、equals、equalsIgnoreCase、compareTo、compareToIgnoreCase、校对顺序比较)
  5. Docker中配置Oracle12c
  6. mysql ssh隧道连接内网mysql
  7. 信奥中的数学基础:多边形内角和 编程常用英语词汇
  8. 新探索研究生英语读写教程
  9. 如何将电脑桌面图标下文字的白色框框和颜色去掉
  10. 《CTO》第二期7月上市:不标准,毋宁死