精华内容
下载资源
问答
  • Hbase面试题

    2019-08-23 15:29:22
    Hbase面试题 Hbase架构 Hbase的NULL占用空间吗? B (Hbase是基于列的 , 所以是不占用空间的) A . 占用 B . 不占 下面对 HBase 的描述哪些是正确的?( ) HBase 依赖()提供消息通信机制? Hbase 的持久化...

    Hbase面试题

    1. Hbase架构 在这里插入图片描述

    2. Hbase的NULL占用空间吗? B (Hbase是基于列的 , 所以是不占用空间的)

      A . 占用
      B . 不占

    3. 下面对 HBase 的描述哪些是正确的?( )

      在这里插入图片描述

    4. HBase 依赖()提供消息通信机制?
      在这里插入图片描述

    5. Hbase 的持久化数据是存放在 HDFS 上的,并由 zookeeper 协助进行集群管理,这一说法是()在这里插入图片描述

    6. HBase 中 的 一 个 表 是 被 划 分 为 很 多 regionserver 的 , 这 些regionserver 分布式地存放在服务器上,这一说法是()在这里插入图片描述

    7. HBase 可以通过 compact 命令操作来做版本间的文件合并,这一说法是的()
      在这里插入图片描述

    8. HBase 表中的主键是哪个?()
      在这里插入图片描述

    9. Hbase 为支持多种语言访问需要启动哪个进程( )

      在这里插入图片描述

    10. HBase 与 Redis 比较?

      HBase 和 Redis 都是基于 Key、Value 的数据库。
      区别在于 HBase 是基于文件系统的,Redis 是基于内存的。
      主要区别在于性能和数据量的支持上。如果超过 TB,可以采用 HBase。低于 TB 的,可以采用 Redis。

    11. hbase内部机制是什么? 及各个组件的作用 ?

      Hbase是一个按列存储分布式实时读写数据库 , 主要用来存储非结构化数据或半结构化的松散数据
      物理存储: hbase的持久数据放在HDFS上
      存储管理: 一个表是划分为很多region的,这些region分布式地存放在很多regionserver上
      Region内部还可以划分为store,store内部有memstore和storefile
      版本管理: hbase中的数据更新本质上是不断追加新的版本,通过compact操作来做版本间的文件合并
      Zookeeper: 进行协调服务

      1.保证任何时候,集群中只有一个master
      2.存贮所有Region的寻址入口
      3.实时监控Region server的上线和下线信息。并实时通知Master
      4.存储HBase表相关元数据

      Client:

      1.提供hbase的客户端请求并且维护客户端缓存

      Master:

      1.分配region给Region server
      2.发现失效的Region server并重新分配其上的region
      3.管理用户对table的增删改操作

      RegionServer:

      1.Region server维护region,处理对这些region的IO请求
      2.Region server负责切分在运行过程中变得过大的region

      Region:

      1.Region相当于表的概念 , 当创建一张表时,会对应一个region , region变大会进行裂变 , 就分布在不同的region server上
      每个region存储一段连续的数据

      Store:
      相当于列族的概念

      memstore:

      1.写缓存 , 写数据的时候会先写入menstore中 (先写Hlog)
      2.分担了一部分读压力 , 客户端检索数据现在men store找, 找不到在到storefile找, 从而缓解一部分读缓存

      Storefile:

      实际存储数据的文件 , 保存在HDFS上

      Block cache:

      读缓存,每次查询到结果后会缓存在blockcahce中,方便下一次查询

    12. Hbase的rowKey怎么创建比较好?

      (1)rowKey最好要创建有规则的rowKey,即最好是有序的,经常需要批量读取的数据应该让他们的rowkey连续;
      (2)将经常需要作为条件查询的维度组织到rowkey中;
      (3)Rowkey尽量短,Rowkey设置唯一
      (4)rowkey尽可能散列,时间维度不要放首位,可以再rowkey前面加个随机数,首字段直接是时间信息,所有的数据都会集中在一个RegionServer上

    13. 列簇怎么创建比较好?

      (1)按照业务特点,把数据归类,不同类别的放在不同列族
      (2)一张表最好只创建1-2列族 , 因为hbase不能很好的处理多个列族

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

      (1)HBase 中通过rowkey , 列簇 和 时间戳 确定一个单元格 , cell中的数据是没有类型的,全部是字节码形式存储

    15. scan 和 get 的功能以及实现的异同 ?

      (1)get按指定RowKey 获取唯一一条记录
      (2)scan按指定的条件获取一批记录

    16. HBase宕机如何处理 ?

      宕机分为HMaster宕机和RegionServer宕机

      如果是RegionServer宕机,HMaster会将其所管理的region重新分布到其他活动的RegionServer上,由于数据和日志都持久在HDFS中,该操作不会导致数据丢失。所以数据的一致性和安全性是有保障的。

      如果是HMaster宕机,HMaster没有单点问题,HBase中可以 启动多个HMaster,通过Zookeeper保证总有一个Master运行。即ZooKeeper会保证总会有一个HMaster在对外提供服务。

    17. Hbase热点问题 ?

      原因 : 各个region之间的数据分布不均匀 , 连续的rowkey热点数据集中在region中
      第一种:hash+预分区
      提前设置多个region , 在rowkey前面加上个随机数 , 这样就可以将一段连续的热点数据分散到不同得 region中。 -->这样缺点 , 导致读的时候 , 效率会下降!
      第二种:rowkey的ID或则时间hash取模region数量加在rowkey的前缀 +预分区
      第三种:反转rowkey -->牺牲了rowkey的有序性

    18. 删除机制 ?

      HBase 的删除操作并不会立即将数据从磁盘上删除,这主要是因为 HBase 的数据通常被保存在 HDFS 之中,而 HDFS 只允许新增或者追加数据文件,所以删除操作HBase 新插入一条数据,但是key 类型Delete , 标记这条数据被删除 , 直到Major_compact操作时,数据才会被真正的从磁盘上删除
      更新 : 插入一条新的数据 ,rowkey不变, 时间戳是最新的 , hbase读取数据的时候, 会读取最新时间戳的数据

    19. Hbase的读写机制 ?

      读请求
      1.客户端向zookeeper发送读请求 (zk存着region的寻址入口) ,查询到哪台RegionServer上有hbase:meta表
      2.通过hbase:meta表找到对应的region后 , 再根据region找到对应的region server ( region server负责处理对region io请求 )
      3.从 block cache中查找数据 , 如果没有 ,menstore中查找 , 再没有 , 就从storeFile查找
      4.找到之后 , 先存到block cache中 , 再将结果返回客户端

      写请求
      1.客户端向zookeeper发送写请求 (zk存着region的寻址入口)
      2.找到对应的region后 , 再根据region找到对应的region server ( region server负责处理对region io请求 )
      3.region server将数据先写入 hlog 中。后写入 memstore 中。
      4.memstore数据到阈值 64M 的时候,溢写到磁盘 , 同时删除内存和 hlog中的历史数据。
      5.将硬盘数据通过 HFile 来序列化,再将数据传输到 HDFS 进行存储。
      6.溢写如果小文件过多,可以将小文件进行合并 , 合并方式有minor 和major两种
      7.Region过大的话 , 会进行裂变 , 将regoin切分后分布在不同的region server上

    20. minor compact 和major compact ?

      hbase为了防止小文件过多,以保证查询效率,会在必要的时候将这些小的store file合并成相对较大的store file,这个过程就称之为compact。在hbase中,主要存在两种类型的compact:minor compact和major compact。
      区别 : Minor compact只是进行部分文件合并操作,而Major compact 会对 Region 下的所有StoreFile执行合并操作 , 还会将标记成delete的数据从磁盘中删除。
      Minor compact占用少量资源 , Major compact 会占用大量资源

    21. Hase大的文件要split , 小的文件要compact ?

      文件越大 ,HFile中搜索的指定rowkey的数据花的时间也就越长 , 效率低
      文件太小 ,小文件打开多了更耗时

    22. storeFile裂变过程 ?

      向 zookeeper 发出请求,停止数据的写入请求
      将存储的数据进行等分,通过 zookeeper 通信获取对应的空闲存储目录,进行数据移动,以及更新对应的元数据
      移动以及更新结束,通知 zookeeper,恢复正常功能

    23. 请描述如何 Hbase 中设置的 region 太小和 region 太大带来的冲突 ?

      设置Region 太大会发生多次 compact,,将数据读一遍并重写一遍到 hdfs 上,占用 io,设置region
      太小会造成多次 split,region 会下线,影响访问服务,调整 hbase.hregion.max.filesize 为 256m
      解析 : 设置region过大 , region就需要多次conpact合并之后才能达到指定大小
      设置region过小 , region有很多的裂变 , split

    24. hbase 的调优?

      表优化
      1)预先分区
      2)Rowkey设计
      a.唯一性
      b.越短越好
      c.经常查询的字段可以加到rowkey中
      d.Rowkey尽可能散列
      e.Rowkey可以设置有序
      3)列族设计不要超过3个
      4)设置读缓存
      5)设置表的数据最大版本数 (设置数据的生命周期)
      写表优化 :
      多线程写 , 多个Htable写表 , 还可以设置写缓存大小
      读表优化 :
      多线程写 , 多个Htable读表 , 还可以设置读缓存大小

    25. 未完待续 . . .

    展开全文
  • HBase面试题

    万次阅读 多人点赞 2019-04-04 22:05:34
    0.Hbase是什么? (1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理。 (2) Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的...

    0.Hbase是什么?

    (1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理。
    (2) Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的数据。
    (3) Hbase为null的记录不会被存储.
    (4)基于的表包含rowkey,时间戳,和列族。新写入数据时,时间戳更新,同时可以查询到以前的版本.
    (5) hbase是主从架构。hmaster作为主节点,hregionserver作为从节点。
    --------------------- 

    1. HBase 的特点是什么?

    1)大:一个表可以有数十亿行,上百万列;
    2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一
    张表中不同的行可以有截然不同的列;
    3)面向列:面向列(族)的存储和权限控制,列(族)独立检索;
    4)稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;
    5)数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元
    格插入时的时间戳;
    6)数据类型单一:Hbase 中的数据都是字符串,没有类型。

    2.HBase 和 Hive 的区别?

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

    3.HBase 适用于怎样的情景?

    ① 半结构化或非结构化数据

    ② 记录非常稀疏

    ③ 多版本数据

    ④ 超大数据量

     4. 描述 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 唯一原则
    必须在设计上保证其唯一性。 

    5.描述 HBase 中 scan 和 get 的功能以及实现的异同?

     HBase 的查询实现只提供两种方式:
    1)按指定 RowKey 获取唯一一条记录,get 方法(org.apache.hadoop.hbase.client.Get)Get 的方法处理分两种 : 设置了 ClosestRowBefore 和没有设置 ClosestRowBefore 的rowlock。主要是用来保证行的事务性,即每个 get 是以一个 row 来标记的。一个 row 中可以有很多 family 和 column。
    2)按指定的条件获取一批记录,scan 方法(org.apache.Hadoop.hbase.client.Scan)实现条件查询功能使用的就是 scan 方式。
     

    6.请详细描述 HBase 中一个 cell 的结构?

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

    7. 简述 HBase 中 compact 用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?(☆☆☆☆☆) 

    在 hbase 中每当有 memstore 数据 flush 到磁盘之后,就形成一个 storefile,当 storeFile的数量达到一定程度后,就需要将 storefile 文件来进行 compaction 操作。
    Compact 的作用:
    ① 合并文件
    ② 清除过期,多余版本的数据
    ③ 提高读写数据的效率
    HBase 中实现了两种 compaction 的方式:minor and major. 这两种 compaction 方式的
    区别是:
    1、Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过
    期版本清理,不做任何删除数据、多版本数据的清理工作。
    2、Major 操作是对 Region 下的 HStore 下的所有 StoreFile 执行合并操作,最终的结果
    是整理合并出一个文件。 

    8.HBase 优化?

    (1)高可用
    在 HBase 中 Hmaster 负责监控 RegionServer 的生命周期,均衡 RegionServer 的负载,如果 Hmaster 挂掉了,那么整个 HBase 集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以 HBase 支持对 Hmaster 的高可用配置。 

    (2)预分区
    每一个 region 维护着 startRow 与 endRowKey,如果加入的数据符合某个 region 维护的rowKey 范围,则该数据交给这个 region 维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高 HBase 性能 .

    (3)RowKey 设计
    一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于哪个一个预分区的区间内,设计 rowkey 的主要目的 ,就是让数据均匀的分布于所有的 region中,在一定程度上防止数据倾斜。接下来我们就谈一谈 rowkey 常用的设计方案 

    (4)7.4 内存优化
    HBase 操作过程中需要大量的内存开销,毕竟 Table 是可以缓存在内存中的,一般会分配整个可用内存的 70%给 HBase 的 Java 堆。但是不建议分配非常大的堆内存,因为 GC 过程持续太久会导致 RegionServer 处于长期不可用状态,一般 16~48G 内存就可以了,如果因为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。

    (5)基础优化 

    9.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 临界值。 

    10. 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,如果有则进行恢复。 

    11.HBase 读写流程?(☆☆☆☆☆) 

    读:
    ① HRegionServer 保存着 meta 表以及表数据,要访问表数据,首先 Client 先去访问zookeeper,从 zookeeper 里面获取 meta 表所在的位置信息,即找到这个 meta 表在哪个HRegionServer 上保存着。
    ② 接着 Client 通过刚才获取到的 HRegionServer 的 IP 来访问 Meta 表所在的HRegionServer,从而读取到 Meta,进而获取到 Meta 表中存放的元数据。
    ③ Client 通过元数据中存储的信息,访问对应的 HRegionServer,然后扫描所在HRegionServer 的 Memstore 和 Storefile 来查询数据。
    ④ 最后 HRegionServer 把查询到的数据响应给 Client。


    写:
    ① Client 先访问 zookeeper,找到 Meta 表,并获取 Meta 表元数据。
    ② 确定当前将要写入的数据所对应的 HRegion 和 HRegionServer 服务器。
    ③ Client 向该 HRegionServer 服务器发起写入数据请求,然后 HRegionServer 收到请求
    并响应。 

    ④ Client 先把数据写入到 HLog,以防止数据丢失。
    ⑤ 然后将数据写入到 Memstore。
    ⑥ 如果 HLog 和 Memstore 均写入成功,则这条数据写入成功
    ⑦ 如果 Memstore 达到阈值,会把 Memstore 中的数据 flush 到 Storefile 中。
    ⑧ 当 Storefile 越来越多,会触发 Compact 合并操作,把过多的 Storefile 合并成一个大
    的 Storefile。
    ⑨ 当 Storefile 越来越大,Region 也会越来越大,达到阈值后,会触发 Split 操作,将
    Region 一分为二。

    12.HBase 内部机制是什么?

    Hbase 是一个能适应联机业务的数据库系统物理存储:hbase 的持久化数据是将数据存储在 HDFS 上。
    存储管理:一个表是划分为很多 region 的,这些 region 分布式地存放在很多 regionserver上 Region 内部还可以划分为 store,store 内部有 memstore 和 storefile。
    版本管理:hbase 中的数据更新本质上是不断追加新的版本,通过 compact 操作来做版本间的文件合并 Region 的 split。
    集群管理:ZooKeeper + HMaster + HRegionServer。

    13. HBase 在进行模型设计时重点在什么地方?一张表中定义多少个 Column Family 最合适?为什么? 

    Column Family 的个数具体看表的数据,一般来说划分标准是根据数据访问频度,如一张表里有些列访问相对频繁,而另一些列访问很少,这时可以把这张表划分成两个列族,分开存储,提高访问效率。 

    14.如何提高 HBase 客户端的读写性能?请举例说明(☆☆☆☆☆) 

    1 开启 bloomfilter 过滤器,开启 bloomfilter 比没开启要快 3、4 倍
    2 Hbase 对于内存有特别的需求,在硬件允许的情况下配足够多的内存给它
    3 通过修改 hbase-env.sh 中的
    export HBASE_HEAPSIZE=3000 #这里默认为 1000m
    4 增大 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。 

    17. 解释一下布隆过滤器原理(☆☆☆☆☆)? 

    展开全文
  • HBase 面试题

    万次阅读 2019-12-17 17:33:09
    文章目录HBase的基本介绍HBASE的适用场景Hbase和Hadoop之间的关系Hbase与RDBMS的关系Hbase特征简要说明hbase的基础架构HBase的底层原理HBase的表数据模型Row Key列族Column Family列 Column时间戳Cell存储数据的最小...

    HBase的基本介绍

    ​ Hbase 是建立在hdfs之上的一个数据库,不支持join等SQL复杂操作.支持的数据类型:byte[],依靠横向扩展

    ​ 一个表可以有上十亿行,上百万列。

    ​ 面向列(族)的存储和权限控制

    ​ 对于为空(null)的列,并不占用存储空间,是一个稀疏表。

    HBASE的适用场景

    海量数据、精确查询、快速返回

    ​ 海量数据:指的是数据量的背景

    ​ 精确查询:业务场景

    ​ 快速返回:是业务对时效性的要求

    Hbase和Hadoop之间的关系

    ​ HDFS

    ​ 海量数据存储,适合一次性扫描大量数据。

    ​ 适合一次写入多次读取

    ​ 不适合频繁更新的数据

    ​ HBASE

    ​ 不适合一次性扫描大量数据。适用一次扫描少量数据。

    ​ 适合多次写入多次读取

    habse

    ​ 支持数据更新

    ​ 支持删除数据

    Hbase与RDBMS的关系

    ​ RDBMS

    ​ 支持SQL查询

    ​ 支持事务

    ​ 支持Join

    ​ HBASE

    ​ 不支持SQL查询

    ​ 不支持事务

    ​ 不 支持Join

    Hbase特征简要说明

    ​ 1、 海量存储

    ​ Hbase适合存储PB级别的海量数据,在几十到百毫秒内返回数据。

    ​ 2、列式存储

    ​ 这里的列式存储其实说的是列族存储

    ​ 列族理论上可以很多,但实际上建议不要超过6个

    ​ 3、 极易扩展

    ​ 处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)

    ​ hbase在最初设计的时候就考虑了扩展性。

    ​ 4、高并发

    ​ 这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多

    ​ 5、稀疏

    ​ 在列数据为空的情况下,是不会占用存储空间的。

    hbase的基础架构

    ​ 1、Client

    ​ 2 ZOOKEEPER

    ​ 3 Master 管理者

    ​ 4 Regionserver 工作者

    在这里插入图片描述

    HBase的底层原理

    ​ 详细架构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypPWJkVA-1576574636380)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576142410861.png)]

    Client:

    ​ 访问数据的入口,包含访问hbase的API接口,维护着一些cache来加快对hbase的访问

    Zookeeper:

    ​ 1 zookeeper的选举机制保证任何时候,集群中只有一个master

    ​ 2 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master

    ​ 3 存储Hbase的schema,

    ​ 4 存贮所有Region的寻址入口

    Master职责

    ​ 1 为Region server分配region

    ​ 2 负责region server的负载均衡

    ​ 3 发现失效的region server并重新分配其上的region

    ​ 4 处理schema更新请求

    ​ 说明:Hmaster短时间下线,hbase集群依然可用,长时间不行。

    Region server的作用

    ​ 1、 Region server维护Master分配给它的region,处理对这些region的IO请求

    ​ 2、Region server负责切分在运行过程中变得过大的region

    HBase的表数据模型

    ​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFUrQdIf-1576574636380)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576221183717.png)]

    Row Key

    ​ 最大长度是 64KB,完全可以自行设计。Hbase会对表中的数据按照rowkey排序(字典序)

    ​ row的设计是最有技术含量的工作

    列族Column Family

    ​ 列族是表的schema的一部分,而列不是。(schema包含表名和列族)

    ​ 每个列都所属于某一个列族。一个列族可以包含多个列。一个列族与列的关系是一对多。

    列 Column

    ​ 列族下面的具体列。

    时间戳

    ​ 标记一个数据的不同版本

    ​ 时间戳可以由hbase(在数据写入时自动 )赋值,hbase支持工程师自己定义时间戳。

    ​ 每个 cell中,不同版本的数据按照时间倒序排序

    ​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjF0yuYr-1576574636381)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576222927816.png)]

    hbase本身提供数据回收机制

    ​ 1、保存数据的最后n个版本

    ​ 2、保存最近一段时间内的版本

    Cell存储数据的最小单位

    ​ 如何确定一个精确的数据

    ​ 由{row key, column( = +

    VersionNum

    ​ 数据的版本号,默认值为系统时间戳。

    hbase物理存储

    ​ 整体结构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9eFQWPQi-1576574636381)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576223773710.png)]

    ​ 一个regionserver内部可以有多个region,这多个region可能来自多个表或一个表。一个region只能属于一个regionserver.

    region的切分

    ​ region按大小分割的(默认10G)。每个表一开始只有一个region,随着数据的增加,一个region逐渐变大,达到10G,进行分裂,等分成两个region.

    ​ Hregion是Hbase中分布式存储和负载均衡的最小单元

    ​ HRegion由一个或者多个Store组成,每个store保存一个column family。每个Strore又由一个memStore和0至多个StoreFile组成

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VnyacU8y-1576574636382)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576224286253.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7y0jA6Vz-1576574636383)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576224437317.png)]

    Memstore与storefile

    ​ 一个region由多个store组成,每个store包含一个列族的所有数据 Store包括位于内存的memstore和位于硬盘的storefile

    ​ 客户端检索数据时,先在memstore找,找不到再找storefile

    HLog(WAL log)

    ​ 每个Region Server维护一个Hlog,而不是每个Region一个.

    Hlog的切分机制

    ​ 1、当数据写入hlog以后,hbase发生异常。关闭当前的hlog文件

    ​ 2、当日志的大小达到HDFS数据块的0.95倍的时候,关闭当前日志,生成新的日志

    ​ 3、每隔一小时生成一个新的日志文件

    读写过程

    ​ 读请求过程

    ​ 前提:什么是meta表?

    ​ meta表述hbase系统自带的一个表。里面存储了hbase用户表的元信息。

    ​ 元信息为:meta表内记录一行数据是用户表一个region的start key 到endkey的范围。

    ​ meta表存在什么地方?

    ​ meta表存储在regionserver里。 具体存储在哪个regionserver里?zookeeper知道。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-blriqNHs-1576574636383)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576229218108.png)]

    1 到zookeeper询问meta表在哪

    2 到meta所在的节点(regionserver)读取meta表的数据

    3 找到region 获取region和regionserver的对应关系,直接到regionserver读取region数据

    写请求过程

    ​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ZAF2Z7S-1576574636385)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576456747119.png)]

    ​ 1、Client先访问zookeeper,找到Meta表,并获取Meta表元数据。确定当前将要写入的数据所对应的HRegion和HRegionServer服务器。

    ​ 2、Client向该HRegionServer服务器发起写入数据请求。

    ​ 2.1 Client先把数据写入到HLog,以防止数据丢失。
    ​ 2.2 然后将数据写入到Memstore。

    ​ 3、Memstore达到阈值,会把Memstore中的数据flush到Storefile中

    ​ 4、当Storefile越来越多,达到一定数量时,会触发Compact合并操作,将多个小文件合并成一个大文件。

    ​ 5、Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,变成两个文件。

    说明:hbasez 支持数据修改(伪修改),实际上是相同rowkey数据的添加。hbase只显示最后一次的添加。

    region的管理

    ​ region的分配过程

    ​ 前提:一个region只能分配给一个region server

    ​ 1、master记录了当前有哪些可用的region server。以及当前哪些region分配给了哪些region server,哪些region还没有分配。

    ​ 2、当需要分配的新的region,并且有一个region server上有可用空间时,master就给这个region server发送一个装载请求,把region分配给这个region server。

    ​ 3、region server得到请求后,就开始对此region提供服务。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7zwBk8B-1576574636385)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576457883580.png)]

    region server上线

    ​ 前提:master使用zookeeper来跟踪region server状态。

    1、当某个region server启动时,首先在zookeeper上的/hbase/rs目录下建立代表自己的znode。

    2、 master订阅了/hbase/rs目录上的变更消息,当/hbase/rs目录下的文件出现新增或删除操作时,master可以得到来自zookeeper的实时通知。因此一旦region server上线,master能马上得到消息。

    region server下线

    前提:master使用zookeeper来跟踪region server状态。

    1、当region server下线时,它和zookeeper的会话断开。

    2、zookeeper而自动释放代表这台server的文件上的独占锁(znode)

    3、zookeeper将变化发送给master

    4、master 将挂掉的region server的region分配给其它还活着的regionserver。

    Hmaster的上线

    ​ 前提:hbase集群中可以设置多个Hmaster,真正对外提供服务的只有一个

    1 从zookeeper上获取唯一 一个代表active master的锁,用来阻止其它master成为真正的master。

    2 扫描zookeeper上的/hbase/rs节点,获得当前可用的region server列表。

    3 master和每个region server通信,获得当前已分配的region和region server的对应关系。

    4 master扫描.META.表,计算得到当前还未分配的region,将他们放入待分配region列表。

    问题一: 如何确定哪个master是真正的master

    ​ 看谁获得到了active master的锁

    问题二: master如何知道有哪些regionserver,

    ​ 扫描zookeeper上的/hbase/rs节点

    问题三:master 如何知道region与regionserver之间的对应关系

    ​ master和每个region server通信,regionserver反馈对应关系

    问题四:master如何知道哪些region还未分配

    ​ master扫描.META.表,计算得到当前还未分配的region

    ​Hmaster下线

    ​ master只维护表和region的元数据,不参与表数据IO的过程,所以master下线短时间内对整个hbase集群没有影响。

    ​ 表的数据读写还可以正常进行。

    Hmaster下线后的影响:

    ​ 无法创建删除表,无法修改表的schema,无法进行region的负载均衡,无法处理region 上下线,无法进行region的合并(region的split可以正常进行)

    ​ 当hmaster下线后,启动Zookeeper的选举机制,选出新的Hmaster,新的Hmaster上线,执行上线流程。

    ​HBase三个重要机制

    ​ 1、flush机制

    ​ hbase.regionserver.global.memstore.size: 默认;堆大小的40%

    regionServer的全局memstore的大小(多个CF的memstore-多个region),超过该大小会触发flush到磁盘的操作,会阻塞客户端读写

    ​ flush将所有的memstore全部flush.

    ​ hbase不建议配置过多列族:过多的列族会消耗大量的内存,同时数据在flush时消耗磁盘IO.

    一个regionserver续写操作可用堆内存的80%,读取占用40% ,写入占用40%。这两个参数直接影响hbase读写性能。

    什么时候触发flush

    ​ hbase.hregion.memstore.flush.size:默认:128M(单个region里memstore的缓存大小)

    ​ hbase.regionserver.optionalcacheflushinterval: 默认:1h

    ​ hbase.regionserver.global.memstore.size.lower.limit: 默认:堆大小 0.95倍

    ​ hbase.hregion.preclose.flush.size:默认为:5M 提前进行flush.(先flush一小部分,等后面数据达到阈值在flush后面的数据) 好处:比一次flush效率高

    什么时候触发合并

    ​ hbase.hstore.compactionThreshold: 默认:3个 (flush文件的数量超过3个进行合并)

    2、compact机制

    ​ 默认3个

    ​ 小的storeFile文件达到三个,合并成大的Storefile文件。

    3、split机制

    ​ 默认一个HFile达到10Gb的时候就会进行切分

    hbase预分区

    ​ 与分区的好处(优点):

    ​ * 增加数据读写效率 : 数据分布在多台regionserver节点

    ​ * 负载均衡,防止数据倾斜 : 当数据时离散的发送时,预分区可以解决数据倾斜

    ​ * 方便集群容灾调度region : 分布在多个节点便于调度

    ​ * 优化Map数量 :

    原本数据分区(分region)的过程:

    ​ 一个数据表原本只有一个region(分区),随着数据量的增加,region慢慢变大,达到10G ,一个region变成两个region。当数据量还没有达到10G ,所有的数据全部写入一个region。一个region只能属于一个regionserver.

    ​ 如何优化?方案: 将一个10G的数据打散,尽量多的,尽量均匀的分散到不同的regionserver上。

    ​ 如何实现上述方案:预分区(region) 预先设置每个region 的startkey和endkey

    命令分区:

    ​ create ‘staff’,‘info’,‘partition1’,SPLITS => [‘1000’,‘2000’,‘3000’,‘4000’]

    API创建分区

    ​ 后续讲API时创建

    ​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ExsFOCCX-1576574636386)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576468136709.png)]

    HBase的rowKey设计技巧

    ​ rowKey属性,最大64K,按照字典序排序,可以自定义

    ​ hbase数据的获取方式

    ​ 1、通过rowkey直接查找

    ​ 2、通过startkey endkey 范围查找

    ​ 3、全表扫描

    ​ 1 rowkey长度原则

    ​ 最大64K,建议越短越好(在保证业务需求的前提下),不要超过16个字节.

    ​ 2 rowkey散列原则

    ​ 建议将rowkey的高位(左边)作为散列字段, 低位(右边)放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。

    ​ 若不按照此原则:

    ​ 让时间戳作为高位: 数据将按照时间的顺序进行存储。

    ​ 热点问题:当有一点时间业务数据爆炸增长时,这个阶段的数据将存储在少数的节点上。

    ​ 热点为题如何解决?????

    3 rowkey唯一原则

    ​ 必须在设计上保证其唯一性,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。

    热点问题如何解决?????

    ​ 原则:将分散的数据,放在rowkey的高位

    ​ 1、哈希(随机数),将哈希值放在高位

    ​ 2、反转:反转固定长度或者数字格式的数据(时间戳反转、手机号反转,订单号反转)

    ​ 3、加盐:本质时是加随机数,并且放在高位。

    ​ 2、通过startkey endkey 范围查找

    ​ 3、全表扫描

    ​ 1 rowkey长度原则

    ​ 最大64K,建议越短越好(在保证业务需求的前提下),不要超过16个字节.

    ​ 2 rowkey散列原则

    ​ 建议将rowkey的高位(左边)作为散列字段, 低位(右边)放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。

    ​ 若不按照此原则:

    ​ 让时间戳作为高位: 数据将按照时间的顺序进行存储。

    ​ 热点问题:当有一点时间业务数据爆炸增长时,这个阶段的数据将存储在少数的节点上。

    ​ 热点为题如何解决?????

    3 rowkey唯一原则

    ​ 必须在设计上保证其唯一性,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。

    展开全文
  • hbase面试题

    2020-06-07 22:22:59
    如果是集群hbase,先从zk中获取/hbase/meta-region-server获取hbase:meta所在的regionserver 至于为什么是meta-region-server是因为hbase-site.xml默认的属性zookeeper.znode.metaserver,值就是meta-region-server ...


    读流程方法流程解析:
    如果是集群hbase,先从zk中获取/hbase/meta-region-server获取hbase:meta所在的regionserver
    至于为什么是meta-region-server是因为hbase-site.xml默认的属性zookeeper.znode.metaserver,值就是meta-region-server
    locateRegionInMeta()------------>从hbase:meta元数据中定位区域
        createRegionName()--------------->return myHbase:t1,row3,99999999999999
        开启子线程去获取meta元数据信息(元数据如下)并且阻塞get主线程,获取meta信息是通过Scan方式去获取,setCaching(1),缓存一行的数据,也就是下面第二分区4列的数据
        
        第一分区:
        column=info:regioninfo, timestamp=1590762538499, value={ENCODED => bb202802124ea1eaac4b4292c363f54a, NAME => 'myHbase:t1,,1586785632432.bb202802124ea1eaac4
                b4292c363f54a.', STARTKEY => '', ENDKEY => 'row0088888'}                                                                                                   
        column=info:seqnumDuringOpen, timestamp=1590762538499, value=\x00\x00\x00\x00\x00\x00\x00a  
        column=info:server, timestamp=1590762538499, value=s204:16020                                                                                              
        column=info:serverstartcode, timestamp=1590762538499, value=1590762476841
        第二分区:
        column=info:regioninfo, timestamp=1590762545619, value={ENCODED => 5934677b5771e70d796df4356498debc, NAME => 'myHbase:t1,row0088888,1586780613717.5934677b5
                771e70d796df4356498debc.', STARTKEY => 'row0088888', ENDKEY => ''}                                                                                         
        column=info:seqnumDuringOpen, timestamp=1590762545619, value=\x00\x00\x00\x00\x00\x00\x00`                                                                 
        column=info:server, timestamp=1590762545619, value=s203:16020                                                                                              
        column=info:serverstartcode, timestamp=1590762545619, value=1590762475832    
        
        获取到之后唤醒主线程继续执行get的方法,

    client端
        HConnectionManager
        HRegionInfo
        HTable

    server端
        流程:RpcServer:开启listen、responser、scheduler(simpleRpcScheduler(根据任务来分别调用优先级调度器、副本调度器、通用调度器)、fifo任务调度器)去执行

        组件
            HRegionServer(包含多个HRegion)
            HRegion(包含多个HStore和一个Hlog)
            HLog    :记录数据的所有变更,可以用来做数据恢复。
            HStore(一个store由多个storefile和一个memstore组成)每一个Store对应一个列簇
            StoreFile(包含一个HFile,是对HFile的封装)
            HFile:去和底层的hdfs交互,写入和读取操作(read/write)
            MemStore:
                DefaultMemStore:也就是本地链表缓存,采用的是跳表ConcurrentSkipListMap()其优点是在高并发下其插入和查找的性能都很好,复杂度log(n),而且key是有序的
            HFileScanner    

    ClientProtos:客户端协议处理请求  大致分为5种:
        1、MultiRequest:多方式请求
        2、BulkLoadRequest:这个是是导入数据,性能很高
        3、ScanRequest:一种全表查询方式,可设置setCaching、setBatch、Filter等方法,实现复杂查询
        4、GetRequest:查询指定行的数据
        5、MutateRequest:就是插入操作,put()
        
        ClientProtos.ClientService.callBlockingMethod(MethodDescriptor method, RpcController controller, Message request) throws ServiceException {
                        if (method.getService() != ClientProtos.ClientService.getDescriptor()) {
                            throw new IllegalArgumentException("Service.callBlockingMethod() given method descriptor for wrong service type.");
                        } else {
                            switch(method.getIndex()) {
                            case 0:
                                return RSRpcServices.get(controller, (ClientProtos.GetRequest)request);
                            case 1:插入
                                return RSRpcServices.mutate(controller, (ClientProtos.MutateRequest)request);
                            case 2:
                                return RSRpcServices.scan(controller, (ClientProtos.ScanRequest)request);
                            case 3:
                                return RSRpcServices.bulkLoadHFile(controller, (ClientProtos.BulkLoadHFileRequest)request);
                            case 4:
                                return RSRpcServices.execService(controller, (ClientProtos.CoprocessorServiceRequest)request);
                            case 5:
                                return RSRpcServices.execRegionServerService(controller, (ClientProtos.CoprocessorServiceRequest)request);
                            case 6:
                                return RSRpcServices.multi(controller, (ClientProtos.MultiRequest)request);
                            default:
                                throw new AssertionError("Can't get here.");
                            }
                        }
        
    RPCClientImpl.call()


    HBase读取数据流程
    1、Client先访问zookeeper,从zookeeper中找到meta表region的位置,然后读取meta表中的数据。meta中又存储了用户表的region信息。

    2、根据namespace、表名和rowkey在meta表中找到对应的region信息

    3、找到这个region对应的regionserver

    4、查找对应的region

    5、先从MemStore找数据,如果没有,再到StoreFile上读(为了读取的效率)。

    展开全文
  • HBase面试题(二)

    2019-12-18 10:14:28
    HBase面试题
  • 【大数据HBase系列】 HBase面试题整理
  • HBase 面试题(一)

    2019-12-31 11:34:35
    大数据面试题之HBase面试题
  • 1、HBase的特点是什么? 1)大:一个表可以有数十亿行,上百万列; 2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列; 3)面向列:面向列...
  • 2、HDFS和HBase各自使用场景3、Hbase的存储结构4、热点现象(数据倾斜)怎么产生的,以及解决方法有哪些5、HBase的 rowkey 设计原则6、HBase的列簇设计7、HBase 中 compact 用途是什么,什么时候触发,分为哪两种,...
  • hbase面试题整理

    2020-07-20 15:51:08
    简单介绍下Hbase (1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理。 (2) Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的...
  • HBase面试题精讲

    2021-01-17 10:49:22
    1. HBase的特点是什么? 1)大:一个表可以有数十亿行,上百万列; 2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中 不同的行可以有截然不同的列; 3)面向列:面向列(族)...
  • 大数据Hbase 面试题

    2019-10-08 14:58:21
    hbase 的特点是什么 (1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理。 (2) Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去...
  • Hbase面试题4

    2019-08-11 14:44:38
    1.Hbase与Hive 整合? Hive 在一般的使用中,通过把hive语句通过driver转化成mapreducer执行,但是与hbase整合后,通过hiveStorageHandler将hive语句解析映射到Hbase集群。 如果某表hbase已经存在但是在hive...
  • Hbase面试题简要总结

    2020-11-30 15:38:11
    填充数据的时候数rowkey不同,数据就进入不同的region hbase二次索引 Hbase依据非rowkey字段查询时比较困难,如果列族中某一列是经常用来做筛选条件查询的,可以建立一个二级索引表,把这一列作为key,rowkey作为value...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,033
精华内容 3,213
关键字:

hbase面试题