hbase面试题

1.hbase的特色是什么?

 答:1)hbase是一个分布式的,基于列式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理。java

     2)hbase 适合存储半结构化或非结构化的数据,对于数据结构字段不够肯定或者杂乱无章很难按照一个概念去抽取的数据。数据库

     3)hbase为null的数据不会被存储apache

   4)基于的表包含rowKey,时间戳和列族,新写入数据时,时间戳更新,同时能够查询到之前的版本数组

   5)hbase是主从结构,hmaster做为主节点,hregionServer做为从节点安全

2.hbase如何导入数据?

  使用 MapReduce Job 方式,根据 Hbase API 编写 java 脚本,将文本文件用文件流的方式截取,而后存储到多个字符串数组中,在 put 方法下,经过对表中的列族进行 for 循环遍历列名,用 if 判断列名后进行 for 循环调用 put.add 的方法对列族下每个列进行设值,每一个列族下有几个了就赋值几回!没有表先对先建立表。 服务器

 3.hbase 的存储结构?   

  答: Hbase 中的每张表都经过行键(rowkey)按照必定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理,管理哪些 HRegion由 Hmaster 分配。 HRegion 存取一个子表时,会建立一个 HRegion 对象,而后对表的每一个列族(Column Family)建立一个 store 实例,每一个 store 都会有 0 个或多个 StoreFile 与之对应,每一个 StoreFile 都会对应一个 HFile, HFile 就是实际的存储文件,所以,一个 HRegion 还拥有一个 MemStore 实例。 session

4.Hbase hive 有什么区别hive hbase 的底层存储是什么?hive是产生的缘由是什么habase是为了弥补hadoop的什么缺陷?

答案:共同点:1.hbase与hive都是架构在hadoop之上的。都是用hadoop做为底层存储数据结构

   区别:2.Hive是创建在Hadoop之上为了减小MapReducejobs编写工做的批处理系统,HBase是为了支持弥补Hadoop对实时操做的缺陷的项目 。架构

      3.想象你在操做RMDB数据库,若是是全表扫描,就用Hive+Hadoop,若是是索引访问,就用HBase+Hadoop 。框架

      4.Hive query就是MapReduce jobs能够从5分钟到数小时不止,HBase是很是高效的,确定比Hive高效的多。

      5.Hive自己不存储和计算数据,它彻底依赖于HDFS和MapReduce,Hive中的表纯逻辑。

      6.hive借用hadoop的MapReduce来完成一些hive中的命令的执行

      7.hbase是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎经过它来存储索引,方便查询操做。

      8.hbase是列存储。

      9.hdfs做为底层存储,hdfs是存放文件的系统,而Hbase负责组织文件。

      10.hive须要用到hdfs存储文件,须要用到MapReduce计算框架。

 

5.解释下 hbase 实时查询的原理

  答:实时查询,能够认为是从内存中查询,通常响应时间在 1 秒内。 HBase 的机制是数据先写入到内存中,当数据量达到必定的量(如 128M),再写入磁盘中, 在内存中,是不进行数据的更新或合并操做的,只增长数据,这使得用户的写操做只要进入内存中就能够当即返回,保证了 HBase I/O 的高性能。 

 6.列簇怎么建立比较好?(<=2)

答: rowKey 最好要建立有规则的 rowKey,即最好是有序的。 HBase 中一张表最好只建立一到两个列族比较好,由于 HBase 不能很好的处理多个列族。

 7.描述 Hbase 中 scan 和 get 的功能以及实现的异同.

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 能够经过 setCaching 与 setBatch 方法提升速度(以空间换时间); 2)scan 能够经过 setStartRow 与 setEndRow 来限定范围([start, end]start 是闭区间, end 是开区间)。范围越小,性能越高。3)scan 能够经过 setFilter 方法添加过滤器,这也是分页、多条件查询的基础。

3.全表扫描,即直接扫描整张表中全部行记录 

8.请详细描述 Hbase 中一个 Cell 的结构

HBase 中经过 row 和 columns 肯定的为一个存贮单元称为 cell。Cell:由{row key, column(=<family> + <label>), version}是惟一肯定的单元 cell中的数据是没有类型的,所有是字节码形式存贮 

 

9.请描述 Hbase 中 scan 对象的 setCache 和 setBatch 方法的使用. 

cache:

 在默认状况下,若是你须要从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异常。
 
batch
     在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
 
上图引用自hbase权威指南,是用来表示一个RPC call的构成。

10.简述 HBASE 中 compact 用途是什么,何时触发,分为哪两种,有什么区别,有哪些相关配置参数?

  在 hbase 中每当有 memstore 数据 flush 到磁盘以后,就造成一个 storefile,当 storeFile 的数量达到必定程度后,就须要将 storefile 文件来进行 compaction 操做。

  Compact 的做用:

          1>.合并文件

          2>.清除过时,多余版本的数据

          3>.提升读写数据的效率

  HBase 中实现了两种 compaction 的方式:

  minor and major. 这两种 compaction 方式的区别是:

    一、 Minor 操做只用来作部分文件的合并操做以及包括 minVersion=0 而且设置 ttl 的过时版本清理,不作任何删除数据、多版本数据的清理工做。

    二、 Major 操做是对 Region 下的 HStore 下的全部 StoreFile 执行合并操做,最终的结果是整理合并出一个文件。简述 Hbase filter 的实现原理是什么?结合实际项目经验,写出几个使用 filter 的场景HBase 为筛选数据提供了一组过滤器,经过这个过滤器能够在 HBase 中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操做,也就是说过滤器最终可以筛选的数据可以细化到具体的一个存储单元格上(由行键,列名,时间戳定位)。 RowFilter、 PrefixFilter。。。hbase的filter是经过scan设置的,因此是基于scan的查询结果进行过滤.过滤器的类型不少,可是能够分为两大类——比较过滤器,专用过滤器过滤器的做用是在服务端判断数据是否知足条件,而后只将知足条件的数据返回给客户端;如在进行订单开发的时候,咱们使用rowkeyfilter过滤出某个用户的全部订单

 11. Hbase 内部是什么机制

  在 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 可能没法恢复数据,没有刷写到硬盘的全部写入数据都会丢失。 

12.HBase 宕机如何处理

答:宕机分为 HMaster 宕机和 HRegisoner 宕机,若是是 HRegisoner 宕机, HMaster 会将其所管理的 region 从新分布到其余活动的 RegionServer 上,因为数据和日志都持久在 HDFS中,该操做不会致使数据丢失。因此数据的一致性和安全性是有保障的。若是是 HMaster 宕机, HMaster 没有单点问题, HBase 中能够启动多个 HMaster,经过Zookeeper Master Election 机制保证总有一个 Master 运行。即 ZooKeeper 会保证总会有一个 HMaster 在对外提供服务。

 13.致使Hbase挂掉的场景

致使Hbase挂掉的场景HMasterHMaster会出现异常(执行abort())中止的场景以下: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”。 HRegionServerHRegionServer会出现异常中止(执行abort())服务的场景以下: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不可用,作迁移工做。总结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。

相关文章
相关标签/搜索