HBase数据模型(NameSpace、 RowKey、Column Family 列簇)

HBase数据模型


概念

描述

  • HBase 是一个稀疏的、分布式、持久、多维、排序的映射,它以行键(row key),列簇(columnFamily),列名(Column Qualifier)和时间戳(timestamp)为索引。

图解

在这里插入图片描述

注意

  • 1、MySQL使用 行+ 列 定位数据
  • 2、HBase类似于坐标系(x,y,z),多维定位数据
  • 3、HBase 列簇、列名、时间戳,面向列进行存储

数据结构内容


NameSpace 命名空间 | 数据库

  • 注意

    • 1、命名空间是类似于关系数据库系统中的数据库的概念,他其实是***表的逻辑分组***。这种抽象为多租户相关功能奠定了基础。

    • 2、命名空间是可以管理维护的,可以创建,删除或更改命名空间

    • 3、HBase有两个特殊预定义的命名空间

      • 1、default - 没有明确指定名称空间的表将自动落入此名称空间
      • 2、hbase - 系统命名空间,用于包含HBase内部表
  • 描述

    • 1、为了保护我们的表,所采用的更高层次的单位
    • 2、表的逻辑分组

Table 表

  • 描述

    • 1、存储相同数据的一个逻辑单元
    • 2、Hbase的table由多个行组成,行有很多列组成
    • 3、HBase是一个半结构的数据库,所以每一行的列都有可能是不同
  • 图文

    在这里插入图片描述

RowKey 主键

  • 注意

    • 1、RowKey 是用来检索记录的主键,是一行数据的唯一标识
    • 2、RowKey行键 (RowKey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10-100bytes),RowKey以字节数组保存。
    • 3、存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。
  • 描述

    • 1、可以理解为一行数据的主键
    • 2、HBase按照进行存储,所以我们查询数据的时候会看到很多RowKey相同的列
    • 3、RowKey可以看做成主键:最多可以有64K字节组成,一般为 10~40 个字节即可
      • 将来设计 RowKey 是 HBase 使用的重中之重
    • 4、RowKey 存储的时候默认以字典序排序

Column Family 列簇

  • 注意

    • 1、列簇在物理上包含了许多的列与列的值,每个列簇都有一些存储的属性可配置
      • 例如是否使用缓存,压缩类型,存储版本数等。在表中,每一行都有相同的列簇,尽管有些列簇什么东西也没有存。
    • 2、将功能属性相近的列放在同一个列簇,而且同一个列簇中的列会存放在同一个Store中
    • 3、列簇一般需要在创建表的时候就进行声明,而且一般一个表中的列簇数不要超过3个
      • 这个和后期的优化相关
    • 4、列隶属于列簇,列簇隶属于表
  • 描述

    • 1、可以理解为多个列的集合
    • 2、方便队列进行查找和管理
    • 3、一个表的列簇需要在使用前声明(创建表,后期维护表)
    • 4、列隶属于列簇,列簇隶属于表
    • 5、一个表中列簇是固定的,但是列簇中列是不固定的

Column Qualifier 列

  • 注意

    • 1、列簇的限定词,理解为列的唯一标识
      • 但是列标识是可以改变的,因此每一行可能有不同的列标识
    • 2、使用的时候必须 列簇:列
    • 3、列可以根据需求动态添加或者删除,同一个表中不同行的数据列都可以不同
  • 描述

    • 1、一个列簇中的列是不固定的
    • 2、又肯有的数据行一个列簇中有3个列,有的行相同列簇有8个列

Timestamp 数据版本

  • 注意

    • 1、通过rowkey和column family,column qualifier确定的一个存贮单元通过时间戳来索引。
      • 时间戳的类型是 64 位整型
      • 默认时间戳是精确到毫秒的当前系统时间。
      • 时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。
    • 2、每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面
      • 查询数据的时候,如果不指定版本数,默认显示版本号最新(高)的数据
    • 3、为了避免数据存在过多版本中造成管理 (包括存贮和索引)负担,HBASE 提供了两种数据版本回收方式
      • 一是保存数据的最后n个版本
      • 二是保存最近一段时间内的版本(比如最近七天)。
  • 描述

    • 默认就是时间戳,解决HDFS不能随时修改数据的弊端
    • 默认数据版本就是时间戳
    • 查询数据的时候默认显示最新的数据

Cell 数据

  • 注意

    • 1、Cell是由row,column family,column qualifier,version 组成的
    • 2、cell中的数据是没有类型的,全部是字节码形式存贮。
      • 因为HDFS上的数据都是字节数组
  • 描述

    • row,column family,column qualifier,version 所有的数据都是字符串

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
可以使用 Flink 的 Kafka Consumer 和 HBase Sink 来实现这个功能。具体步骤如下: 1. 创建 Flink Kafka Consumer,读取 Kafka 中的数据。 ``` FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>("topic", new SimpleStringSchema(), properties); DataStream<String> stream = env.addSource(kafkaConsumer); ``` 2. 对数据进行处理,自定义组合成 HBase 中的 RowKey列簇。 ``` DataStream<Tuple2<String, String>> hbaseStream = stream.map(new MapFunction<String, Tuple2<String, String>>() { @Override public Tuple2<String, String> map(String value) throws Exception { // 自定义生成 RowKey列簇 String rowkey = generateRowkey(value); String columnFamily = generateColumnFamily(value); return new Tuple2<>(rowkey, columnFamily); } }); ``` 3. 创建 HBase Sink,将数据写入 HBase 中。 ``` Configuration hbaseConf = HBaseConfiguration.create(); hbaseConf.set("hbase.zookeeper.quorum", "localhost"); hbaseConf.set("hbase.zookeeper.property.clientPort", "2181"); DataStreamSink<Tuple2<String, String>> sink = hbaseStream.addSink(new HBaseSink(hbaseConf, "tableName")); ``` 其中,`generateRowkey` 和 `generateColumnFamily` 方法需要根据业务逻辑自行实现。HBaseSink 实现可参考以下代码: ``` public class HBaseSink extends RichSinkFunction<Tuple2<String, String>> { private Configuration hbaseConf; private String tableName; private transient Connection connection; private transient Table table; public HBaseSink(Configuration hbaseConf, String tableName) { this.hbaseConf = hbaseConf; this.tableName = tableName; } @Override public void open(Configuration parameters) throws Exception { connection = ConnectionFactory.createConnection(hbaseConf); table = connection.getTable(TableName.valueOf(tableName)); } @Override public void close() throws Exception { table.close(); connection.close(); } @Override public void invoke(Tuple2<String, String> value, Context context) throws Exception { Put put = new Put(Bytes.toBytes(value.f0)); byte[] cfBytes = Bytes.toBytes(value.f1); put.addColumn(cfBytes, Bytes.toBytes("qualifier"), Bytes.toBytes("value")); table.put(put); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寧三一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值