一条数据的HBase之旅,简明HBase入门教程5:创建数据表
示例数据
给出一份我们日常都可以接触到的数据样例,先简单给出示例数据的字段定义:
本文力求简洁,仅给出了最简单的示例。如下是”虚构”的样例数据:
写数据之前:建立连接
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数目的负载均衡算法,有基于迁移代价的负载均衡算法,也有数据本地化率优先的负载均衡算法,因为这一部分已经提供了插件化机制,用户也可以自定义负载均衡算法。
- 点赞
- 收藏
- 关注作者
评论(0)