**一.****Hbase热点(数据倾斜)问题, 读写请求会集中到某一个RegionServer上如何处理**
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
产生热点问题的原因:
(1)hbase的中的数据是按照字典序排序的,当大量连续的rowkey集中写在个别的region,各个region之间数据分布不均衡;
(2)创建表时没有提前预分区,创建的表默认只有一个region,大量的数据写入当前region
(3)创建表已经提前预分区,但是设计的rowkey没有规律可循
热点问题的解决方案:
(1)随机数+业务主键,如果想让最近的数据快速get到,可以将时间戳加上。
(2)Rowkey设计越短越好,不要超过10~100个字节
(3)映射regionNo,这样既可以让数据均匀分布到各个region中,同时可以根据startkey和endkey可以get到同一批数据
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
**二.H****base查询一条记录的方法是什么?Hbase写入一条记录的方法是什么?**
~~~
Hbase查询单一数据采用的是get方法,写入数据的方法为put方法
题目简单时,可以在回答问题时,稍微深入的讲解实现思路,比如读写流程。但如果你对HBase的读写流程不太清楚就别说,因为说的越多破绽就越多。
~~~
**三.****描述hbase的rowkey的设计原理**
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
Rowkey设计时需要遵循三大原则:
(1)唯一性原则:
这个很好理解,RowKey的角色类似于关系型数据库当中的主键,因此Rowkey不能重复。
举个例子,使用用户姓名作为RowKey就很不适合,究其原因是因为姓名太容易重复了,如果非要用姓名作为RowKey就得考虑加一些后缀来做区分。
rowkey在设计上保证其唯一性。rowkey是按照字典顺序排序存储的,因此,设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。
(2)长度原则:
而设计太长会导致占用更多的存储空间影响查询效率,设计的太短对业务要求查询也不是特方便。因此在能满足查询条件的情况下,RowKey设计的越短越好。
虽然RowKey最大长度是64KB,实际应用中长度一般为10-100bytes。以byte[] 形式保存,一般设计成定长。 建议越短越好,不要超过16个字节,原因如下: (a)数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率; (b)MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率。 (c)目前操作系统都是64位系统,内存8字节对齐,控制在16个字节,8字节的整数倍利用了操作系统的最佳特性。
(3)散列原则:
让RowKey没有规律,可以实现均匀分配。
如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。 如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率.
常见的散列手段如下: (a)加盐: 这里所说的加盐不是密码学中的加盐,而是在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。 分配的前缀种类数量应该和你想使用数据分散到不同的region的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点.
(b)哈希: 哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。
(c)反转: 第三种防止热点的方法时反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。 反转rowkey的例子以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,这样的就避免了以手机号那样比较固定开头导致热点问题。
(d)时间戳反转: 一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为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 - 结束时间]
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
**四.H****base中compact的用途是什么,什么时候触发,分为哪两种,有什么区别。**
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
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线程,周期轮询
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
**五.****Hbase的原理,regionserver挂了,如何恢复数据?新的数据从Hlog里读出来是如何恢复的?**
~~~
引起RegionServer宕机的原因各种各样,有因为Full GC导致、网络异常导致、官方Bug导致(close wait端口未关闭)以及DataNode异常导致等等。
HBase检测宕机是通过Zookeeper实现的, 正常情况下RegionServer会周期性向Zookeeper发送心跳,一旦发生宕机,心跳就会停止,超过一定时间(SessionTimeout)Zookeeper就会认为RegionServer宕机离线,并将该消息通知给Master。
一旦RegionServer发生宕机,HBase Master通过zookeeper集群会马上检测到这种宕机,并且在检测到宕机之后会将宕机RegionServer上的所有Region重新分配到集群中其他正常RegionServer上去,再根据HLog进行丢失数据恢复,恢复完成之后就可以对外提供服务,整个过程都是自动完成的,并不需要人工介入.
~~~
![](https://img2020.cnblogs.com/blog/1912698/202005/1912698-20200531120033934-1292430485.png)
**六.****讲一下Hbase,Hbase二级索引用过吗**
~~~
默认情况下,Hbase只支持rowkey的查询,对于多条件的组合查询的应用场景,不够给力。
如果将多条件组合查询的字段都拼接在RowKey中显然又不太可能,全表扫描再结合过滤器筛选出目标数据(太低效),所以通过设计HBase的二级索引来解决这个问题。
这里所谓的二级索引其实就是创建新的表,并建立各列值(family:column)与行键(rowkey)之间的映射关系。这种方式需要额外的存储空间,属于一种以空间换时间的方式
~~~
**七.****Hbase如何优化的**
~~~
博主推荐阅读:
https://www.cnblogs.com/yinzhengjie2020/p/12275462.html
~~~
**八.H****base中查询表名为test,rowkey为userl开头的**
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
HBase Shell:
scan 'test', FILTER => "PrefixFilter ('userl')"
HBase JavaAPI:
Scan scan = new Scan();
Filter filter = new PrefixFilter(Bytes.toBytes("userl"));
scan.setFilter(filter);
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
**九.H****base表的设计有哪些注意点**
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
题目主要考核hbase表的设计要素:rowkey, family, column, cell, value, timestamp。
设计hbase表时需要了解:
(1)行键的结构是什么的并且要包含什么内容
(2)表有多少个列族?
(3)列族中都要放什么数据?
(4)每个列族中有多少个列?
(5)列名是什么?尽管列名在创建表时不需要指定,你读写数据是需要用到它们。
(6)单元数据需要包含哪些信息?
(7)每个单元数据需要存储的版本数量是多少?
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
**十.****HBase与mysql得区别**
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
数据存储的方式:
Mysql面向行存储数据,整个行的数据是一个整体,存储在一起。
HBase面向列存储数据,整个列的数据是一个整体,存储在一起,有利于压缩和统计
数据之间的关系
Mysql存储关系型数据,结构化数据
Hbase存储的非关系型数据,存储结构化和非结构化数据
事务处理
Mysql数据库存在事务,因为着重于计算(算法)
Hbase数据库侧重于海量数据的存储,所以没有事务的概念
储存容量
Hbase依托于Hadoop,容量非常大,一般都以PB级为单位存储
Mysql存储数据依赖于所在的硬件设备
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
**十一.HBase 数据存储,客户需要存储三个字段的数据(ID::VALUE::TIMESTAMP),为了满足统计需求,客户希望将100万个测试点的数据在Hbase中存储,每个测试点一年中每五分钟的数据作为一行存储,请确认这要定义存储格式是否合理,请给出最佳的解决方案**
~~~
可以采用测试点作为rowkey,每5分钟的测试点数据作为列存储
~~~
**十二.Hbase,hive和redis的区别**
~~~
Hive基于MR程序,将HQL转换为MR执行。效率比较低,不适合实时数据访问
Hbase基于Hadoop数据存储,存储海量数据,而且拥有自己的查询操作
Redis适合做缓存。
~~~
**十三.HBASE预分区(分区键&分区号)的作用及原理**
~~~
作用:
防止数据热点以及数据倾斜
提高数据读写效率
博主推荐阅读:
https://www.cnblogs.com/yinzhengjie2020/p/12914075.html
~~~
**十四.Hbase的region划分,每次划分大小都一样吗**
~~~
不是都一样大,涉及到middleKey查询。
~~~
**十五.****其它**
~~~
Hbase构建二级索引如何保证索引与数据的一致?
浅谈一下HBASE的读写原理?
描述hbase的scan和get功能以及实现的异同?
~~~
- 常见面试题
- 一.Java常见面试题
- 1.Java基础
- 3.面向对象概念
- 10.Java面试题
- Java基础知识面试题(总结最全面的面试题)
- 设计模式面试题(总结最全面的面试题)
- Java集合面试题(总结最全面的面试题)
- JavaIO、BIO、NIO、AIO、Netty面试题(总结最全面的面试题)
- Java并发编程面试题(总结最全面的面试题)
- Java异常面试题(总结最全面的面试题)
- Java虚拟机(JVM)面试题(总结最全面的面试题)
- Spring面试题(总结最全面的面试题)
- Spring MVC面试题(总结最全面的面试题)
- Spring Boot面试题(总结最全面的面试题)
- Spring Cloud面试题(总结最全面的面试题)
- Redis面试题(总结最全面的面试题)
- MyBatis面试题(总结最全面的面试题)
- TCP、UDP、Socket、HTTP面试题(总结最全面的面试题)
- 二、MySQL面试题
- 1.基础部分
- MySQL面试题(总结最全面的面试题)
- HBase相关面试题整理
- Nginx面试题(总结最全面的面试题)
- RabbitMQ面试题(总结最全面的面试题)
- Dubbo面试题(总结最全面的面试题)
- ZooKeeper面试题(总结最全面的面试题)
- Tomcat面试题(总结最全面的面试题)
- Linux面试题(总结最全面的面试题)
- 超详细的Django面试题
- SSM面试题
- 15个高频微信小程序面试题
- VUE面试题
- Python面试题
- 二、常见问题解答列表
- 1.查看端口及杀死进程
- 三、学习电子书