文章目录
一、Hbase是什么?
二、HBase 的特点是什么?
三、HBase 和 Hive 的区别?
1)两者是什么?
2)两者的特点
3)两者的限制
4)两者的应用场景
5)总结
四、HBase 适用于怎样的情景?
五、描述 HBase 的 rowKey 的设计原则?
1)Rowkey 长度原则
2)Rowkey 散列原则
3)Rowkey 唯一原则
六、描述HBase 中scan 和get 的功能以及实现的异同?
七、hbase如何导入数据?
八、hbase 的存储结构?
九、解释下 hbase 实时查询的原理
十、详细描述 HBase 中一个 cell 的结构?
十一、简述 HBase 中 compact 用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?(☆☆☆☆☆)
十二、HBase 中实现了两种 compaction 的方式:minor and major. 这两种 compaction 方式的 区别是:
十三、简述 Hbase filter 的实现原理是什么?结合实际项目经验,写出几个使用filter 的场景。
十四、Hbase 内部是什么机制?
十五、HBase 宕机如何处理?
十六、HRegionServer宕机如何处理?
十七、hbase写数据 和 读数据过程
十八、HBase优化方法
1)减少调整
2)减少启停
3)减少数据量
4)合理设计
十九、为什么不建议在 HBase 中使用过多的列族
二十、Region 如何预建分区?
二十一、如何提高 HBase 客户端的读写性能?请举例说明(☆☆☆☆☆)
二十一、直接将时间戳作为行健,在写入单个 region 时候会发生热点问题,为什么呢?(☆☆☆☆☆)
二十二、请描述如何解决 HBase 中 region 太小和 region 太大带来的冲突?
二十三、解释一下布隆过滤器原理(☆☆☆☆☆)?
二十四、HBase与传统关系型数据库(如MySQL)的区别
二十五、另外的一些面试题
一、Hbase是什么?
Hbase一个分布式的基于列式存储的数据库,基于Hadoop的 hdfs 存储,zookeeper 进行管理。
Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的数据。
Hbase 为 null 的记录不会被存储。
基于的表包含 rowkey,时间戳,和列族。新写入数据时,时间戳更新, 同时可以查询到以前的版本。
hbase 是主从架构。hmaster 作为主节点,hregionserver 作为从节点。
二、HBase 的特点是什么?
1) 大:一个表可以有数十亿行,上百万列; 2) 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不 同的行可以有截然不同的列; 3) 面向列:面向列(族)的存储和权限控制,列(族)独立检索; 4) 稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏; 5) 数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时 的时间戳; 6) 数据类型单一:Hbase 中的数据都是字符串,没有类型。
三、HBase 和 Hive 的区别?
1)两者是什么?
Apache Hive 是一个构建在Hadoop 基础设施之上的数据仓库。通过Hive 可以使用HQL语言查询存放在HDFS 上的数据。HQL 是一种类SQL 语言, 这种语言最终被转化为Map/Reduce。虽然Hive 提供了SQL 查询功能,但是Hive 不能够进行交互查询–因为它只能够在Haoop 上批量的执行Hadoop。
Apache HBase 是一种Key/Value 系统,它运行在HDFS 之上。和Hive 不一样,Hbase 的能够在它的数据库上实时运行,而不是运行MapReduce 任务。Hbase 被分区为表格,表格又被进一步分割为列簇。列簇必须使用schema 定义,列簇将某一类型列集合起来(列不要求schema 定义)。例如,“message”列簇可能包含:“to”, ”from” “date”, “subject”,和”body”. 每一个key/value 对在Hbase 中被定义为一个cell,每一个key 由row-key,列簇、列和时间戳。在Hbase 中,行是key/value 映射的集合,这个映射通过row-key 来唯一标识。Hbase 利用Hadoop 的基础设施,可以利用通用的设备进行水平的扩展。
2)两者的特点
Hive 帮助熟悉SQL 的人运行MapReduce 任务。因为它是JDBC 兼容的,同时,它也能够和现存的SQL 工具整合在一起。运行Hive 查询会花费很长时间,因为它会默认遍历表中所有的数据。虽然有这样的缺点,一次遍历的数据量可以通过Hive 的分区机制来控制。分区允许在数据集上运行过滤查询,这些数据集存储在不同的文件夹内,查询的时候只遍历指定文件夹(分区)中的数据。这种机制可以用来,例如,只处理在某一个时间范围内的文件, 只要这些文件名中包括了时间格式。
HBase 通过存储key/value 来工作。它支持四种主要的操作:增加或者更新行,查看一个范围内的cell,获取指定的行,删除指定的行、列或者是列的版本。版本信息用来获取历史数据(每一行的历史数据可以被删除,然后通过Hbase compactions 就可以释放出空间)。虽然HBase 包括表格,但是schema 仅仅被表格和列簇所要求,列不需要schema。Hbase 的表格包括增加/计数功能。
3)两者的限制
Hive 目前不支持更新操作。另外,由于hive 在hadoop 上运行批量操作,它需要花费很长的时间,通常是几分钟到几个小时才可以获取到查询的结果。Hive 必须提供预先定义好的schema 将
文件和目录映射到列,并且Hive 与ACID 不兼容。
HBase 查询是通过特定的语言来编写的,这种语言需要重新学习。类SQL 的功能可以通过Apache Phonenix 实现,但这是以必须提供schema 为代价的。另外,Hbase 也并不是兼容所有的ACID 特性,虽然它支持某些特性。最后但不是最重要的–为了运行Hbase,Zookeeper 是必须的,zookeeper 是一个用来进行分布式协调的服务,这些服务包括配置服务,维护元信息和命名空间服务。
4)两者的应用场景
Hive 适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。
Hive 不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。
Hbase 非常适合用来进行大数据的实时查询。Facebook 用Hbase 进行消息和实时的分析。它也可以用来统计Facebook 的连接数。
5)总结
Hive 和Hbase 是两种基于Hadoop 的不同技术–Hive 是一种类SQL 的引擎,并且运 MapReduce 任务,Hbase 是一种在Hadoop 之上的NoSQL 的Key/vale 数据库。当然,这两种工具是可以同时使用的。就像用Google 来搜索,用FaceBook 进行社交一样,Hive 可以用来进行统计查询,HBase 可以用来进行实时查询,数据也可以从Hive 写到Hbase,设置再从Hbase写回Hive。
四、HBase 适用于怎样的情景?
① 半结构化或非结构化数据
② 记录非常稀疏
③ 多版本数据
④ 超大数据量
五、描述 HBase 的 rowKey 的设计原则?
1)Rowkey 长度原则
Rowkey 是一个二进制码流,Rowkey 的长度被很多开发者建议说设计在10~100 个字节,不过建议是越短越好,不要超过16 个字节。原因如下:
1) 大:一个表可以有数十亿行,上百万列; 2) 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不 同的行可以有截然不同的列; 3) 面向列:面向列(族)的存储和权限控制,列(族)独立检索; 4) 稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏; 5) 数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时 的时间戳; 6) 数据类型单一:Hbase 中的数据都是字符串,没有类型。
2)Rowkey 散列原则
如果Rowkey 是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将Rowkey 的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个Regionserver 实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息将产生所有新数据都在一个RegionServer上堆积的热点现象,这样在做数据检索的时候负载将会集中在个别RegionServer,降低查询效率。
3)Rowkey 唯一原则
必须在设计上保证其唯一性。
六、描述HBase 中scan 和get 的功能以及实现的异同?
HBase 的查询实现只提供两种方式:
1) 按指定RowKey 获取唯一一条记录
get 方法(org.apache.hadoop.hbase.client.Get)
Get 的方法处理分两种: 设置了ClosestRowBefore 和没有设置ClosestRowBefore 的rowlock。主要是用来保证行的事务性,即每个get 是以一个row 来标记的。一个row 中可以有很多family和column。
2) 按指定的条件获取一批记录
scan 方法(org.apache.Hadoop.hbase.client.Scan)实现条件查询功能
使用的就是scan 方式。
(1)scan 可以通过setCaching 与setBatch 方法提高速度(以空间换时间); (2)scan 可以通过setStartRow 与setEndRow 来限定范围([start,end)start 是闭区间,end 是开区 间)。范围越小,性能越高。 (3)scan 可以通过setFilter 方法添加过滤器,这也是分页、多条件查询的基础。
七、hbase如何导入数据?
- 通过HBase API进行批量写入数据;
- 使用Sqoop工具批量导数到HBase集群;
- 使用MapReduce批量导入;
- HBase BulkLoad的方式。
八、hbase 的存储结构?
Hbase 中的每张表都通过行键 (rowkey) 按照一定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理,管理哪些 HRegion 由 Hmaster 分配。 HRegion 存取一个子表时,会创建一个 HRegion 对象,然后对表的每个列族 (Column Family) 创建一个 store 实例, 每个 store 都会有 0个或多个 StoreFile 与之对应,每个 StoreFile 都会对应一个 HFile , HFile 就是实际的存储文件,因此,一个 HRegion 还拥有一个 MemStore 实例。
九、解释下 hbase 实时查询的原理
实时查询,可以认为是从内存中查询,一般响应时间在 1 秒内。HBase 的机制是数据先写入到内存中,当数据量达到一定的量(如 128M),再写入磁盘中, 在内存中,是不进行数据的更新或合并操作的,只增加数据,这使得用户的写操作只要进入内存中就可以立即返回,保证了 HBase I/O 的高性能。
十、详细描述 HBase 中一个 cell 的结构?
HBase 中通过 row 和 columns 确定的为一个存贮单元称为 cell。Cell:由{row key, column(= + ), version}是唯一确定的单元cell 中的数据是没有类型的,全部是字节码形式存贮。
十一、简述 HBase 中 compact 用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?(☆☆☆☆☆)
在 hbase 中每当有 memstore 数据 flush 到磁盘之后,就形成一个 storefile,当 storeFile的数量达到一定程度后,就需要将 storefile 文件来进行 compaction 操作。
Compact 的作用:
① 合并文件
② 清除过期,多余版本的数据
③ 提高读写数据的效率
十二、HBase 中实现了两种 compaction 的方式:minor and major. 这两种 compaction 方式的 区别是:
1、Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过
期版本清理,不做任何删除数据、多版本数据的清理工作。
2、Major 操作是对 Region 下的 HStore 下的所有 StoreFile 执行合并操作,最终的结果是整理合并出一个文件。
十三、简述 Hbase filter 的实现原理是什么?结合实际项目经验,写出几个使用filter 的场景。
HBase 为筛选数据提供了一组过滤器,通过这个过滤器可以在 HBase 中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键, 列名,时间戳定位)。
RowFilter、PrefixFilter。hbase 的 filter 是通过 scan 设置的,所以是基于 scan 的查询结果进行过滤. 过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器。过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端;如在进行订单开发的时候,我们使用 rowkeyfilter 过滤出某个用户的所有订单。
十四、Hbase 内部是什么机制?
Hbase 是一个能适应联机业务的数据库系统物理存储:hbase 的持久化数据是将数据存储在 HDFS 上。
存储管理:一个表是划分为很多 region 的,这些 region 分布式地存放在很多 regionserver上 Region 内部还可以划分为 store,store 内部有 memstore 和 storefile。
版本管理:hbase 中的数据更新本质上是不断追加新的版本,通过 compact 操作来做版本间的文件合并 Region 的 split。
集群管理:ZooKeeper + HMaster + HRegionServer。
在 HBase 中无论是增加新行还是修改已有的行,其内部流程都是相同的。HBase 接到命令后存下变化信息,或者写入失败抛出异常。默认情况下,执行写入时会写到两个地方:预写式日志(write-ahead log,也称 HLog)和 MemStore。HBase 的默认方式是把写入动作记录在这两个地方,以保证数据持久化。只有当这两个地方的变化信息都写入并确认后,才认为写动作完成。
MemStore 是内存里的写入缓冲区,HBase 中数据在永久写入硬盘之前在这里累积。当MemStore 填满后,其中的数据会刷写到硬盘,生成一个HFile。HFile 是HBase 使用的底层存储格式。HFile 对应于列族,一个列族可以有多个 HFile,但一个 HFile 不能存储多个列族的数据。在集群的每个节点上,每个列族有一个MemStore。大型分布式系统中硬件故障很常见,HBase 也不例外。
设想一下,如果MemStore 还没有刷写,服务器就崩溃了,内存中没有写入硬盘的数据就会丢失。HBase 的应对办法是在写动作完成之前先写入 WAL。HBase 集群中每台服务器维护一个 WAL 来记录发生的变化。WAL 是底层文件系统上的一个文件。直到WAL 新记录成功写入后,写动作才被认为成功完成。这可以保证 HBase 和支撑它的文件系统满足持久性。
大多数情况下,HBase 使用Hadoop分布式文件系统(HDFS)来作为底层文件系统。如果 HBase 服务器宕机,没有从 MemStore 里刷写到 HFile 的数据将可以通过回放 WAL 来恢复。你不需要手工执行。Hbase 的内部机制中有恢复流程部分来处理。每台 HBase 服务器有一个 WAL,这台服务器上的所有表(和它们的列族)共享这个 WAL。你可能想到,写入时跳过 WAL 应该会提升写性能。但我们不建议禁用 WAL, 除非你愿意在出问题时丢失数据。如果你想测试一下,如下代码可以禁用 WAL: 注意:不写入 WAL 会在 RegionServer 故障时增加丢失数据的风险。关闭 WAL, 出现故障时 HBase 可能无法恢复数据,没有刷写到硬盘的所有写入数据都会丢失。