您的位置:首页 > 其它

HBase - 数据模型的特殊属性 | 那伊抹微笑

2015-07-31 14:35 351 查看
博文作者:妳那伊抹微笑

csdn 博客地址:http://blog.csdn.net/u012185296
itdog8 地址链接 : http://www.itdog8.com/thread-190-1-1.html
博文标题:HBase - 数据模型的特殊属性 | 那伊抹微笑

个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在

技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术

转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!

qq交流群:214293307

(期待与你一起学习,共同进步)


1 版本
Rowkey、Column(列族和列)、Version 组合在一起称为 HBase 中的一个单元格。有可能会有很多单元的行和列是相同的,要区分不同的单元可以使用版本。

1.1 含版本的操作

1.1.1 Get / Scan
Get 是在 Scan 基础上实现的。Get 同样可以用 Scan 来描述。在默认情况下,如果没有指定版本,一旦使用 Get 操作,会返回最近版本的 Cell (该 Cell 可能是最新写入的,但不能保证一定是)。默认的操作可以这样修改 :

返回两个以上版本,使用 Get 类的 setMaxVersions()
返回的版本不只是最近的,使用 Get 类的 setTimeRange()
...
更多的可以直接参考 API

1.1.2 Put
一个 Put 操作会为一个 Cell 创建一个版本,默认使用当前时间戳,当然也可以自己设置这个值。

1.1.2 Delete

内部删除标记有三种不同类型 :
Delete : 删除列的指定版本
Delete Column : 删除列的所有版本
Delete Family : 删除特定列族所有列

1.2 现有的限制

1.2.1 删除标记后错误读取新数据

1.2.2 主合并改变查询的结果

2 排序
Get 和 Scan 操作返回的是经过排序的数据。列在服务端也是字典排序的,所以按照名称的字典顺序返回。
返回的数据首先按 Rowkey 字典顺序排序,其次是列族(Family),然后是列修饰符(Column Qualifer),最后是时间戳方向排序,最新的在最前面。

3 列的元数据
HBase 表中的列族,除了 KeyValue 实例以外,没有关于元数据的描述,KeyValue 对象表示 HBase 的最小单位是 Cell。
HBase 的表不仅在一行中支持很多列,而且支持行之间有不同的列,所有需要单独维护行和列之间的关系。
获取列族的完整列的唯一方法是处理所有行(真是个悲伤的故事)

4 连接查询 Join
简单来说是不支持的,至少不像传统 RDBMS 那样支持。需要用户自己实现。
方法 1:写入 HBase 的时候已经做好连接
方法 2:查询表并在应用程序做连接
所以还得看业务

5 计数器
IncrementColumnValue(简称 ICV)是 HBase 的计数器,可以使用它完成一些简单的计数,比如 PV。
ICV 操作发生在 RegionServer 上,而不是在客户端,所以速度快。
当其他客户端也在访问同一个单元格(Cell)时,可以避免出现不一致的情况。
ICV 操作等同于 Java 的 AtomicLong.addAddGet() 方法。

6 原子操作
HTableInterface 接口提供了 :
checkAndPut() 方法和
checkAndDelete() 方法
它们可以在维持原子语义的同时提供更精细的控制。
可以用 checkAndPut() 来实现 IncrementColumnValue() 方法

7 事务性 ACID
传统的 SQL 数据库的事务通常都是支持 ACID 的强事务机制。而 HBase 这种 NoSQL 数据库仅提供对行级别的原子性保证,也就是说同时对同一个 key 下的数据进行两个操作,在实际执行的时候会串行执行,保证了每一个 KeyValue 对不会被破坏。

更多 HBase 的 ACID 语义参考 : http://hbase.apache.org/acid-semantics.html

8 行锁

HBase API 中 put ()、delete()、checkAndPut() 等修改操作是独立执行的,这意味着在一个串行方式的执行中,对于每一行必须保证行级别的操作是原子性的。

RegionServer 提供了一个行锁特性,这个特性保证了只有一个客户端能获取一行数据相应的锁,同时对该行进行修改。

9 自动分区
HBase 中一个表的数据会被划分成很多 Region,Region 可以动态扩展并且HBase保证Region的负载均衡。Region实际上是行键排序后的按规则分割的连续的存储空间。如果
Region 太大,会被动态拆分,相反,多个 Region 会合并成一个较大的 Region,以减少 HDFS 上存储文件的数量。这两个过程就是 HBase 的 split 和 compaction。
刚刚创建表的时候只有一个 Region,随着数据的写入,达到 Region 上限配置时,Region
会按照中间键自动地拆分成两个大致相等的 Region,每个 Region 由一个 RegionServer 管理,一个 RegionServer 处理器管理者许多的 Region 。

Region 的拆分和转移是由 HBase 自动完成的,用户感知不到,当一个 RegionServer
服务器发生故障时,Region 可以快速地被转移到其他服务器上,Region 的拆分过程也是瞬间完成的。

当 Region 进行拆分时,首先要将该 Region 下线(offline),拆分完成后新的 Region
再上线(online),下线的 Region 暂时不可用,不过由于速度极快,通常不会对数据的读写造成影响。

10 CAP 原理与最终一致性

小结 :
HBase 最为 NoSQL 数据库的一个代表和传统关系型数据库在概念上有相似之处,但也有非常大的差别。
HBase 更多的是为了扩展性和性能考虑,弱化了事务性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: