HBase面试题

hbase 的特点是什么

(1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理。

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

(3) Hbase为null的记录不会被存储.

(4)基于的表包含rowkey,时间戳,和列族。新写入数据时,时间戳更新,同时可以查询到以前的版本.

(5) hbase是主从架构。hmaster作为主节点,hregionserver作为从节点。

Hbase和hive 有什么区别

Hive和Hbase是两种基于Hadoop的不同技术--Hive是一种类SQL 的引擎,并且运行MapReduce 任务,Hbase 是一种在Hadoop之上的NoSQL的Key/vale数据库。当然,这两种工具是可以同时使用的。就像用Google 来搜索,用FaceBook 进行社交一样,Hive 可以用来进行统计查询,HBase 可以用来进行实时查询,数据也可以从Hive 写到Hbase,设置再从Hbase 写回Hive。

Hive是一个构建在Hadoop 基础之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS 上的数据。

HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive 不能够进行交互查询,因为它只能够在Haoop上批量的执行Hadoop。

Hive 被分区为表格,表格又被进一步分割为列簇。列簇必须使用schema 定义,列簇将某一类型列集合起来(列不要求schema定义)。

限制 :

Hive 目前不支持更新操作。

另外,由于hive在hadoop上运行批量操作,它需要花费很长的时间,通常是几分钟到几个小时才可以获取到查询的结果。

Hive 适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。

Hive 不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。

HBase 查询是通过特定的语言来编写的,这种语言需要重新学习。类SQL 的功能可以通过Apache Phonenix 实现,但这是以必须提供schema 为代价的。另外,Hbase 也并不是兼容所有的ACID 特性,虽然它支持某些特性。最后但不是最重要的--为了运行Hbase,Zookeeper是必须的,zookeeper 是一个用来进行分布式协调的服务,这些服务包括配置服务,维护元信息和命名空间服务。

Hbase非常适合用来进行大数据的实时查询。Facebook用Hbase 进行消息和实时的分析。它也可以用来统计Facebook的连接数。

HBase 是一种Key/Value 系统,它运行在HDFS 之上。和Hive 不一样,Hbase 的能够在

它的数据库上实时运行,而不是运行MapReduce 任务。

参考网址:http://www.cnblogs.com/justinzhang/p/4273470.html

|

描述Hbase的rowKey的设计原则.

Rowkey长度原则

Rowkey 是一个二进制码流,Rowkey 的长度被很多开发者建议说设计在10~100 个字节,

不过建议是越短越好,不要超过16 个字节。

原因如下:

(1)数据的持久化文件HFile 中是按照KeyValue 存储的,如果Rowkey 过长比如100 个

字节,1000 万列数据光Rowkey 就要占用100*1000 万=10 亿个字节,将近1G 数据,这会极

大影响HFile 的存储效率;

(2)MemStore 将缓存部分数据到内存,如果Rowkey 字段过长内存的有效利用率会降

低,系统将无法缓存更多的数据,这会降低检索效率。因此Rowkey 的字节长度越短越好。

(3)目前操作系统是都是64 位系统,内存8 字节对齐。控制在16 个字节,8 字节的

整数倍利用操作系统的最佳特性。

Rowkey散列原则

如果Rowkey 是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将Rowkey

的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个

Regionserver 实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息将产生所有

新数据都在一个 RegionServer 上堆积的热点现象,这样在做数据检索的时候负载将会集中

在个别RegionServer,降低查询效率。

Rowkey唯一原则

必须在设计上保证其唯一性。

描述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 可以通过setCaching 与setBatch 方法提高速度(以空间换时间);

2)scan 可以通过setStartRow 与setEndRow 来限定范围([start,end)start 是闭区间,

end 是开区间)。范围越小,性能越高。

3)、scan 可以通过setFilter 方法添加过滤器,这也是分页、多条件查询的基础。

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

为设置获取记录的列个数,默认无限制,也就是返回所有的列.每次从服务器端读取的行数,默认为配置文件中设置的值.

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

HBase 中通过row 和columns 确定的为一个存贮单元称为cell。

Cell:由{row key, column(= +

据是没有类型的,全部是字节码形式存贮。

请描述如何解决Hbase中region太小和region太大带来的冲突.

Region过大会发生多次compaction,将数据读一遍并重写一遍到hdfs 上,占用io,region过小会造成多次split,region 会下线,影响访问服务,调整hbase.hregion.max.filesize 为256m.

以 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 向这些机器发送远程命令。

简述 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执行合并操作,最终的结果是整理合并出一个文件。

HBase的架构和基本原理

Hbase以表的方式组织数据,

表由行(Row)以及列(Column)组成,行由row key和一个或多个列及其值组成(存储是按照row key的字典顺序排序,row key的设计非常重要!!),

列必须属于某一列族(Column family),一个列族可以有一各或多个列(一列由列簇和列修饰符组成,他们通常由冒号(:) 分隔),其在存储架构中就是一个Hfile。

Hbase中的列可以达到百万级,列中的数据可以是稀疏的,空值并不占用存储空间。

数据按主键排序,同时表按主键划分为多个Region。底层是LSM树(Long-Structed Merge Tree)。

对于以上叙述,表的简略结构:(逻辑模型)

注1:建议把Hbase理解为一个多维Map

Hbase简略架构图如下:

接下来对Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等做个简单叙述:

Zookeeper

  • 保证任何时候,集群中只有一个master(负责多HMaster的选举)
  • 存贮所有Region的寻址入口
  • 实时监控RegionServer的状态、将RegionServer的上线和下线信息实时通知给Master(服务器之间状态同步)
  • 存储Hbase的schema(元数据信息)。包括有哪些table、每个table有哪些column family等

HMaster

(主要负责table和region的管理工作)

  • Region分裂后,为RegionServer分配新的Region
  • 负责RegionServer的负载均衡,调整region的分配
  • 发现失效的region server并重新分配其上的region

(Region自动切分是HBase能够拥有良好扩张性的最重要因素之一,见转载文章:http://developer.51cto.com/art/201708/549419.htm)

  • 管理用户对table的增、删、改、查操作
  • 监听zk,基于zookeeper感应rs的上下线
  • 监听zk,基于zookeeper来保证HA
  • 处理schema更新请求 (管理用户对表的增删修改)
  • 不参与对表的读写访问
  • 负载很低
  • 无SPOF(单点故障)
  • 在一个RegionServer死机后,负责失效节点的Region的迁移

HRegionServer

(主要负责响应用户对其上region的I/O请求,向HDFS读写数据,HbasHBase核心模块)

  • HRegionSserver维护Master分配给它的region
  • 维护region的cache
  • 处理region的flush、compact、split
  • 内部管理一系列的HRegion对象
  • 一个HRegionServer会有多个HRegion和一个HLog。

Region

(图中为Hregion,也就是指一个Table的分区)

  • 每一个HRegion又由很多的Store组成,每一个Store存储的实际上是一个列簇(ColumnFamily)下所有的数据。此外,在每一个Store(又名HStore)中有包含一块MemStore。MemStore驻留在内存中,数据到来时首先更新到MemStore中,当到达阈值之后再flush(默认64M)到对应的StoreFile(又名HFile)中,所以每一个Store包含多个StoreFile,StoreFile负责的是实际数据存储,为HBase中最小的存储单元。
  • 达到某个阈值时,分裂(默认256M)。所以一个HRegionServer管理多个表,一个表下有多个Region,一个HRegion有多少个列族就有多少个Store,Store下有多个StoreFile文件,是HBase中最小的存储单元
  • 以Region为单位管理, region(startKey,endKey);【默认情况下,刚创建一个表时,并不知道startkey和endkey】
  • 每个Column Family单独存储:storeFile;( storefile的数量一多(到达阀值),就合并(同时合并版本以及删除之前要删除的数据);合并后大小到达阀值就split)
  • 当某个Column Family累积的大小(具体的数据量) > 某阈值时,自动分裂成两个Region;合并之后,旧数据也不是立即删除,而是复制一份并同内存中的数据一起写到磁盘,在之后,LSM-Tree会提供一些机制来回收这些空间。[4]
  • 如何找到某行属于哪个region呢?两张特殊的表:

-NAMESPACE- 和.META.

StoreFile

(底层存储格式是HFile,HBase中最小的存储单元)

memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。

HFile[1]

(HFile基于Hadoop的TFile类实现,模仿Google的BIgTable论文中的SSTable格式。)

  • HBase中KeyValue数据的存储格式,是hadoop的二进制格式文件。
  • HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。
  • Trailer中有指针指向其他数据块的起始点,FileInfo记录了文件的一些meta信息。 - Data Block是hbase io的基本单元,为了提高效率,HRegionServer中有基于LRU的block cache机制。
  • 每个Data块的大小可以在创建一个Table的时候通过参数指定(默认块大小64KB),大号的Block有利于顺序Scan,小号的Block利于随机查询。
  • 每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成
  • Magic内容就是一些随机数字,目的是防止数据损坏

HLog(WAL log)

(HLog是WAL的核心实现类)

  • WAL意为write ahead log,HBase中的预写日志,用来做灾难恢复使用,底层实现是HLog,HLog记录数据的所有变更。使用WAL的原因:因为MemStore存储的数据是驻留在内存中的,是不稳定的(比如宕机时),所以采用了WAL预写日志来解决这个问题。(运行MApReduce作业时,可以通过关闭WAL功能来获得性能的提升——setWriteToWAL(boolean))
  • 其实HLog文件就是一个普通的Hadoop Sequence File, Sequence File的value是key时HLogKey对象,其中记录了写入数据的归属信息,除了table和region名字外,还同时包括sequence number和timestamp,timestamp是写入时间,sequence number的起始值为0,或者是最近一次存入文件系统中的sequence number。 Sequence File的value是HBase的KeyValue对象,即对应HFile中的KeyValue。[1]

HBase与传统关系型数据库(如MySQL)的区别

  • 数据类型:没有数据类型,都是字节数组(有一个工具类Bytes,将java对象序列化为字节数组)。
  • 数据操作:HBase只有很简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系,而传统数据库通常有各式各样的函数和连接操作。
  • 存储模式:Hbase适合于非结构化数据存储,基于列存储而不是行。
  • 数据维护:HBase的更新操作不应该叫更新,它实际上是插入了新的数据,而传统数据库是替换修改
  • 时间版本:Hbase数据写入cell时,还会附带时间戳,默认为数据写入时RegionServer的时间,但是也可以指定一个不同的时间。数据可以有多个版本。
  • 可伸缩性,Hbase这类分布式数据库就是为了这个目的而开发出来的,所以它能够轻松增加或减少硬件的数量,并且对错误的兼容性比较高。而传统数据库通常需要增加中间层才能实现类似的功能
  • [3]
  1. 读写性能对比(读快还是写快)

4.Hbase的设计有什么心得?

5.Hbase的操作是用的什么API还是什么工具?

6.你们hbase里面是存一些什么数据

7.知道spark怎么读hbase吗?

8.做过hbase的二级索引吗?

9.Hbase的PUT的一个过程

以下是我自己想的问题

1.描述一下Region切分的过程?

HBase原理–所有Region切分的细节都在这里了

2.Hbase读取数据的流程?

HBase读写流程

3.HBase的缺点?(优点已经在4中体现)

  • 单一RowKey固有的局限性决定了它不可能有效地支持多条件查询[2]
  • 不适合于大范围扫描查询
  • 不直接支持 SQL 的语句查询

4.什么时候适合使用HBase(应用场景)

  • 半结构化或非结构化数据:

对于数据结构字段不够确定或杂乱无章非常难按一个概念去进行抽取的数据适合用HBase,因为HBase支持动态添加列。

  • 记录很稀疏:

RDBMS的行有多少列是固定的。为null的列浪费了存储空间。而如上文提到的,HBase为null的Column不会被存储,这样既节省了空间又提高了读性能。

  • 多版本号数据:

依据Row key和Column key定位到的Value能够有随意数量的版本号值,因此对于须要存储变动历史记录的数据,用HBase是很方便的。比方某个用户的Address变更,用户的Address变更记录也许也是具有研究意义的。

  • 仅要求最终一致性:

对于数据存储事务的要求不像金融行业和财务系统这么高,只要保证最终一致性就行。(比如HBase+elasticsearch时,可能出现数据不一致)

  • 高可用和海量数据以及很大的瞬间写入量:

WAL解决高可用,支持PB级数据,put性能高

  • 索引插入比查询操作更频繁的情况。比如,对于历史记录表和日志文件。(HBase的写操作更加高效)
  • 业务场景简单:

不需要太多的关系型数据库特性,列入交叉列,交叉表,事务,连接等。

2018/3/12增

5.Client会缓存.META.的数据,该数据更新了怎么办?

(参考自[5])

其实,Client的元数据缓存不更新,当.META.的数据发生更新。比如因为region重新均衡,某个Region的位置发生了变化,Client再次根据缓存去访问的时候,会出现错误,当出现异常达到最大重试次数后,client就会重新去.META.所在的RegionServer获取最新的Region信息,如果.META.所在的RegionServer也变了,Client就会重新去ZK上获取.META.所在的RegionServer的最新地址。

注1:对应上文的表结构的多维度Map映射表形式理解

你可能感兴趣的:(HBase面试题)