一条数据的HBase之旅,简明HBase入门教程5:创建数据表

举报
Jaison 发表于 2018/03/30 17:32:18 2018/03/30
【摘要】 本文先给出了一些示例数据,而后介绍了如何建立Client到HBase集群侧的连接,最后介绍了整个建表的流程

示例数据

给出一份我们日常都可以接触到的数据样例,先简单给出示例数据的字段定义:

Data-Sample-Definition

本文力求简洁,仅给出了最简单的示例。如下是”虚构”的样例数据:

Data-Sample

写数据之前:建立连接

Login

在启用了安全特性的前提下,Login阶段是为了完成用户认证(确定用户的合法身份),这是后续一切安全访问控制的基础。

当前Hadoop/HBase仅支持基于Kerberos的用户认证,ZooKeeper除了Kerberos认证,还能支持简单的用户名/密码认证,但都基于静态的配置,无法动态新增用户。如果要支持其它第三方认证,需要对现有的安全框架做出比较大的改动。

创建Connection

Connection可以理解为一个HBase集群连接的抽象,建议使用ConnectionFactory提供的工具方法来创建。因为HBase当前提供了两种连接模式:同步连接,异步连接,这两种连接模式下所创建的Connection也是不同的。我们给出ConnectionFactory中关于获取这两种连接的典型方法定义:

CompletableFuture<AsyncConnection> createAsyncConnection(Configuration conf,
                 User user);

Connection createConnection(Configuration conf, ExecutorService pool, User user)
      throws IOException;

Connection中主要维护着两类共享的资源:

  • 线程池

  • Socket连接

这些资源都是在真正使用的时候才会被创建,因此,此时的连接还只是一个”虚拟连接”。

写数据之前:创建数据表

DDL操作的抽象接口 – Admin

Admin定义了常规的DDL接口,列举几个典型的接口:

void createNamespace(final NamespaceDescriptor descriptor) throws IOException;

void createTable(final HTableDescriptor desc, byte[][] splitKeys) throws IOException;

TableName[] listTableNames() throws IOException;

预设合理的数据分片 – Region

分片数量会给读写吞吐量带来直接的影响,因此,建表时通常建议由用户主动指定划分Region分割点,来设定Region的数量。

HBase中数据是按照RowKey的字典顺序排列的,为了能够划分出合理的Region分割点,需要依据如下几点信息:

  • Key的组成结构

  • Key的数据分布预估

  • 如果不能基于Key的组成结构来预估数据分布的话,可能会导致数据在Region间的分布不均匀

  • 读写并发度需求

  • 依据读写并发度需求,设置合理的Region数量

为表定义合理的Schema

既然HBase号称”schema-less”的数据存储系统,那何来的是schema? 的确,在数据库范式的支持上,HBase非常弱,这里的Schema,主要指如下一些信息的设置:

  • NameSpace设置

  • Column Family的数量

  • 每一个Column Family中所关联的一些关键配置


    • Compression

      HBase当前可以支持Snappy,GZ,LZO,LZ4,Bzip2以及ZSTD压缩算法

    • DataBlock Encoding

      HBase针对自身的特殊数据模型所做的一种压缩编码

    • BloomFilter

      可用来协助快速判断一条记录是否存在

    • TTL

      指定数据的过期时间

    • StoragePolicy

      指定Column Family的存储策略,可选配置有:

      “ALL_SSD”,”ONE_SSD”,”HOT”,”WARM”,”COLD”,”LAZY_PERSIST”

HBase中并不需要预先设置Column定义信息,这就是HBase schema-less设计的核心。

Client发送建表请求到Master

建表的请求是通过RPC的方式由Client发送到Master:

  • RPC接口基于Protocol Buffer定义

  • 建表相关的描述参数,也由Protocol Buffer进行定义及序列化

Client端侧调用了Master服务的什么接口,参数是什么,这些信息都被通过RPC通信传输到Master侧,Master再依据这些接口\参数描述信息决定要执行的操作。2.0版本中,HBase目前已经支持基于Netty的异步RPC框架

关于HBase RPC框架

早期的HBase RPC框架,完全借鉴了Hadoop中的实现,那时,Netty项目尚不盛行。


Master侧接收到Client侧的建表请求以后,一些主要操作包括:

  • 生成每一个Region的描述信息对象HRegionInfo,这些描述信息包括:Region ID, Region名称,Key范围,表名称等信息

  • 生成每一个Region在HDFS中的文件目录

  • 将HRegionInfo信息写入到记录元数据的hbase:meta表中。

说明

meta表位于名为"hbase"的namespace中,因此,它的全称为"hbase:meta"

但在本系列文章范畴内,常将其缩写为"meta"


整个过程中,新表的状态也是记录在hbase:meta表中的,而不用再存储在ZooKeeper中。

如果建表执行了一半,Master进程挂掉了,如何处理?这里是由HBase自身提供的一个名为Procedure(V2)的框架来保障操作的事务性的,备Master接管服务以后,将会继续完成整个建表操作。

一个被创建成功的表,还可以被执行如下操作:

  • Disable 将所有的Region下线,该表暂停读写服务

  • Enable 将一个Disable过的表重新Enable,也就是上线所有的Region来正常提供读写服务

  • Alter 更改表或列族的描述信息

Master分配Regions到各个RegionServers

新创建的所有的Regions,通过AssignmentManager将这些Region按照轮询(Round-Robin)的方式分配到每一个RegionServer中,具体的分配计划是由LoadBalancer来提供的。

AssignmentManager负责所有Regions的分配/迁移操作,Master中有一个定时运行的线程,来检查集群中的Regions在各个RegionServer之间的负载是否是均衡的,如果不均衡,则通过LoadBalancer生成相应的Region迁移计划,HBase中支持多种负载均衡算法,有最简单的仅考虑各RegionServer上的Regions数目的负载均衡算法,有基于迁移代价的负载均衡算法,也有数据本地化率优先的负载均衡算法,因为这一部分已经提供了插件化机制,用户也可以自定义负载均衡算法。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。