答:1)hbase是一个分布式的,基于列式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理。java
2)hbase 适合存储半结构化或非结构化的数据,对于数据结构字段不够肯定或者杂乱无章很难按照一个概念去抽取的数据。数据库
3)hbase为null的数据不会被存储apache
4)基于的表包含rowKey,时间戳和列族,新写入数据时,时间戳更新,同时能够查询到之前的版本数组
5)hbase是主从结构,hmaster做为主节点,hregionServer做为从节点安全
使用 MapReduce Job 方式,根据 Hbase API 编写 java 脚本,将文本文件用文件流的方式截取,而后存储到多个字符串数组中,在 put 方法下,经过对表中的列族进行 for 循环遍历列名,用 if 判断列名后进行 for 循环调用 put.add 的方法对列族下每个列进行设值,每一个列族下有几个了就赋值几回!没有表先对先建立表。 服务器
答: Hbase 中的每张表都经过行键(rowkey)按照必定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理,管理哪些 HRegion由 Hmaster 分配。 HRegion 存取一个子表时,会建立一个 HRegion 对象,而后对表的每一个列族(Column Family)建立一个 store 实例,每一个 store 都会有 0 个或多个 StoreFile 与之对应,每一个 StoreFile 都会对应一个 HFile, HFile 就是实际的存储文件,所以,一个 HRegion 还拥有一个 MemStore 实例。 session
答案:共同点: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计算框架。
答:实时查询,能够认为是从内存中查询,通常响应时间在 1 秒内。 HBase 的机制是数据先写入到内存中,当数据量达到必定的量(如 128M),再写入磁盘中, 在内存中,是不进行数据的更新或合并操做的,只增长数据,这使得用户的写操做只要进入内存中就能够当即返回,保证了 HBase I/O 的高性能。
答: rowKey 最好要建立有规则的 rowKey,即最好是有序的。 HBase 中一张表最好只建立一到两个列族比较好,由于 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 能够经过 setCaching 与 setBatch 方法提升速度(以空间换时间); 2)scan 能够经过 setStartRow 与 setEndRow 来限定范围([start, end]start 是闭区间, end 是开区间)。范围越小,性能越高。3)scan 能够经过 setFilter 方法添加过滤器,这也是分页、多条件查询的基础。
3.全表扫描,即直接扫描整张表中全部行记录
HBase 中经过 row 和 columns 肯定的为一个存贮单元称为 cell。Cell:由{row key, column(=<family> + <label>), version}是惟一肯定的单元 cell中的数据是没有类型的,所有是字节码形式存贮
在默认状况下,若是你须要从hbase中查询数据,在获取结果ResultScanner时,hbase会在你每次调用ResultScanner.next()操做时对返回的每一个Row执行一次RPC操做。即便你使用ResultScanner.next(int nbRows)时也只是在客户端循环调用RsultScanner.next()操做,你能够理解为hbase将执行查询请求以迭代器的模式设计,在执行next()操做时才会真正的执行查询操做,而对每一个Row都会执行一次RPC操做。
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 |
在 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过滤出某个用户的全部订单
答:宕机分为 HMaster 宕机和 HRegisoner 宕机,若是是 HRegisoner 宕机, HMaster 会将其所管理的 region 从新分布到其余活动的 RegionServer 上,因为数据和日志都持久在 HDFS中,该操做不会致使数据丢失。因此数据的一致性和安全性是有保障的。若是是 HMaster 宕机, HMaster 没有单点问题, HBase 中能够启动多个 HMaster,经过Zookeeper 的 Master Election 机制保证总有一个 Master 运行。即 ZooKeeper 会保证总会有一个 HMaster 在对外提供服务。
致使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。