1.Hive与Hbase的对比
相同点: hbase与hive都是架构在hadoop之上的,都是用hdfs作为底层存储
不同点:
- Hive是数据仓库, 是一种类 SQL 的引擎,底层执行的是MR任务,一般用来作
离线批量统计查询 - Hbase 是一种在 Hadoop 之上的基于
列式存储(K-V形式)的NoSQL数据库,支持实时读写,一般用作实时查询 - Hive的元数据放在
mysql中,HBase的元数据放在ZK中 - Hive是
单节点的,Hbase是分布式的 - Hbase支持
增删改查,Hive只支持导入和查询,不建议改动数据 - hive是
高延迟、结构化和面向分析的,hbase是低延迟、非结构化和面向编程的 - Hive本身不
存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑 - hbase是
物理表,不是逻辑表,提供一个超大的内存hash表,以索引搜索,方便查询操作
2.Hbase是什么?
- Hbase一个分布式的基于列式存储的NoSQL数据库,基于hdfs 存储,zookeeper 进行管理
- Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的数据。
- Hbase 为 null 的记录不会被存储。
- 基于的表包含 rowkey,时间戳,和列族。新写入数据时,时间戳更新, 同时可以查询到以前的版本。
- hbase 是主从架构。hmaster 作为主节点,hregionserver 作为从节点。
3.Hbase特点
海量存储:Hbase适合存储PB级别的海量数据
列式存储:Hbase是根据列族来存储数据的,HBase 定义表时只需要声明列族即可。【Region
类似于关系型数据库的表概念】
极易扩展:两个方面,RegionServer的扩展,存储HDFS的扩展
高并发
稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏这种存储方式很好地解决了稀疏性问题,因为空值不会占据存储空间,不像MySQL那样NULL值也要值一定的存储空间
4.hbase如何导入数据?
- 通过HBase API进行批量写入数据;
- 使用Sqoop工具批量导数到HBase集群;
- 使用MapReduce批量导入;
- HBase BulkLoad的方式。
5.hbase 的存储结构?
逻辑结构:逻辑上是一张表,有行有列,但是物理上是k-v存储的
一个列族包含n个列,在物理结构上一个列族就是一个文件夹。一个文件夹中包好多个store文件
物理结构:Hbase 中的每张表都通过行键 rowkey按照一定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理, HRegionServer管理哪些 HRegion 由 HMaster 分配。 HRegion的每个列族 (Column Family) 创建一个 store , 每个 store 都会有一个Men Strore和 0个或多个 StoreFile ,每个 StoreFile 都会对应一个 HFile , HFile 就是实际的存储文件
HBase实时查询的原理
- 实时查询,可以认为是从内存中查询,一般响应时间在 1 秒内
- HBase 的机制是数据先写入到内存中,当数据量达到一定的量(如 128M),再写入磁盘中, 在内存中,是不进行数据的更新或合并操作的,只增加数据,这使得用户的写操作只要进入内存中就可以立即返回,保证了 HBase I/O 的高性能。
6.rowKey 的设计原则
rowkey长度原则:(rowkey不宜过长),建议不要超过16个字节(若rowkey长度过长,memorystore会将部分缓存数据存入内存降低内存利用率,降低检索效率,HFile进行数据持久化时也会极大影响存储效率)
rowkey散列原则:设计目标:将数据**均匀的分布**在每个RegionServer,实现负载均衡,避免出现热点问题
解决:生成随机数、hash、散列值、字符串反转、字符串拼接
加盐:在rowkey高几位随机生成一些字符串hash取值:对rowkey取哈希值保证唯一性反转:对rowkey进行反转 例:根据手机号进行话费查询(反转查询)
rowkey唯一原则:rowkey是按照**字典顺序排序**存储的,将经常读取的数据存储到一块
7.描述 Hbase 中 scan 和 get 的功能以及实现的异同
get方法:按指定RowKey获取唯一一条记录
scan方法:条件查询功能使用的就是 scan 方式
- setStartRow 与 setEndRow 来限定范围
- setFilter 方法添加过滤器,这也是分页、多条件查询的基础
- 全表扫描
8.请详细描述 Hbase 中一个 Cell 的结构
9.简述 Hbase filter 的实现原理是什么?结合实际项目经验,写出几个使用filter 的场景
HBase 为筛选数据提供了一组过滤器,通过这个过滤器可以在 HBase 中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键, 列名,时间戳定位)
RowFilter、PrefixFilter。hbase 的 filter 是通过 scan 设置的,所以是基于 scan 的查询结果进行过滤. 过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器。过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端;如在进行订单开发的时候,我们使用 rowkeyfilter 过滤出某个用户的所有订单。
10.HBase 宕机如何处理
- HMaster宕机
- HRegisoner 宕机
HMaster宕机:如果是 HMaster 宕机, HMaster 没有单点问题, HBase 中可以启动多个HMaster,通过ZK选举机制总会有一个HMaster运行对外提供服务
HRegionServer宕机:ZooKeeper 会监控 HRegionServer 的上下线情况,当 ZK 发现某个 HRegionServer 宕机之后会通知 HMaster,1. HRegionServer 会停止对外提供服务,就是它所负责的 region 暂时停止对外提供服务,HMaster 会将其所管理的 region 重新分布到其他活动的 RegionServer 上,同时将该RegionServer上存在MemStore中还未持久化到磁盘的数据通过WAL重播进行恢复,由于数据和日志都持久在 HDFS 中,该操作不会导致数据丢失,所以数据的一致性和安全性是有保障的。但是重新分配的region的节点需要根据日志恢复HRegionServer中内存的MenmoryStore表。宕机的节点重新启动后就相当于一个新的RegionServer加入集群,为了平衡,需要再次将某些region分布到该RegionServer
11.为什么不建议在 HBase 中使用过多的列族
HBase 中每张表的列族个数建议设在1~3之间
列族数对 Flush 的影响
每个列族对应一个 MemStore,越多的列族,将会导致内存中存在越多的 MemStore,每次 Flush 的时候,MemStore 会在磁盘刷写 HFile 文件,所以列族越多最终持久化到磁盘的 HFile 越多,这样会导致持久化到磁盘的文件数很多,同时有很多小文件,而且每次 Flush 操作也涉及到一定的 IO 操作
列族数对 Split 的影响
当 HBase 表中某个 Region 过大,会被拆分成两个,Region Split 是针对所有的列族进行的,这样做的目的是同一行的数据即使在 Split 后也是存在同一个 Region 的,这样在 Region Split 的时候会导致原本数据量很小的 HFile 文件进一步被拆分,从而产生更多的小文件
列族数对 Compaction 的影响
与 Flush 操作一样,目前 HBase 的 Compaction 操作也是 Region 级别的,过多的列族也会产生不必要的 IO
列族数对 HDFS 的影响
HDFS 其实对一个目录下的文件数有限制的(dfs.namenode.fs-limits.max-directory-items)。如果有 N 个列族,M 个 Region,那么持久化到 HDFS 至少会产生 N* M 个文件;而每个列族对应底层的 HFile 文件往往不止一个,假设为 K 个,那么最终表在 HDFS 目录下的文件数将是 N* M* K,这可能会超出 HDFS的限制
列族数对 RegionServer 内存的影响
前面说了,一个列族在 RegionServer 中对应于一个 MemStore。而 HBase 从 0.90.1 版本开始引入了 MSLAB(Memstore-Local Allocation Buffers,参考HBASE-3455),这个功能默认是开启的(通过hbase.hregion.memstore.mslab.enabled),这使得每个 MemStore 在内存占用了 2MB (通过hbase.hregion.memstore.mslab.chunksize 配置)的 buffer。如果我们有很多的列族,那么光 MemStore 的缓存就会占用很多的内存
12.HBase 适用于怎样的情景?
① 半结构化或非结构化数据
② 记录非常稀疏
③ 多版本数据
④ 超大数据量
- 交通⽅⾯:
船舶GPS信息,全长江的船舶GPS信息,每天有1千万左右的数据存储。
- ⾦融⽅⾯:
消费信息,贷款信息,信⽤卡还款信息等
- 电商:
淘宝的交易信息等,物流信息,浏览信息等
- 移动:
通话信息等,都是基于HBase的存储。
13.Region 如何预建分区?
预分区的目的主要是在创建表的时候指定分区数,提前规划表有多个分区,以及每个分区的区间范围,这样在存储的时候 rowkey 按照分区的区间存储,可以避免 region 热点问题。 通常有两种方案:
方案 1:shell 方法:
create ‘tb_splits’, {NAME => ‘cf’,VERSIONS=> 3},{SPLITS => [‘10’,‘20’,‘30’]}
方案 2: JAVA 程序控制:
- 取样,先随机生成一定数量的 rowkey,将取样数据按升序排序放到一个集合里;
- 根据预分区的 region 个数,对整个集合平均分割,即是相关的 splitKeys;
- HBaseAdmin.createTable(HTableDescriptor tableDescriptor,byte[][]splitkeys)可以指定预分区的 splitKey,即是指定 region 间的 rowkey 临界值。
14.如何提高 HBase 客户端的读写性能?请举例说明(☆☆☆☆☆)
- 开启 bloomfilter 过滤器,开启 bloomfilter 比没开启要快 3、4 倍
- Hbase 对于内存有特别的需求,在硬件允许的情况下配足够多的内存给它
- 通过修改 hbase-env.sh 中的export HBASE_HEAPSIZE=3000 #这里默认为 1000m
- 增大 RPC 数量 通过修改 hbase-site.xml 中的 hbase.regionserver.handler.count 属性,可以适当的放大RPC 数量,默认值为 10 有点小。
15.直接将时间戳作为行健,在写入单个 region 时候会发生热点问题,为什么呢?(☆☆☆☆☆)
region 中的 rowkey 是有序存储,若时间比较集中。就会存储到一个 region 中,这样一个 region 的数据变多,其它的 region 数据很少,加载数据就会很慢,直到 region 分裂,此问题才会得到缓解。
16.请描述如何解决 HBase 中 region 太小和 region 太大带来的冲突?
Region 过大会发生多次compaction,将数据读一遍并重写一遍到 hdfs 上,占用io,region过小会造成多次 split,region 会下线,影响访问服务,最佳的解决方法是调整 hbase.hregion.max.filesize 为 256m。