目录
1.Hbase是什么?
2.HBase 的特点是什么?
3.HBase 和 Hive 的区别?
4.描述 HBase 的 rowKey 的设计原则?
5.请详细描述 HBase 中一个 cell 的结构?
6.hbase中分布式存储的最小单元?
7.简述 HBase 中 compact 用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?
8.Region 如何预建分区?
9.HRegionServer 宕机如何处理?
10.HBase 读写流程?HBase 内部机制是什么?(☆)
11.HBase 在进行模型设计时重点在什么地方?一张表中定义多少个 Column Family 最合适?为什么?
12.如何提高 HBase 客户端的读写性能?请举例说明
13.请描述如何解决 HBase 中 region 太小和 region 太大带来的冲突?
14.谈谈hbase中的数据热点问题以及应对办法?
编辑
15.谈谈HBase的大合并、小合并?
16.HBase和关系型(传统数据库)的区别?
17.谈谈Hbase的高可用?
(1) Hbase一个分布式的基于列式存储的NoSQL数据库,基于Hadoop的hdfs存储,zookeeper进行管理。
(2) Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的数据。
(3) Hbase为null的记录不会被存储.
(4)基于的表包含rowkey,时间戳,和列族。新写入数据时,时间戳更新,同时可以查询到以前的版本.
(5) hbase是主从架构。hmaster作为主节点,hregionserver作为从节点。
1、海量存储:可以存储大批量的数据。
2、列(簇)式存储:hbase表的数据是基于列族进行存储的,列族是在列的方向上的划分。
3、极易扩展:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加 datanode节点服务(机器)就可以了;可以通过增加服务器来提高集群的存储能力。
4、高并发:支持高并发的读写请求。
5、稀疏:稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
6、数据的多版本:hbase表中的数据可以有多个版本值,默认情况下是根据版本号去区分,版本号就是插入数据的时间戳。
7、数据类型单一:所有的数据在hbase中是以字节数组进行存储。
Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。
hbase运行在hdfs上,和hive不一样,hbase能够在数据库上实时运行,而不是运行MapReduce任务。
应用场景
Hive适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。
Hbase非常适合用来进行大数据的实时查询。
第一个是散列原则:如果是rowkey按照时间戳或者是顺序递增
那么将会产生热点现象 建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率
第二个是长度原则:
RowKey的长度不宜过长,不宜超过16个字节,最大长度64kb,实际应用中一般为10-100bytes,以byte[]形式保存。一条数据是根据rowkey来当成索引的,如果过长就会快速占据memstore的128M,然后被刷写到磁盘,也就是说相同的空间存贮的内容被rowkey占据了一大部分,减少了主要内容的存贮。
第三个是唯一原则:
必须在设计上保证其唯一性, rowkey可以锁定唯一的一行数据,rowkey重复的话后put的数据会覆盖前面插入的数据
HBase 中的 Cell表示的是表中的单元格,由{rowkey, column Family:columu, version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。其中 version 就是这个单元格中的 Time Stamp。
Region是分布式存储的最小单元,但并不是存储的最小单元。
在hbase 中每当有memstore 数据flush 到磁盘之后,就形成一个storefile,当storeFile 的数量达到一定程度后,
就需要将storefile 文件来进行compaction 操作。
Compact 的作用:
1、合并文件
2、清除过期,多余版本的数据
3、提高读写数据的效率
HBase 中实现了两种compaction 的方式:minor 和 major.
这两种compaction方式的区别是:
1、Minor 操作只用来做部分文件的合并操作以及包括minVersion=0 并且设置ttl 的过
期版本清理,不做任何删除数据、多版本数据的清理工作。
2、Major 操作是对Region 下的HStore 下的所有StoreFile 执行合并操作,最终的结果
是整理合并出一个文件。
创建表时,只有一个分区region,当该分区达到一定的值时,会进行分区,此时分区会影响Hbase的性能。而且每一个region维护着startRow与endRow,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。因此可以添加预分区。
1.create 'group','info',SPLITS =>['10','20','30','40']
2.create 'group2','info',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
3.按照文件内容预分区
文件内容:spilt.txt
aaaa
bbbb
cccc
dddd
create 'group3', 'info',SPLITS_FILE => '/opt/module/hive/datas/spilt.txt'
4.根据API分区
1)ZooKeeper 会监控 HRegionServer 的上下线情况,当 ZK 发现某个 HRegionServer 宕机之后会通知 HMaster 进行失效备援;
2)该 HRegionServer 会停止对外提供服务,就是它所负责的 region 暂时停止对外提供服务;
3)HMaster 会将该 HRegionServer 所负责的 region 转移到其他 HRegionServer 上,并且会对 HRegionServer 上存在 memstore 中还未持久化到磁盘中的数据进行恢复;
4)这个恢复的工作是由 WAL 重播来完成,这个过程如下:
· wal 实际上就是一个文件,存在/hbase/WAL/对应 RegionServer 路径下。
· 宕机发生时,读取该 RegionServer 所对应的路径下的 wal 文件,然后根据不同的region 切分成不同的临时文件 recover.edits。
· 当 region 被分配到新的 RegionServer 中,RegionServer 读取 region 时会进行是否存在 recover.edits,如果有则进行恢复。
Column Family 的个数具体看表的数据,一般来说划分标准是根据数据访问频度,如一张表里有些列访问相对频繁,而另一些列访问很少,这时可以把这张表划分成两个列族,分开存储,提高访问效率。
1 开启 bloomfilter 过滤器,开启 bloomfilter 比没开启要快 3、4 倍
2 Hbase 对于内存有特别的需求,在硬件允许的情况下配足够多的内存给它
3 通过修改 hbase-env.sh 中的
export HBASE_HEAPSIZE=3000 #这里默认为 1000m
4 增大 RPC 数量
通过修改 hbase-site.xml 中的 hbase.regionserver.handler.count 属性,可以适当的放大RPC 数量,默认值为 10 有点小。
Region 过大会发生多次compaction,将数据读一遍并重写一遍到 hdfs 上,占用io,region过小会造成多次 split,region 会下线,影响访问服务,最佳的解决方法是调整 hbase.hregion.max.filesize 为 256m。
数据热点问题:(数据倾斜)
什么是热点?(就是多数数据集中在少数region当中)
HBase中的行是按照rowkey的字典顺序排序的,这种设计优化了scan操作,可以将相关的行以及会被一起读取的行存取在临近位置,便于scan。然而糟糕的rowkey设计是热点的源头。热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响同一个RegionServer上的其他region,由于主机无法服务其他region的请求。设计良好的数据访问模式以使集群被充分,均衡的利用。
常见的解决办法:(哈希比较常用,因为哈希还能解决去重问题 因为相同的值哈希值也相同)
删除一条记录就会在该记录上打上标记DeleteColumn,该记录使用get和scan查询不到,但还是在HFile中。只有进行大合并时才会删除这条记录
大合并:region的一个列族所有HFile合并成一个HFile
小合并:多个小的HFile合并成一个大的HFile,将新文件设置为激活状态,删除小文件
1、数据类型:HBase只有简单的数据类型,只保留字符串;传统有丰富的数据类型
2、数据操作:HBase只有简单的增删改查等操作,表和表之间是分离的;传统有各式各样的函数和连接操作
3、存储模型:HBase基于列式存储的,数据即索引,可以实现查询的并发处理;传统基于表格结构和行存储,其没有建立索引将耗费大量的I/O并且建立索引和物化视图需要耗费大量的时间和资源
4、数据维护:HBase的更新实际上是插入了新的数据;传统只是替换和修改
5、可伸缩性:HBase可以轻松的增加或减少硬件的数目,并且对错误的兼容性比较高;传统需要增加中间层才能实现这样的功能
6、事务:HBase只可以实现单行的事务性,意味着行与行、表与表之间不必满足事务性;传统可以实现跨行的事务性
主HMaster在启动时会在ZooKeeper中/master节点注册
备用的HMaster在启动时会在ZooKeeper中backup-masters节点注册
HMaster只有一个,当进程挂了,那么会对HBase集群造成影响(单节点故障)
解决办法:在另外一台服务器上,例如slave1,在启动一个HMaster
RegionServer:
当RegionServer挂了的时候,其上面的Region就会失效,HMaster会发现失效的Region并进行重新分配,但是可能会有部分数据在memstore上,如果RegionServer挂了,那么这部分数据将丢失,不过在写memstore之前数据已经写入了HLOG,所以丢失的数据可以通过HLOG进行恢复。
storefile的数据已经在HDFS上了,不会丢失