HBase快速入门系列(10) | HBase知识点总结(建议收藏!)

  大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客主页:https://buwenbuhuo.blog.csdn.net/

  此篇为大家带来的是HBase知识点总结(建议收藏!)。


标注:
此处为反爬虫标记:读者可自行忽略

20
原文地址:https://buwenbuhuo.blog.csdn.net/

1. 读写请求会集中到某一个RegionServer上 如何处理(数据倾斜)

  • 产生热点问题的原因:
  • hbase的中的数据是按照字典序排序的,当大量连续的rowkey集中写在个别的region,各个region之间数据分布不均衡;
  • 创建表时没有提前预分区,创建的表默认只有一个region,大量的数据写入当前region
  • 创建表已经提前预分区,但是设计的rowkey没有规律可循
  • 热点问题的解决方案:
  • 随机数+业务主键,如果想让最近的数据快速get到,可以将时间戳加上。
  • Rowkey设计越短越好,不要超过10~100个字节
  • 映射regionNo,这样既可以让数据均匀分布到各个region中,同时可以根据startkey和endkey可以get到同一批数据

2. hbase查询一条记录的方法是什么?Hbase写入一条记录的方法是什么?

  Hbase查询单一数据采用的是get方法,写入数据的方法为put方法(可在回答时说些具体的实现思路)

3. 描述hbase的rowkey的设计原理

Rowkey设计时需要遵循三大原则:

  • 唯一性原则

  rowkey在设计上保证其唯一性。rowkey是按照字典顺序排序存储的,因此,设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。

  • 长度原则

  rowkey是一个二进制码流,可以是任意字符串,最大长度 64kb ,实际应用中一般为10-100bytes,以byte[] 形式保存,一般设计成定长。建议越短越好,不要超过16个字节,原因如下:数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率;MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率。目前操作系统都是64位系统,内存8字节对齐,控制在16个字节,8字节的整数倍利用了操作系统的最佳特性。

  • 散列原则

  如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率

  加盐:如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率加盐:这里所说的加盐不是密码学中的加盐,而是在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。分配的前缀种类数量应该和你想使用数据分散到不同的region的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点
  哈希:哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据
  反转:第三种防止热点的方法时反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。反转rowkey的例子以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,这样的就避免了以手机号那样比较固定开头导致热点问题
  时间戳反转:一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用Long.Max_Value - timestamp 追加到key的末尾.

4. hbase中compact的用途是什么,什么时候触发,分为哪两种,有什么区别。

  在HBase中,每当memstore的数据flush到磁盘后,就形成一个storefile,当storefile的数量越来越大时,会严重影响HBase的读性能 ,HBase内部的compact处理流程是为了解决MemStore Flush之后,文件数目太多,导致读数据性能大大下降的一种自我调节手段,它会将文件按照某种策略进行合并,大大提升HBase的数据读性能。

主要起到如下几个作用:

  1. 合并文件
  2. 清除删除、过期、多余版本的数据
  3. 提高读写数据的效率

HBase中实现了两种compaction的方式:
minor and major. Minor compactions will usually pick up a couple of the smaller adjacent StoreFiles and rewrite them as one. Minors do not drop deletes or expired cells, only major compactions do this. Sometimes a minor compaction will pick up all the StoreFiles in the Store and in this case it actually promotes itself to being a major compaction.

这两种compaction方式的区别是:

  • Minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理,不做任何删除数据、多版本数据的清理工作。
  • Major操作是对Region下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。

compaction触发时机:

  • Memstore刷写后,判断是否compaction
  • CompactionChecker线程,周期轮询

5. Hbase的原理 regionserver挂了 如何恢复数据 ?新的数据从Hlog里读出来是如何恢复的

  引起RegionServer宕机的原因各种各样,有因为Full GC导致、网络异常导致、官方Bug导致(close wait端口未关闭)以及DataNode异常导致等等

  HBase检测宕机是通过Zookeeper实现的, 正常情况下RegionServer会周期性向Zookeeper发送心跳,一旦发生宕机,心跳就会停止,超过一定时间(SessionTimeout)Zookeeper就会认为RegionServer宕机离线,并将该消息通知给Master

  一旦RegionServer发生宕机,HBase都会马上检测到这种宕机,并且在检测到宕机之后会将宕机RegionServer上的所有Region重新分配到集群中其他正常RegionServer上去,再根据HLog进行丢失数据恢复,恢复完成之后就可以对外提供服务,整个过程都是自动完成的,并不需要人工介入.
1

6. 讲一下Hbase,Hbase二级索引用过吗

  默认情况下,Hbase只支持rowkey的查询,对于多条件的组合查询的应用场景,不够给力。如果将多条件组合查询的字段都拼接在RowKey中显然又不太可能。全表扫描再结合过滤器筛选出目标数据(太低效),所以通过设计HBase的二级索引来解决这个问题。

  这里所谓的二级索引其实就是创建新的表,并建立各列值(family:column)与行键(rowkey)之间的映射关系。这种方式需要额外的存储空间,属于一种以空间换时间的方式

7. Hbase如何优化的

内存优化

  • 垃圾回收优化:CMS, G1(Region)
  • JVM启动:-Xms(1/64) –Xmx(1/4)

Region优化

  • 预分区
  • 禁用major合并,手动合并

客户端优化

  • 批处理

8. hbase中查询表名为buwenbuhuo,rowkey为user开头的

HBase Shell : scan 'buwenbuhuo', FILTER => "PrefixFilter ('user')"

HBase JavaAPI : 
Scan scan = new Scan();
Filter filter = new PrefixFilter(Bytes.toBytes("user"));
scan.setFilter(filter);

9. hbase表的设计有哪些注意点

  • 行键的结构是什么的并且要包含什么内容
  • 表有多少个列族?
  • 列族中都要放什么数据?
  • 每个列族中有多少个列?
  • 列名是什么?尽管列名在创建表时不需要指定,你读写数据是需要用到它们。
  • 单元数据需要包含哪些信息?
  • 每个单元数据需要存储的版本数量是多少?

10. HBase与mysql得区别

数据存储的方式:

  • Mysql面向行存储数据,整个行的数据是一个整体,存储在一起。
    HBase面向列存储数据,整个列的数据是一个整体,存储在一起,有利于压缩和统计

数据之间的关系

  • Mysql存储关系型数据,结构化数据
  • Hbase存储的非关系型数据,存储结构化和非结构化数据

事务处理

  • Mysql数据库存在事务,因为着重于计算(算法)
  • Hbase数据库侧重于海量数据的存储,所以没有事务的概念

储存容量

  • Hbase依托于Hadoop,容量非常大,一般都以PB级为单位存储
  • Mysql存储数据依赖于所在的硬件设备

  本次的分享就到这里了,


11

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
  如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

13
12

猜你喜欢

转载自blog.csdn.net/qq_16146103/article/details/106126306