HBase 问题与解答

Hbase 有 5 个原子命令可执行不同的操作。

获取、放置、删除、扫描和增量。

通过 Hbase Shell(Java API)建立与 Hbase 的连接。

主服务器将区域分配给区域服务器并处理集群中的负载平衡。

zookeeper 维护配置信息,提供分布式同步,还维护客户端和区域服务器之间的通信。

在 Hbase 中,禁用表以允许修改或更改其设置。禁用表后,无法通过 scan 命令访问表。

Hbase > is_disabled "表名"

该命令将禁用所有以字母 p 开头的表

过滤器用于从 Hbase 表中获取特定数据,而不是所有记录。

它们有以下类型。

  • 列值过滤器
  • 列值比较器
  • 键值元数据过滤器。
  • 行键过滤器。
  • Hbase 没有内置身份验证/权限机制

  • 只能在关键列上创建索引,但在 RDBMS 中,可以在任何列上创建索引列。

  • 一个 HMaster 节点存在单点故障。

Hbase 中的目录表维护元数据信息。它们被命名为 −ROOT− 和 .META。−ROOT− 表存储有关 .META> 表位置的信息,而 .META> 表保存有关所有区域及其位置的信息。

Hbase 在分布式系统 Hadoop 上运行。Haddop 只能在需要时通过动态添加更多机器来扩展。因此,Hbase 是一个横向扩展的过程。

在 Hbase 中,客户端不会直接写入 HFile。客户端首先写入 WAL(写访问日志),然后由 Memstore 访问。Memstore 会不时将数据刷新到永久内存中。

随着越来越多的数据写入 Hbase,会创建许多 HFile。压缩是将这些 HFile 合并为一个文件的过程,在成功创建合并文件后,丢弃旧文件。

压缩有两种类型。Major 和 Minor 压缩。在 Minor 压缩中,相邻的小 HFile 被合并以创建单个 HFile,而不会删除已删除的 HFile。要合并的文件是随机选择的。

在 Major 压缩中,将出现某一列的所有 HFile 并创建单个 HFile。删除的 HFile 将被丢弃,并且通常是手动触发的。

删除列命令会删除列的所有版本,但删除系列会删除特定系列的所有列。

Hbase 中的单元是 Hbase 表中的最小单位,以元组{row,column,version}的形式保存一段数据。

此类用于存储有关列系列的信息,例如版本数、压缩设置等。它在创建表或添加表时用作输入列。

版本下限表示 Hbase 中某个列要存储的最小版本数。例如,如果将值设置为 3,则将保留三个最新版本,并删除较旧的版本。

TTL 是一种数据保留技术,使用该技术可以将单元的版本保留到特定时间段。一旦达到该时间戳,将删除特定版本。

Hbase 不支持表连接。但是使用 mapreduce 作业,我们可以指定连接查询以从多个 Hbase 表中检索数据。

Hbase 中的每一行都由一个称为 row key 的唯一数组字节标识。

可以通过两种方式访问​​ Hbase 中的数据。

  • 使用 rowkey 和表扫描获取一系列行键值。

  • 以批处理方式使用 mapreduce。

它们是 − (i) 短而宽 (ii) 高而薄

在以下情况下,应考虑使用短而宽的表设计

  • 列数较少

  • 行数较多

在以下情况下,应考虑使用高而薄的表设计

  • 列数较多

  • 行数较少

hbase > alter 'tablename', {NAME => 'ColFamily', VERSIONS => 4

此命令从表中删除列族。

Hbase > disable 'tablename'
Hbase > alter 'tablename' {NAME => 'oldcolfamily',NAME=>'newcolfamily'}
Habse > enable 'tablename'
scan 'tablename', {LIMIT=>10,
STARTROW=>"start_row",
STOPROW=>"stop_row"}

对表运行主要压缩。

在 Hbase 中执行数据批量加载有两个主要步骤。

  • 使用自定义 mapreduce 作业从数据源生成 Hbase 数据文件 (StoreFile)。StoreFile 以 Hbase 内部格式创建,可以高效加载。

  • 使用另一个工具(如 comletebulkload)导入准备好的文件,以将数据导入正在运行的集群。每个文件都会加载到一个特定的区域。

Hbase 使用一项称为区域复制的功能。在此功能中,对于表的每个区域,将有多个副本在不同的 RegionServer 中打开。负载均衡器确保区域副本不会共同托管在同一个区域服务器中。

Hmaster 是负责监控集群中所有 RegionServer 实例的主服务器,它是所有元数据更改的接口。在分布式集群中,它在 Namenode 上运行。

HRegionServer 是 RegionServer 实现。它负责服务和管理区域。在分布式集群中,RegionServer 在 DataNode 上运行。

HBase 提供两种不同的 BlockCache 实现:默认的堆上 LruBlockCache 和 BucketCache(通常)在堆外)。

预写日志 (WAL) 记录对 HBase 中数据的所有更改,并记录到基于文件的存储中。如果 RegionServer 在 MemStore 刷新之前崩溃或不可用,WAL 可确保可以重放对数据的更改。

如果每个 RegionServer 只有一个 WAL,则 RegionServer 必须按顺序写入 WAL,因为 HDFS 文件必须是连续的。这会导致 WAL 成为性能瓶颈。

编辑区域时,需要重放 WAL 文件中属于该区域的编辑。因此,WAL 文件中的编辑必须按区域分组,以便可以重放特定集合以重新生成特定区域中的数据。按区域对 WAL 编辑进行分组的过程称为日志分割。

可以禁用 WAL 以改善性能瓶颈。

这可以通过调用 Hbase 客户端字段 Mutation.writeToWAL(false) 来完成。

手动区域分割完成后,由于许多客户端查询同一张表,我们的表中出现了意外热点。

Habse Store 托管一个 MemStore 和 0 个或多个 StoreFiles (HFiles)。Store 对应于给定区域的表的列族。

Habse 中存储实际数据(而非元数据)的 HFile 是在 BigTable 的 SSTable 文件之后设计的。

HBase 中的表最初默认创建一个区域。然后,对于批量导入,所有客户端都将写入同一区域,直到该区域大到足以拆分并分布在集群中。因此,创建空区域以加快此过程。

热点是指大量客户端流量指向集群的一个节点或几个节点的情况。此流量可能代表读取、写入或其他操作。此流量压倒了负责托管该区域的单台机器,导致性能下降并可能导致区域不可用。

可以通过将行键分布在多个区域来避免或最小化热点。实现此目的的不同技术包括加盐和散列。

在 Hbase 中,值始终带有坐标;当单元格值通过系统时,它将附带其行、列名和时间戳。如果行和列名称很大,尤其是与单元格值的大小相比,那么为了方便随机访问而保存在 HBase 存储文件 (StoreFile (HFile)) 上的索引最终可能会占用 HBase 分配的 RAM 的大部分,而不是数据本身,因为单元格值坐标很大。

行键的范围是 ColumnFamilies。相同的行键可以存在于表中存在的每个 ColumnFamily 中而不会发生冲突。

Hbase:meta 表以以下格式存储系统中区域的详细信息。

info:regioninfo(此区域的序列化 HRegionInfo 实例)

info:server(包含此区域的 RegionServer 的服务器:端口)

info:serverstartcode(包含此区域的 RegionServer 进程的启动时间)

命名空间是表的逻辑分组。它类似于关系数据库系统中的数据库对象。

只有查询该列族的所有行才能获得列族中的完整列列表。

从 Hbase 中提取的记录始终按行键->列族->列限定符->tiestamp 的顺序排序。