理解 HBase 的数据模型

本文源自 Unstanding HBase and BigTable
HBase 是 Google BigTable 的开源实现。
BigTable 是一个稀疏的、分布式的、持久化的多维有序 map,该 map 由 row key, column key 和一个时间戳(timestamp)构成索引,索引对应的值是原始的字节数组。HBase 的数据模型和上述定义类似。
这里比较独特的是这个 map 是按照 key 构成的索引有序排列的。这就要求我们在制订 row key 生成策略时,要考虑哪些 key 具有类似性,最好把他们排在一起。例如一个 hbase 表的 row key 是网站的域名,那么我们最好将域名倒排(com.google.www, com.google.mail.www, com.jd.www, com.baidu.www)作为 key 以便将具有相同子域名聚集在一起。
多维是指 value 部分可以有多个列组成,这些列又分别组成了多个 column family。定义 HBase 表的时候,colunm family 是需要确定的,并且不能更改,列位于 column 中,可以动态添加。其数据形式类似与一个 JSON 数据段。

{
  // ...
  "row key a" : {
    "column family A" : {
      "column o" : "y",
      "column p" : "d"
    },
    "column family B" : {
      "column q" : "w"
    }
  },
  "row key b" : {
    "column family A" : {
      "column o" : "world",
      "column x" : "domination"
    },
    "column family B" : {
      "column q" : "ocean"
    }
  },
  // ...
}

向 HBase 请求数据时,必须要具体到最细粒度的列名,也就是说,从使用数据的角度来看,除了 row key 列,我们可以试图从 HBase 中获取某一行的如下四列属性:“column family A:column o”, “column family A:column p”, “column family A:column x” 和 “column family B:column q”。
每一列数据都会有一个(时间)版本号,即同一个 row key 的数据不会被覆盖更新,而是对相应的列属性附加上版本信息后新增到 HBase 中,查询时如果不指定版本号,则默认返回最新版本数据。
因为每个 column family 下的列都是随意的,HBase 中各行数据的列可能差别很大(虽然 column 一样),因此 HBase 数据常常是稀疏的。

你可能感兴趣的:(大数据)