项目地址 https://github.com/datawhalechina/juicy-bigdata,感谢项目团队的付出。
本次主要学习 hbase 相关内容。
1.产生背景
hadoop 只能按照顺序进行读取,效率较低。HBase 专门用来解决 HDFS 数据的随机访问问题。
2.概述
HBase 是构建在 hadoop 系统上的**高可靠、高性能、面向列、可伸缩的分布式数据库。主要存储半结构化、非结构化数据。特点是稀疏存储(没有值的字段不占用存储空间)。
3.访问接口
HBase 提供了丰富的访问接口。
- 最常规、最高效的是
Native Java API
,是面向 java 程序的。 - HBase Shell 是面向程序员或者数据开发工程师的命令行工具,主要用来进行 HBase 管理及数据的查询。
- Thrift Gateway Thrift 序列化技术为其他异构系统访问 HBase 表数据提供支撑。
- REST Gateway REST HTTP API 彻底解除了语言的限制。
- pig 支持使用 pig latin 流式编程语言进行 HBase 表数据的处理,适合做统计分析,当然,对使用者的要求也很高。
- hive 是对数据开发工程师甚至业务人员最友好的接口,可以通过 sql 来访问 HBase 数据,缺点是响应时间较长。
4. HBase 数据模型
- rowkey:HBase 表的主键,也是 HBase 表的索引。
- column family:某些列的分组。HBase 表中的所有列可以分为多个列族(逻辑概念、逻辑分组)
- coumn:某个列族内 ,column 用来标识某一列。
- value:rowkey、column family、column 共同锁定一个 cell 单元格,这个单元格的值就是此列的 value。
5. HBase 预分区
HBase 表创建时,默认分配某个 region server 的一个 region ,数据量小的时候没有问题,数据量达到一个量级之后(10GB)才会进行拆分,新增一个 region,这种情况下,分配的这个 region server 压力较大,而集群中的其他 region server 则处于空闲状态,未能发挥集群的优势。因此,需要人为进行预分区。
预分区可以有如下几个有点:
- 提供数据操作效率(读和写);
- 使得集群处于负载均衡的状态,防止数据倾斜;
- 便于容灾调度 region;
- 优化 map 数量
6. HBase 预分区设计和制定
hbase 预分区一般采用 2 位数字前缀,即:10,20,30,40,50,60,70,80,90,(第一个分区没用 Start Key,最后一个分区没用 End Key,所以是 10 个分区)。
设置命令如下:
create 'test:student', 'data',{SPLITS => ['10|','20|','30|','40|','50|','60|','70|','80|','90|']}
也可以使用 16 进制序列设置预分区。
设置命令如下:
create 'test:student', 'data', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
此时,其预分区是 11111111 ~ ffffffff
,(第一个分区没用 Start Key,最后一个分区没用 End Key,所以是 16 个分区)。
需要特别注意的是预分区的设计和 HBase rowkey 的设计紧密相关,因为良好的 rowkey 设计能够确保数据能够均匀的命中不同的 region ,从而避免 数据写入热点 的产生,实现写请求的负载均衡。
7. HBase 表数据排序与 rowkey 设计
HBase 表是按照 rowkey
的字典顺序进行升序排列的。想要快速获取最新产生的数据,必须要好好设计一下 rowkey,正常情况下,一个变量会随着时间的延续而增大。有一个方法是使用一个未来日期的时间戳 - 当前时间戳 timestamp 作为 rowkey 的后缀,比如 2099年1月1日0点的时间戳 - timestamp 作为 rowkey 的后缀,rowkey 的前缀则尽量与业务相关且不能造成数据热点,假设业务主键是手机号码,手机号反转就能很好的规避数据热点问题,因为手机尾号可以均匀的落到预分区的不同 region。最终的 rowkey 设计为:手机号码反转_(4071744000000 - timestamp) ,既考虑了业务,又规避了数据热点问题,又能快速的获取到最新的数据(每个用户的第一条数据就是该用户最新的数据)。
8. 我开发的小工具
HBase 环境部署过程此处不再赘述,HBase Shell 不同于 SQL 命令,写起来有些晦涩难懂,我最近用 ChatGPT 开发了一款 Java GUI 工具,推荐你试试。
下载地址:
链接:https://pan.baidu.com/s/1B66aH4WL5PnIxy76qYSMkw?pwd=u820
提取码:u820