面向列的数据库中的架构演变

271 阅读3分钟

面向列的数据库中的架构演变

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' 

输出将是这样的

image.png

现在数据集已经准备好了,我将回顾 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万现金大奖」