面向列的数据库中的架构演变
HBase 不是完全无模式的。有一个定义松散的模式,特别是在列族定义方面。列族是一个相当静态的定义,它将更动态、更灵活的列定义划分为逻辑捆绑包。
为了便于解释,我用一个示例来介绍。
是关于blogger系列的,这个集合的元素是这样的:
{"post":{
"title": "an interesting blog post",
"author": "a blogger",
"body": "interesting content"},
"multimedia":{
"header":header.png,
"body": body.mpeg, },}
or
{
"post":{
"title": "yet an interesting blog post", "author": "another blogger",
"body": "interesting content",},
{
"multimedia":{
"body-image":body_image.png,
"body-video": body_video.mpeg,
}
}
}
您可以使用 bin/start-hbase.sh 启动 HBase,并使用bin/hbase shell通过 shell 进行连接。然后,您可以按以下顺序运行命令来创建表并填充一些示例数据:
create 'blogposts', 'post', 'multimedia'
put 'blogposts', 'post1', 'post:title', 'an interesting blog post'
put 'blogposts', 'post1', 'post:author', 'a blogger'
put 'blogposts', 'post1', 'post:body', 'interesting content'
put 'blogposts', 'post1', 'multimedia:header', 'header.png'
put 'blogposts', 'post1', 'multimedia:body', 'body.mpeg'
put 'blogposts', 'post2', 'post:title', 'yet an interesting blog post'
put 'blogposts', 'post2', 'post:title', 'yet another interesting blog post'
put 'blogposts', 'post2', 'post:author', 'another blogger'
put 'blogposts', 'post2', 'post:body', 'interesting content'
put 'blogposts', 'post2', 'multimedia:body-image', 'body_image.png'
put 'blogposts', 'post2', 'multimedia:body-video','body_video.mpeg'
数据库准备就绪后,您可以运行一个简单的 get 查询,如下所示:
get 'blogposts', 'post1'
输出将是这样的
现在数据集已经准备好了,我将回顾 HBase 的一些更基本的方面,并向您展示 HBase 如何随着数据模式的变化而发展。
首先,HBase 中的所有数据更新都被更新的记录覆盖,而不是现有记录的就地更新。您已经在 CouchDB 中看到了类似的行为。默认情况下,HBase 是配置为保留最后三个版本,但是可以配置为为每个版本存储三个以上的版本。版本的数量在每个列族级别设置。可以在定义列族时指定版本数。在 HBase shell 中,您可以创建一个名为“ mytable”的表,并定义一个名为“ family”的列族,其配置将保留以下15个过去的版本:
create 'mytable', { NAME => 'afamily',VERSIONS =>15}
VERSION 属性接受一个整数值,因此它可以接受的最大值是 Integer。最大值。虽然您可以为要保存的版本数量定义一个大值,但是使用此数据不容易检索和查询该值,因为没有基于版本的内置索引。另外,版本也有时间戳,但是跨时间序列查询数据集并不是一个容易或有效实现的特性。
虽然配置是使用命令行实用程序完成的,但您也可以通过编程方式实现相同的配置。最大版本属性需要作为参数传递给 HColumnDescriptor 构造函数。
HBase 中的列不需要预先定义,因此它们提供了管理不断发展的模式的灵活方法。另一方面,列族更加静态。但是,不能轻松地将列从一个列族重命名或分配到另一个列族。进行此类更改需要创建新列,将数据从现有列迁移到新列,然后可能删除旧列。
虽然 HBase 允许从 shell 或通过编程选项创建列族,但 Cassandra 传统上要严格得多。旧版本 Cassandra 中列族的定义需要重新启动数据库。当前版本的 Cassandra 更加灵活,并且允许在运行时进行配置更改。
本文正在参加「金石计划 . 瓜分6万现金大奖」