01-Hbase的特点
以下五点需要准确说出的,如果可以还可以将一下Hbase的写入比读取快的原因
(1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理。
(2) Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的数据。
(3) Hbase为null的记录不会被存储.
(4)基于的表包含rowkey,时间戳,和列族。新写入数据时,时间戳更新,同时可以查询到以前的版本.
(5) hbase是主从架构。hmaster作为主节点,hregionserver作为从节点。
02-描述Hbase的RowKey设计原则
参考链接 Hbase--RowKey设计原则
03-描述Hbase中的Scan和Get的功能以及实现的异同
HBase的查询实现只提供两种方式:
- 1、按指定RowKey 获取唯一一条记录,get方法(org.apache.hadoop.hbase.client.Get)
- Get 的方法处理分两种 : 设置了ClosestRowBefore 和没有设置的rowlock .主要是用来保证行的事务性,即每个get 是以一个row 来标记的.一个row中可以有很多family 和column.
- 2、按指定的条件获取一批记录,scan方法(org.apache.Hadoop.hbase.client.Scan)实现条件查询功能使用的就是scan 方式.
- 1)scan 可以通过setCache 与setBatch 方法提高速度(以空间换时间);
- 2)scan 可以通过setStartRow 与setEndRow 来限定范围([start,end)start 是闭区间,end 是开区间)。范围越小,性能越高。
- 3)、scan 可以通过setFilter 方法添加过滤器,这也是分页、多条件查询的基础。
04-请描述Hbase中scan对象的setCache和setBatch 方法的使用.
setCache
- 在默认情况下,如果你需要从hbase中查询数据,在获取结果ResultScanner时,hbase会在你每次调用ResultScanner.next()操作时对返回的每个Row执行一次RPC操作。即使你使用ResultScanner.next(int nbRows)时也只是在客户端循环调用RsultScanner.next()操作,你可以理解为hbase将执行查询请求以迭代器的模式设计,在执行next()操作时才会真正的执行查询操作,而对每个Row都会执行一次RPC操作。
- 因此显而易见的就会想如果我对多个Row返回查询结果才执行一次RPC调用,那么就会减少实际的通讯开销。这个就是hbase配置属性“hbase.client.scanner.caching”的由来,设置cache可以在hbase配置文件中显示静态的配置,也可以在程序动态的设置。
- cache值得设置并不是越大越好,需要做一个平衡。cache的值越大,则查询的性能就越高,但是与此同时,每一次调用next()操作都需要花费更长的时间,因为获取的数据更多并且数据量大了传输到客户端需要的时间就越长,一旦你超过了maximum heap the client process 拥有的值,就会报outofmemoryException异常。当传输rows数据到客户端的时候,如果花费时间过长,则会抛出ScannerTimeOutException异常。
setBatch
- 在cache的情况下,我们一般讨论的是相对比较小的row,那么如果一个Row特别大的时候应该怎么处理呢?要知道cache的值增加,那么在client process 占用的内存就会随着row的增大而增大。在hbase中同样为解决这种情况提供了类似的操作:Batch。可以这么理解,cache是面向行的优化处理,batch是面向列的优化处理。它用来控制每次调用next()操作时会返回多少列,比如你设置setBatch(5),那么每一个Result实例就会返回5列,如果你的列数为17的话,那么就会获得四个Result实例,分别含有5,5,5,2个列。
- 下面会以表格的形式来帮助理解,假设我们拥有10Row,每个row拥有2个family,每个family拥有10个列。(也就是说每个Row含有20列)
caching | batch | Results | RPCs | Notes |
---|---|---|---|---|
1 | 1 | 200 | 201 | 额外的一个RPC是用来判断scan是否完成 |
200 | 1 | 200 | 2 | |
2000 | 100 | 10 | 1 | 超过的部分没有用处,但是判断scan也在那一个RPC 中完成 |
2 | 100 | 10 | 6 | 10/2 +1 (额外的判断开销) |
2 | 10 | 20 | 11 | |
5 | 100 | 10 | 3 | |
5 | 20 | 10 | 3 | |
10 | 10 | 20 | 3 |
- 计算公式为:RPCs=(Rows* Cols per Row) / Min(Cols per Row, Batch size) / Scanner caching
05-请详细描述Hbase中一个Cell 的结构
- HBase 中通过row 和columns 确定的为一个存贮单元称为cell。
- Cell:由{row key, column(=
+
06-请描述如何解决Hbase中region太小和region太大带来的冲突.
- Region过大会发生多次compaction,将数据读一遍并重写一遍到hdfs 上,占用io,region过小会造成多次split,region 会下线,影响访问服务,调整hbase.hregion.max.filesize 为256m.
07-以 start-hbase.sh 为起点,Hbase 启动的流程是什么?
start-hbase.sh 的流程如下:
-
1.运行 hbase-config.sh
hbase-config.sh的作用:- 1>.装载相关配置,如HBASE_HOME目录,conf目录,regionserver机器列表,JAVA_HOME 目录等,它会调用$HBASE_HOME/conf/hbase-env.sh .
- 2>.解析参数(0.96 版本及以后才可以带唯一参数 autorestart,作用就是重启)
- 3>.调用 hbase-daemon.sh 来启动 master.
- 4>.调用 hbase-daemons.sh 来启动 regionserver zookeeper master-backup.
2.hbase-env.sh 的作用:
主要是配置 JVM 及其 GC 参数,还可以配置 log 目录及参数,配置是否需要 hbase 管理 ZK,配置进程 id 目录等.3.hbase-daemons.sh 的作用:根据需要启动的进程,
如 zookeeper,则调用 zookeepers.sh
如 regionserver,则调用 regionservers.sh
如 master-backup,则调用 master-backup.sh-
4.zookeepers.sh 的作用:
- 如果 hbase-env.sh 中的 HBASE_MANAGES_ZK"="true",那么通过ZKServerTool这个类解析xml配置文件,获取 ZK 节点列表,然后通过 SSH 向这些节点发送远程命令执行。
-
5.regionservers.sh 的作用:
- 与 zookeepers.sh 类似,通过配置文件,获取 regionserver 机器列表,然后 SSH 向这些机器发送远程命令:
-
6.master-backup.sh 的作用:
- 通过 backup-masters 这个配置文件,获取 backup-masters 机器列表,然后 SSH 向这些机器发送远程命令。
08-简述 HBASE中compact用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?
- 在hbase中每当有memstore数据flush到磁盘之后,就形成一个storefile,当storeFile的数量达到一定程度后,就需要将 storefile 文件来进行 compaction 操作。
- Compact 的作用:
- 1>.合并文件
- 2>.清除过期,多余版本的数据
- 3>.提高读写数据的效率
- HBase 中实现了两种 compaction 的方式:minor and major. 这两种 compaction 方式的区别是:
- 1、Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过期版本清理,不做任何删除数据、多版本数据的清理工作。
- 2、Major 操作是对 Region 下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。
09-Hbase宕机如何处理
- 答:宕机分为 HMaster 宕机和 HRegisoner 宕机,如果是 HRegisoner 宕机, HMaster 会将其所管理的 region 重新分布到其他活动的 RegionServer 上,由于数据和日志都持久在 HDFS中,该操作不会导致数据丢失。所以数据的一致性和安全性是有保障的。如果是 HMaster 宕机, HMaster 没有单点问题, HBase 中可以启动多个 HMaster,通过Zookeeper 的 Master Election 机制保证总有一个 Master 运行。即 ZooKeeper 会保证总会有一个 HMaster 在对外提供服务。
10-导致Hbase挂掉的场景
导致Hbase挂掉的场景
1-导致HMaster挂掉的场景
- 1.zk异常导致的master停止服务是最常见的场景,涉及操作包含但不限于以下:
- a)Zk链接超时,超时时间通过zookeeper.session.timeout配置,默认为3分钟, 如果fail.fast.expired.active.master配置的值为false(默认为false),则不会立即abort,而是会尝试恢复zk的过期session;
- b)在打开region后,需要从zk中删除opened节点,如果zk有该节点,但是删除失败;
- c)在split region过程中,从zk删除split节点时;
- d)Master节点改变时;
- e)从zk中创建unassigned节点时;
- f)在下线disabled的regoin时,从zk中删除disabled的region如果发生zk异常;
- g)还有很多操作zk的节点时如果出现异常。
- 2.在assign时,如果设置region为offlined状态,但是region之前的状态不是closed或者offlined;
- 3.在assign时,如果无法从.META.表中读取region信息;
- 4.把新的hbase集群加入到正在运行的hbase集群时,如果zk的/hbase/unassigned节点没有数据;
- 5.使用线程池批量分配region时,如果出现未被捕获的异常,实现方式如下:
- 6.在启动master的服务线程时,出现了异常;
- 7.在hdfs中检查hbase日志路径时,发现了dead的server时,需从hdfs中读出log,如果出现io异常需要检查hdfs文件系统,如果fsOk状态为true,但是通过FSUtils工具类进行检查时出现io异常;
- 8.在校验并且分配-ROOT-的region时,如果zk异常,或者其它异常(其它异常会重试10次),比如:“-ROOT- is onlined on the dead server”。
2-HRegionServer挂掉的场景
- 1.在读写hdfs时如果出现IOException异常,此时会发起hdfs的文件系统检查(checkFileSystem)1.
- 2.Regionserver的服务线程出现了未捕获异常;
- 3.在启动HRegionServer时出现异常;
- 4.在进行HLog回滚时,出现异常;
- 5.在flush memstore时,如果持久化失败,会重启RS,在重启中把hlog的内容重新加载到memstore;
- 6.出现zk异常,包括但不限于以下场景:
- a)Zk链接超时,超时时间通过zookeeper.session.timeout配置,默认为3分钟,与master不同,如果zk操作不会重试;
- b)启动HRegionServer时出现KeeperException异常;
- c)在进行split操作时,如果出现异常会进行回滚操作,在回滚过程中需要从zk中删除region的spliting状态,如果删除时出现KeeperException或者回滚的其它操作出现异常;
- d)在打开region时,出现了KeeperException异常;
- e)在进行hbase集群复制时,很多与zk交互的操作出现KeeperException异常时均会导致abort;
- 7.在close region时,如果出现异常,比如:不能成功的flush memstore;
- 8.Flush memstore时,如果HLog发现该region已经在flush则会强制终止JVM,采用的是Runtime.getRuntime().halt(1)方法,该方法不会执行正常退出的关闭钩子,从而不会flush RS的所有region,也不会迁移region,只有等待ZK的session超时后master才会发现该RS不可用,做迁移工作。
3-总结
Hbase挂掉的可能性有很多,主要由zk或者hdfs的问题导致, 因此zk、hdfs的可用对于hbase极其重要,关于zk:
- 1.zk如果停止了服务则在很多时候会导致master、rs挂掉,hbase集群基本上就失去了服务的能力,因此zk一定要是稳定可靠的,当client已经于rs建立了链接,这时zk挂掉,如果不进行split等小数与zk交互失败会导致触发rs的abort()的操作时rs还是可以提供服务的;
- 2.如果rs/master进行了长时间的gc或者改动了服务器时间,导致出现zk的session超时会导致rs/master停止服务,目前已经出现了2次因为服务器时间变化导致hbase停止服务的事故;
- 3.别轻易人为改变zk的hbase节点数据,master/rs在进行很多操作时会比较依赖zk的数据,如果发现不符合预期可能会导致master/rs停止服务,尤其是master。
- Master通过ZK知道RS是否可用,一般情况下RS在停止服务时均会正常退出,在正常退出时会从ZK中删除/hbase/rs/$regionserver的节点,Master会监听该节点的被删除,从而较快的(速度取决于所有region关闭时间)对该RS负责的region进行重新分配,如果是强制退出,比如 kill -9或者出现HRegionServer挂掉的第8条时则只有等待ZK的session超时时才会删除RS在ZK的节点(RS在ZK中添加节点时采用的是CreateMode.EPHEMERAL模式,该模式创建的节点会在session关闭时自动删除),那时Master才会进行重新assign。
- Kill RS的进程也是正常退出(不能使用kill -9强制退出),RS使用Runtime的addShutdownHook方法注册了jvm关闭钩子,在关闭钩子中会执行RS的退出逻辑,实际上hbase-daemon.sh的停止RS就是采用kill。
11-Hbase优化方法
参考连接 Hbase--优化之表设计
Hbase--优化之读性能优化
Hbase--优化之写性能优化
12-Hbase的预分区如何创建
参考连接 Hbase--基础知识点总结(扫盲篇) 中关于预分区的部分
13-Hbase导入导出方式
-
Hbase自带API
- 1)导入:bin/hbase org.apache.hadoop.hbase.mapreduce.Driver import 表名 路径
-
路径:来源
- 本地路径 file:///path
- HDFS hdfs://cluster1/path
2)导出:bin/hbase org.apache.hadoop.hbase.mapreduce.Driver export 表名 路径
-
路径:目的地
- 本地路径 file:///path
- HDFS hdfs://cluster1/path
-
通过sqoop的方式
sqoop_Hbase的api.PNG 将RDBMS中的数据抽取到HBase中
$ bin/sqoop import \
--connect jdbc:mysql://linux01:3306/db_library \
--username root \
--password 123456 \
--table book \
--columns "id,name,price" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_book" \
--num-mappers 1 \
--split-by id
sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能。解决方案:手动创建HBase表
13-HBase搭建过程中需要注意什么?
- hbase-env.sh的配置
- 是否使用外部ZooKeeper,这个一般使用Hadoop集群的ZooKeeper集群即可。
- HBASE_MANAGES_ZK=false
- hbase-site.sh的配置
- hbase.zookeeper.quorum="host1:2181,host2:2181"
14-HRegionServer宕机如何处理
- 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,如果有则进行恢复
15-JavaAPI如何操作Hbase?
- 简单说下原理吧,其通过连接的zookeeper集群,去获取相应的元数据,然后通过获取到的元数据,去对应的RegionServer去获取真实的数据;
- 对于客户端来说,其先与zookeeper打交道,然后与HMaster打交道,最后获取数据的时候,则是与HRegionServer打交道,获取真实的数据;
16-什么时候适用Hbase?
- 半结构化或非结构化数据 -- 对于数据结构字段不够确定或杂乱无章很难按一个概念去进行抽取的数据适合用HBase。当业务发展需要存储author的email,phone,address信息时RDBMS需要停机维护,而HBase支持动态增加.
- 记录非常稀疏 -- RDBMS的行有多少列是固定的,为null的列浪费了存储空间。而HBase为null的Column不会被存储,这样既节省了空间又提高了读性能。
- 多版本数据 -- 根据Row key和Column key定位到的Value可以有任意数量的版本值,因此对于需要存储变动历史记录的数据,用HBase就非常方便了。比如author的Address是会变动的,业务上一般只需要最新的值,但有时可能需要查询到历史值。
- 超大数据量 -- 当数据量越来越大,RDBMS数据库撑不住了,就出现了读写分离策略,通过一个Master专门负责写操作,多个Slave负责读操作,服务器成本倍增。随着压力增加,Master撑不住了,这时就要分库了,把关联不大的数据分开部署,一些join查询不能用了,需要借助中间层。随着数据量的进一步增加,一个表的记录越来越大,查询就变得很慢,于是又得搞分表,比如按ID取模分成多个表以减少单个表的记录数。经历过这些事的人都知道过程是多么的折腾。采用HBase就简单了,只需要加机器即可,HBase会自动水平切分扩展,跟Hadoop的无缝集成保障了其数据可靠性(HDFS)和海量数据分析的高性能(MapReduce)。
17--Hbase的一个Put过程
- Hbase的put过程就是Hbase的写流程,具体参考连接 Hbase--基础知识点总结(扫盲篇)中的写流程,不要被put吓到了。
18--Hbase的数据模型和表特点
扫盲性知识点
1-HBase数据模型
- 命名空间
- 命名空间是对表的逻辑分组,不同的命名空间类似于关系型数据库中的不同的Database数据库。利用命名空间,在多租户场景下可做到更好的资源和数据隔离。
- 表
- 对应于关系型数据库中的一张张表,HBase以“表”为单位组织数据,表由多行组成。
- 行
- 行由一个RowKey和多个列族组成,一个行有一个RowKey,用来唯一标示。
- 列族
- 每一行由若干列族组成,每个列族下可包含多个列,如上ImployeeBasicInfoCLF和DetailInfoCLF即是两个列族。列族是列共性的一些体现。注意:物理上,同一列族的数据存储在一起的。
- 列限定符
- 列由列族和列限定符唯一指定,像如上的name、age即是ImployeeBasicInfoCLF列族的列限定符。
- 单元格
- 单元格由RowKey、列族、列限定符唯一定位,单元格之中存放一个值(Value)和一个版本号。
- 时间戳
- 单元格内不同版本的值按时间倒序排列,最新的数据排在最前面;
2-HBase表特点
- 数据规模大,单表可容纳数十亿行,上百万列。
- 无模式,不像关系型数据库有严格的Scheme,每行可以有任意多的列,列可以动态增加,不同行可以有不同的列,列的类型没有限制。
- 稀疏,值为空的列不占存储空间,表可以非常稀疏,但实际存储时,能进行压缩。
- 面向列族,面向列族的存储和权限控制,支持列族独立查询。
- 数据多版本,利用时间戳来标识版本
- 数据无类型,所有数据以字节数据形式存储
19-htable API有没有线程安全问题,在程序中是单例还是多例
- 多例:当多线程去访问同一个表的时候会有。
- 可以启动多个线程去读取htable表
20-阐述HBASE filter的实现原理是什么?结合项目经验,写出几个filter应用场景。
待总结
- filter实现原理