做为一个高可靠性、高性能、列存储、可伸缩、实时读写的分布式数据库系统,HBase在大数据生态系统中占据重要的地位。咱们必需要了解其基本原理和概念,一方面能够对数据分析工做中排查问题有比较大的帮助,另外一方面方便咱们与他人沟通交流。html
HbaseS的特色是什么?面试
1.hbase是一个分布式的,基于列式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理。shell
2.hbase 适合存储半结构化或非结构化的数据,好比数据结构字段不够肯定或者杂乱无章很难按照一个概念去抽取的数据。数据库
3.hbase的存储效率比较高,为null的数据不会被存储。缓存
4.hbase的表包含rowKey、列族和列,存储数据的最小单元是单元格,单元格包含数据及其对应的写入时间戳,新写入数据时,附带写入时间戳,能够查询到以前写入的多个版本。安全
5.hbase是主从结构,hmaster做为主节点,hregionServer做为从节点。bash
Hbase的数据存储模型服务器
答:Hbase 中的每张表都经过行键(rowkey)按照必定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理,管理哪些 HRegion由 Hmaster 分配。HRegion 存取一个子表时,会建立一个 HRegion 对象,而后对表的每一个列族(Column Family)建立一个 store 实例,每一个 store 都会有 0 个或多个 StoreFile 与之对应,每一个 StoreFile 都会对应一个 HFile, HFile 就是实际的存储文件;一个 HRegion 还拥有一个 MemStore 实例。 网络
描述下HBase的架构?数据结构
答:HBase遵照主从架构的技术,由一个主HMaster和若干个从HRegionServer组成。HBase中的一张表的数据由若干个HRegion组成,也就是说每个HRegion负责管理一张表中的一段数据,HRegion都是分布式的存在于HRegionServer中,因此说HRegion是HBase表中数据分布式存储的单位。那么一个HRegion中又是由若干个column family的数据组成;在HRegion中每一个column family数据由一个store管理,每一个store包含了一个memory store和若干个HFile组成,HFile的数据最终会落地到HDFS文件中,因此说HBase依赖HDFS。
在HBase中还有一部分元数据信息,好比HMaster的状态信息、HRegionServer的状态信息以及HRegion的状态信息等,这些信息都是存储在zookeeper集群中。请看下图便于理解。
描述Hbase中scan和get的功能以及实现的异同
答:Get的功能是精准查找,按指定RowKey 获取惟一一条记录。Scan的功能是范围查找,按指定的条件获取一批记录。实际上它们的实现是同样的,get操做就是一种特殊的scan(begin和end相同的scan操做)。并且hbase读数据的操做都是scan,代码级别实现的是scan,并无特别针对get的操做。
请详细描述Hbase中一个Cell的结构?
答:cell:由{row key, column(=<family> + <label>), version}惟一肯定的单元,cell中的数据是没有类型的,所有是字节码形式存储。
简述compact
答:在 hbase 中每当有 memstore 数据 flush 到磁盘以后,就造成一个 storefile,当 storeFile 的数量达到必定程度后,就须要将 storefile 文件来进行 compaction 操做。
Compact 的做用:
1>.合并文件
2>.清除过时,多余版本的数据
3>.提升读写数据的效率
HBase 中实现了两种 compaction 的方式:minor and major。
这两种 compaction 方式的区别是:
一、 Minor 操做只用来作部分文件的合并操做以及包括 minVersion=0,而且设置 ttl 的过时版本清理,不作任何删除数据、多版本数据的清理工做。
二、 Major 操做是对 Region 下的 HStore 下的全部 StoreFile 执行合并操做,最终的结果是整理合并出一个文件。
描述HBase HMaster HA故障转移过程?
答:宕机分为 HMaster 宕机和 HRegisoner 宕机,若是是 HRegisoner 宕机, HMaster 会将其所管理的 region 从新分布到其余活动的 RegionServer 上,因为数据和日志都持久在 HDFS中,该操做不会致使数据丢失。因此数据的一致性和安全性是有保障的。若是是 HMaster 宕机,会经过Zookeeper 的 Master Election 机制从新选出一个正在运行的Master 进程做为活跃节点,继续提供服务。
Hbase读写流程
读:
① HRegionServer 保存着 meta 表以及表数据,要访问表数据,首先 Client 先去访问zookeeper,从 zookeeper 里面获取 meta 表所在的位置信息,即找到这个 meta 表在哪一个HRegionServer 上保存着。
② 接着 Client 经过刚才获取到的 IP 访问对应的HRegionServer,获取到 Meta 表中存放的元数据。
③ Client 经过元数据中存储的信息,访问对应的 HRegionServer,而后扫描所在HRegionServer 的 Memstore 和 Storefile 来查询数据。
④ 最后 HRegionServer 把查询到的数据响应给 Client。
写:
① Client 先访问 zookeeper,找到 Meta 表,并获取 Meta 表元数据。
② 肯定当前将要写入的数据所对应的 HRegion 和 HRegionServer 服务器。
③ Client 向该 HRegionServer 服务器发起写入数据请求,而后 HRegionServer 收到请求并响应。
④ Client 先把数据写入到 HLog,以防止数据丢失。
⑤ 而后将数据写入到 Memstore。
⑥ 若是 HLog 和 Memstore 均写入成功,则这条数据写入成功
⑦ 若是 Memstore 达到阈值,会把 Memstore 中的数据 flush 到 Storefile 中。
⑧ 当 Storefile 愈来愈多,会触发 Compact 合并操做,把过多的 Storefile 合并成一个大的 Storefile。
⑨ 当 Storefile 愈来愈大,Region 也会愈来愈大,达到阈值后,会触发 Split 操做,将Region 一分为二。
HBase适用于怎样的情景?
1.半结构化或非结构化数据:
对于数据结构字段不够肯定或杂乱无章很是难按一个概念去进行抽取的数据适合用HBase,由于HBase支持动态添加列。
2.记录很稀疏:
关系型数据库的列的数量是相对稳定的,null值也会占据存储位,为null的列浪费了存储空间。HBase为null的Column不会被存储,这样既节省了空间又提升了读性能。
3.多版本数据:
依据Row key和Column key定位到的Value可以有随意数量的版本号值,所以对于须要存储变更历史记录的数据,用HBase是很方便的。好比某个用户的Address变动,其变动记录也许也是具备研究意义的。
4.仅要求最终一致性:
对于数据存储事务的要求不像金融行业和财务系统这么高,只要保证最终一致性就行。
5.要求高可用性和支持海量数据以及很大的瞬间写入量:
1)WAL解决高可用,支持PB级数据,写入性能高。
2)索引插入比查询操做更频繁的状况。好比,对于历史记录表和日志文件。(HBase的写操做更加高效)。
描述HBase的rowKey的设计原则?
① Rowkey 长度原则
Rowkey 是一个二进制码流,通常是10~100个字节,建议越短越好,不超过16字节为宜。
② Rowkey 散列原则
若是Rowkey 是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将Rowkey的高位做为散列字段,由程序循环生成,低位放时间字段,这样将提升数据均衡分布在每一个Regionserver 实现负载均衡的概率。若是没有散列字段,首字段直接是时间信息将产生全部新数据都在一个 RegionServer 上堆积的热点现象,这样在作数据检索的时候负载将会集中在个别 RegionServer,下降查询效率。
③ Rowkey 惟一原则
必须在设计上保证其惟一性。
如何提升HBase集群的读写性能
1.开启 bloomfilter 过滤器,开启 bloomfilter 比没开启要快 三、4 倍。
2.Hbase 对于内存有特别的需求,在硬件容许的状况下配足够多的内存给它。
3.增大 RPC 数量,经过修改 hbase-site.xml 中的 hbase.regionserver.handler.count 属性,能够适当的放大RPC 数量,默认值为 10 有点小。
HRegionServer宕机后,此台机器的region数据的转移过程?
描述HBase中region过小和region太大带来的问题?
答:Region太小会发生屡次compaction,将数据读一遍并重写一遍到hdfs上,占用io,region过大会形成屡次split,region 会下线,影响访问服务.
HBase的关键组件是什么?
1)Table:可理解为传统数据库中的一个表,但由于SchemaLess的设计,它较之传统数据库的表而言,在设计上更加灵活。
2)Region:将表横向切割为一个个子表,子表在HBase中被称之为Region。
3)RegionServer:数据服务进程,Region必须部署在某一个RegionServer上才能够提供读写服务。
4)HFile:HBase数据库在底层分布式文件系统中的文件组织形式。
5)Column Family:一些列的集合。不一样的Column Family数据被存储在不一样的路径中。MemStore:用来在内存中缓存必定大小的数据,达到设定的阈值后批量写入到底层文件系统中。数据是有序的。
下图清晰的展现了Table,Region,RegionServer,HFile,MemStore,Column Family在HBase的逻辑关系。
Hbase中有哪些数据操做命令类型?
在HBase中什么是列族?
解释Hbase如何实际删除一行
介绍下RowFilter
Filter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(rowKeyValue)));Scan scan = new Scan();scan.setFilter(rowFilter)复制代码
在上面例子中,比较符为EQUAL,比较器为BinaryComparator 复制代码
Region如何预建分区
create 't1', 'f1',SPLITS=>['10','20','30']create 't1','f1',SPLITS_FILE =>'splits.txt'复制代码
2)Java API建立一个byte[][] splitKeys = {{1,2,3},{4,5,6}}admin.createTable(tableDesc,splitKeys)复制代码
Hbase中有多少数据操做命令类型
create_namespace 'test_ns'复制代码
在新的namespace中建立表:
//test表中有2个column familycreate 'test_ns:test','f','e'复制代码
put 'test_ns:test','rowkey-1','f:a','value1'put 'test_ns:test','rowkey-1','e:b','value2'复制代码
//删除一列delete 'test_ns:test','rowkey-1','f:a'//删除一行deleteall 'test_ns:test','rowkey-1'复制代码
put 'test_ns:test','rowkey-1','f:a','value1'复制代码
get 'test_ns:test','rowkey-1'get 'test_ns:test','rowkey-1',{COLUMN => 'f:a'}复制代码
使用HBase shell建立一张表,并对其进行增删改查?
简述下HBASE中split机制
参考答案:HBase中为了使得HRegion不至于太大(默认是10G),那么当HRegion太大的时候,就须要对HRegion进行切分(split)。
split有三种方式:
1)pre-split(预切分),能够根据传入的参数计算出HBase表须要存储多大的数据,在建立表的时候预先给表切分好HRegion。以下面的例子:
//根据参数给表预先切分4个HRegioncreate 'test_pre_split','f',split => ['10','20','30']复制代码
2)Auto-split(自动切分),当一个Region达到必定的大小的时候,这个Region会自动切分红两个Region。3)Force-split(手工切分),经过命令手动的去切分某个须要切分的HRegion。能够在hbase shell中经过命令split table_name,rowkey;还能够在HBase的Web UI上进行切分。复制代码
Hbase如何借助其余技术实现二级索引
众所周知,在hbase中使用rowKey检索数据是很是快速的,可是若是想要根据某一列进行数据的检索,速度就会慢不少,这是由于hbase没有二级索引,对某一列进行检索就须要作全表扫描。
明白了这一点,那么咱们就能够借助其余技术来实现hbase的二级索引功能,最经常使用的技术手段即是,借助Solr或者ElasticSearch。它的核心思想是,在数据写入hbase的同时,将rowKey以及须要用于检索的列写入Solr或者ElasticSearch创建倒排索引,那么咱们在对某一列进行检索时,能够先去Solr或者ElasticSearch中检索出对应的rowKey,而后再去Hbase中进行查找,这样两段式查找,就避免了全表扫描,大大提升了检索的速度。
RowKey设计实例
一款视频APP的播放行为统计数据,须要查询天天每一个视频类型播放量TopN的视频(播放量从高到低排序),如何设计rowkey?
需求分析:首先咱们存储的数据是每一个视频在某天的播放量统计数据,咱们读取数据的场景是获取某天某个视频类型的播放量TopN(能够是Top十、Top100、Top200等)视频列表,那么咱们的设计思路能够是将RowKey分为三段,第一段存储播放日期,第二段存放视频类型,第三段存储倒排的播放量。这样在检索时,咱们能够设置过滤RowKey前缀是播放日期+视频类型,而后提取前N条记录。
参考示例:key_day + content_type + (99999999-play_num)
说明:key_day是播放日期,content_type是视频类型,play_num是视频的播放量,用(9999999999-play_num)是为了反转排序,将播放量大的视频排在前面。须要注意的是,RowKey每段的长度必定要保持一致,若是长度不够,须要用其余字符补足位数。
这样设计rowkey就能够知足天天每一个视频类型的TopN查询,查询的时候要配合前缀过滤器PrefixFilter进行升序排序,获得的就是一个播放量倒排的视频列表。
小结
本篇HBase面试指南,结合网络上的经典考题和工做中总结改编的题目一共24道,考点涉及了基本概念和基本操做以及原理方面的内容,但愿读者能够查漏补缺,完善HBase面试知识点。
[1] HBase面试题 做者: 脚丫先生https://blog.csdn.net/shujuelin/article/details/89035272[2] Hbase相关面试题 做者: haixwanghttps://blog.csdn.net/HaixWang/article/details/79514886[3] HBase面试问题 做者:鱼果说https://www.cnblogs.com/yuguoshuo/p/6265639.html[4] Hbase面试问题与解答 做者:飞禹德蒙https://www.songma.com/news/txtlist_i2275v.html[5] 大数据面试题-HBase 做者:jiangw-Tonyhttp://www.cocoachina.com/articles/30334[6] hadoop、hbase、hive等相关面试问题 做者:syssp-Fhttps://download.csdn.net/download/reyzelamp/10484333[7]【面试】HBase面试题 做者:_和_https://www.jianshu.com/p/e405ed781cab复制代码