Hba⾯试题总结(⼤数据⾯试)
概述
hba是建⽴的hdfs之上,提供⾼可靠性、⾼性能、列存储、可伸缩、实时读写的数据库系统。
它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅⽀持单⾏事务(可通过hive⽀持来实现多表join等复杂操作)。主要⽤来存储⾮结构化和半结构化的松散数据。
与hadoop⼀样,Hba⽬标主要依靠横向扩展,通过不断增加廉价的商⽤服务器,来增加计算和存储能⼒。
HBa中的表⼀般有这样的特点:
1 ⼤:⼀个表可以有上亿⾏,上百万列
2 ⾯向列:⾯向列(族)的存储和权限控制,列(族)独⽴检索。
3 稀疏:对于为空(null)的列,并不占⽤存储空间,因此,表可以设计的⾮常稀疏。
1、Hba是什么?
(1) Hba⼀个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进⾏管理。
(2) Hba适合存储半结构化或⾮结构化数据,对于数据结构字段不够确定或者杂乱⽆章很难按⼀个概念去抽取的数据。
(3) Hba为null的记录不会被存储.
(4)基于的表包含rowkey,时间戳,和列族。新写⼊数据时,时间戳更新,同时可以查询到以前的版本.
(5) hba是主从架构。hmaster作为主节点,hregionrver作为从节点。
美言美语2、HBa 的特点是什么?
1)⼤:⼀个表可以有数⼗亿⾏,上百万列;
2)⽆模式:每⾏都有⼀个可排序的主键和任意多的列,列可以根据需要动态的增加,同⼀
张表中不同的⾏可以有截然不同的列;
3)⾯向列:⾯向列(族)的存储和权限控制,列(族)独⽴检索;
4)稀疏:空(null)列并不占⽤存储空间,表可以设计的⾮常稀疏;
5)数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号⾃动分配,是单元
格插⼊时的时间戳;
6)数据类型单⼀:Hba 中的数据都是字符串,没有类型。
3、HBa 和 Hive 的区别?
Hive 和 Hba 是两种基于 Hadoop 的不同技术–Hive 是⼀种类 SQL 的引擎,并且运⾏MapReduce 任务,Hba 是⼀种在 Hadoop 之上的 NoSQL 的 Key/vale 数据库。当然,这两种⼯具是可以同时使⽤的。就像⽤ Google 来搜索,⽤ FaceBook 进⾏社交⼀样,Hive 可以⽤来进⾏统计查询,HBa 可以⽤来进⾏实时查询,数据也可以从 Hive 写到 Hba,设置再从 Hba 写回 Hive。
4、HBa 适⽤于怎样的情景?
① 半结构化或⾮结构化数据
② 记录⾮常稀疏
③ 多版本数据
目光所及之处是你
④ 超⼤数据量
5、描述 HBa 的 rowKey 的设计原则?
① Rowkey 长度原则
Rowkey 是⼀个⼆进制码流,Rowkey 的长度被很多开发者建议说设计在 10~100 个字节,不过建议是越短越好,不要超过 16 个字节。原因如下:
(1)数据的持久化⽂件 HFile 中是按照 KeyValue 存储的,如果 Rowkey 过长⽐如 100个字节,1000 万列数据光 Rowkey 就要占⽤100*1000 万=10 亿个字节,将近 1G 数据,这会极⼤影响 HFile 的存储效率;
(2)MemStore 将缓存部分数据到内存,如果 Rowkey 字段过长内存的有效利⽤率会降低,系统将⽆法缓存更多的数据,这会降低检索效率。因此 Rowkey 的字节长度越短越好。
(3)⽬前操作系统是都是 64 位系统,内存 8 字节对齐。控制在 16 个字节,8 字节
的整数倍利⽤操作系统的最佳特性。
② Rowkey 散列原则
如果Rowkey 是按时间戳的⽅式递增,不要将时间放在⼆进制码的前⾯,建议将Rowkey的⾼位作为散列字段,由程序循环⽣成,低位放时间字段,这样将提⾼数据均衡分布在每个Regionrver 实现负载均衡的⼏率。如果没有散列字段,⾸字段直接是时间信息将产⽣所有新数据都在⼀个 RegionServer 上堆积的热点现象,这样在做数据检索的时候负载将会集中在个别 RegionServer,降低查询效率。
③ Rowkey 唯⼀原则
必须在设计上保证其唯⼀性。
6、描述 HBa 中 scan 和 get 的功能以及实现的异同?
HBa 的查询实现只提供两种⽅式:
1)按指定 RowKey 获取唯⼀⼀条记录,get ⽅法(org.apache.hadoop.hba.client.Get)Get 的⽅法处理分两种 : 设置了ClostRowBefore 和没有设置 ClostRowBefore 的rowlock。主要是⽤来保证⾏的事务性,即每个 get 是以⼀个 row 来标记的。⼀个 row 中可以有很多 family 和 column。
2)按指定的条件获取⼀批记录,scan ⽅法(org.apache.Hadoop.hba.client.Scan)实现条件查询功能使⽤的就是 scan ⽅式。
7、简述 HBa 中 compact ⽤途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?(☆☆☆☆☆)
在 hba 中每当有 memstore 数据 flush 到磁盘之后,就形成⼀个 storefile,当 storeFile的数量达到⼀定程度后,就需要将 storefile ⽂件来进⾏ compaction 操作。
Compact 的作⽤:
① 合并⽂件
② 清除过期,多余版本的数据
③ 提⾼读写数据的效率
HBa 中实现了两种 compaction 的⽅式:minor and major. 这两种 compaction ⽅式的
区别是:
1、Minor 操作只⽤来做部分⽂件的合并操作以及包括 minVersion=0 并且设置 ttl 的过
期版本清理,不做任何删除数据、多版本数据的清理⼯作。
2、Major 操作是对 Region 下的 HStore 下的所有 StoreFile 执⾏合并操作,最终的结果
是整理合并出⼀个⽂件。文化遗产
8、HBa 优化?
(1)⾼可⽤
在 HBa 中 Hmaster 负责监控 RegionServer 的⽣命周期,均衡 RegionServer 的负载,如果 Hmaster 挂掉了,那么整个 HBa 集群将陷⼊不健康的状态,并且此时的⼯作状态并不会维持太久。所以 HBa ⽀持对 Hmaster 的⾼可⽤配置。
(2)预分区
每⼀个 region 维护着 startRow 与 endRowKey,如果加⼊的数据符合某个 region 维护的rowKey 范围,则该数据交给这个 region 维护。那么依照这个原则,我们可以将数据所要投放的分区提前⼤致的规划好,以提⾼ HBa 性能 .
(3)RowKey 设计
⼀条数据的唯⼀标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于哪个⼀个预分区的区间内,设计 rowkey 的主要⽬的 ,就是让数据均匀的分布于所有的 region中,在⼀定程度上防⽌数据倾斜。接下来我们就谈⼀谈 rowkey 常⽤的设计⽅案
(4)7.4 内存优化
HBa 操作过程中需要⼤量的内存开销,毕竟 Table 是可以缓存在内存中的,⼀般会分配整个可⽤内存的 70%给 HBa 的 Java 堆。但是不建议分配⾮常⼤的堆内存,因为 GC 过程持续太久会导致 RegionServer 处于长期不可⽤状态,⼀般 16~48G 内存就可以了,如果因为框架占⽤内存过⾼导致系统内存不⾜,框架⼀样会被系统服务拖死。
9、Region 如何预建分区?
预分区的⽬的主要是在创建表的时候指定分区数,提前规划表有多个分区,以及每个分区的区间范围,这样在存储的时候 rowkey 按照分区的区间存储,可以避免 region 热点问题。
通常有两种⽅案:
⽅案 1:shell ⽅法
create ‘tb_splits’, {NAME => ‘cf’,VERSIONS=> 3},{SPLITS => [‘10’,‘20’,‘30’]}
⽅案 2: JAVA 程序控制
· 取样,先随机⽣成⼀定数量的 rowkey,将取样数据按升序排序放到⼀个集合⾥;
· 根据预分区的 region 个数,对整个集合平均分割,即是相关的 splitKeys;
· ateTable(HTableDescriptor tableDescriptor,byte[][]splitkeys)可以指定预分区的 splitKey,即是指定 region 间的 rowkey 临界值。
10、HRegionServer 宕机如何处理?
1)ZooKeeper 会监控 HRegionServer 的上下线情况,当 ZK 发现某个 HRegionServer 宕机之后会通知 HMaster 进⾏失效备援;2)该 HRegionServer 会停⽌对外提供服务,就是它所负责的 region 暂时停⽌对外提供服务;
3)HMaster 会将该 HRegionServer 所负责的 region 转移到其他 HRegionServer 上,并且会对 HRegionServer 上存在 memstore 中还未持久化到磁盘中的数据进⾏恢复;
4)这个恢复的⼯作是由 WAL 重播来完成,这个过程如下:
· wal 实际上就是⼀个⽂件,存在/hba/WAL/对应 RegionServer 路径下。
· 宕机发⽣时,读取该 RegionServer 所对应的路径下的 wal ⽂件,然后根据不同的region 切分成不同的临时⽂件 recover.edits。
· 当 region 被分配到新的 RegionServer 中,RegionServer 读取 region 时会进⾏是否存在 recover.edits,如果有则进⾏恢复。11、HBa 读写流程?
读:
① HRegionServer 保存着 meta 表以及表数据,要访问表数据,⾸先 Client 先去访问zookeeper,从 zookeeper ⾥⾯获取 meta 表所在的位置信息,即找到这个 meta 表在哪个HRegionServer 上保存着。
佛教圣地五台山
② 接着 Client 通过刚才获取到的 HRegionServer 的 IP 来访问 Meta 表所在的HRegionServer,从⽽读取到 Meta,进⽽获取到 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 ⼀分为⼆。
12、如何提⾼ HBa 客户端的读写性能?请举例说明(☆☆☆☆☆)
1 开启 bloomfilter 过滤器,开启 bloomfilter ⽐没开启要快 3、4 倍
2 Hba 对于内存有特别的需求,在硬件允许的情况下配⾜够多的内存给它
3 通过修改 hba-env.sh 中的
export HBASE_HEAPSIZE=3000 #这⾥默认为 1000m
4 增⼤ RPC 数量
通过修改 l 中的 unt 属性,可以适当的放⼤RPC 数量,默认值为 10 有点⼩。
13、直接将时间戳作为⾏健,在写⼊单个 region 时候会发⽣热点问题,为什么呢?(☆☆☆☆☆)
region 中的 rowkey 是有序存储,若时间⽐较集中。就会存储到⼀个 region 中,这样⼀个 region 的数据变多,其它的 region 数据很少,加载数据就会很慢,直到 region 分裂,此问题才会得到缓解。
16.请描述如何解决 HBa 中 region 太⼩和 region 太⼤带来的冲突?
Region 过⼤会发⽣多次compaction,将数据读⼀遍并重写⼀遍到 hdfs 上,占⽤io,region过⼩会造成多次 split,region 会下线,影响访问服务,最佳的解决⽅法是调整 hba.hregion.max.filesize 为 256m。
14、hba如何导⼊数据?
通过HBa API进⾏批量写⼊数据;
使⽤Sqoop⼯具批量导数到HBa集群;
使⽤MapReduce批量导⼊;
HBa BulkLoad的⽅式。
15、hba 的存储结构?
Hba 中的每张表都通过⾏键 (rowkey) 按照⼀定的范围被分割成多个⼦表(HRegion),默认⼀个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理,管理哪些 HRegion 由 Hmaster 分
配。 HRegion 存取⼀个⼦表时,会创建⼀个 HRegion 对象,然后对表的每个列族 (Column Family) 创建⼀个 store 实例, 每个 store 都会有 0个或多个 StoreFile 与之对应,每个 StoreFile 都会对应⼀个 HFile , HFile 就是实际的存储⽂件,因此,⼀个 HRegion 还拥有⼀个 MemStore 实例。
16、解释下 hba 实时查询的原理
实时查询,可以认为是从内存中查询,⼀般响应时间在 1 秒内。HBa 的机制是数据先写⼊到内存中,当数据量达到⼀定的量(如
128M),再写⼊磁盘中, 在内存中,是不进⾏数据的更新或合并操作的,只增加数据,这使得⽤户的写操作只要进⼊内存中就可以⽴即返回,保证了 HBa I/O 的⾼性能。
17、HBa优化⽅法
优化⼿段主要有以下四个⽅⾯
1. 减少调整
减少调整这个如何理解呢?HBa中有⼏个内容会动态调整,如region(分区)、HFile,所以通过⼀些⽅法来减少这些会带来I/O开销的调整
Region
如果没有预建分区的话,那么随着region中条数的增加,region会进⾏分裂,这将增加I/O开销,所以解决⽅法就是根据你的RowKey设计来进⾏预建分区,减少region的动态分裂。
HFile
摄像头如何安装HFile是数据底层存储⽂件,在每个memstore进⾏刷新时会⽣成⼀个HFile,当HFile增加到⼀定程度时,会将属于⼀个region的HFile进⾏合并,这个步骤会带来开销但不可避免,但是合并后HFile⼤⼩如果⼤于设定的值,那么HFile会重新分裂。为了减少这样的⽆谓的I/O开销,建议估计项⽬数据量⼤⼩,给HFile设定⼀个合适的值
2. 减少启停
数据库事务机制就是为了更好地实现批量写⼊,较少数据库的开启关闭带来的开销,那么HBa中也存在频繁开启关闭带来的问题。
关闭Compaction,在闲时进⾏⼿动Compaction
因为HBa中存在Minor Compaction和Major Compaction,也就是对HFile进⾏合并,所谓合并就是I/
O读写,⼤量的HFile进⾏肯定会带来I/O开销,甚⾄是I/O风暴,所以为了避免这种不受控制的意外发⽣,建议关闭⾃动Compaction,在闲时进⾏compaction
批量数据写⼊时采⽤BulkLoad
如果通过HBa-Shell或者JavaAPI的put来实现⼤量数据的写⼊,那么性能差是肯定并且还可能带来⼀些意想不到的问题,所以当需要写⼊⼤量离线数据时建议使⽤BulkLoad
3. 减少数据量
虽然我们是在进⾏⼤数据开发,但是如果可以通过某些⽅式在保证数据准确性同时减少数据量,何乐⽽不为呢?汽车加氟
开启过滤,提⾼查询速度
开启BloomFilter,BloomFilter是列族级别的过滤,在⽣成⼀个StoreFile同时会⽣成⼀个MetaBlock,⽤于查询时过滤数据
使⽤压缩:⼀般推荐使⽤Snappy和LZO压缩
4. 合理设计
在⼀张HBa表格中RowKey和ColumnFamily的设计是⾮常重要,好的设计能够提⾼性能和保证数据的准确性
RowKey设计:应该具备以下⼏个属性
散列性:散列性能够保证相同相似的rowkey聚合,相异的rowkey分散,有利于查询
简短性:rowkey作为key的⼀部分存储在HFile中,如果为了可读性将rowKey设计得过长,那么将会增加存储压⼒
唯⼀性:rowKey必须具备明显的区别性
业务性:举些例⼦
假如我的查询条件⽐较多,⽽且不是针对列的条件,那么rowKey的设计就应该⽀持多条件查询
如果我的查询要求是最近插⼊的数据优先,那么rowKey则可以采⽤叫上Long.Max-时间戳的⽅式,这样rowKey就是递减排列
列族的设计
列族的设计需要看应⽤场景
多列族设计的优劣
优势:
HBa中数据时按列进⾏存储的,那么查询某⼀列族的某⼀列时就不需要全盘扫描,只需要扫描某⼀列族,减少了读I/O;
其实多列族设计对减少的作⽤不是很明显,适⽤于读多写少的场景。
劣势:
降低了写的I/O性能。原因如下:数据写到store以后是先缓存在memstore中,同⼀个region中存在多个列族则存在多个store,每个store都⼀个memstore,当其实memstore进⾏flush时,属于同⼀个region
的store中的memstore都会进⾏flush,增加I/O开销。
18、为什么不建议在 HBa 中使⽤过多的列族
在 Hba 的表中,每个列族对应 Region 中的⼀个Store,Region的⼤⼩达到阈值时会分裂,因此如果表中有多个列族,则可能出现以下现象: