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 更多的是为了扩展性和性能考虑,弱化了事务性。
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 更多的是为了扩展性和性能考虑,弱化了事务性。
相关文章推荐
- 消息中间件(二)---ActiveMQ
- ClassLoader详解及用途
- Can't connect to MySQL server on 'XXX' (13)
- 使用Timer新线程定时查询数据库
- Oracle 学习之RMAN(九)BACKUP常用参数
- PCIe SSD KVM IO性能调优
- OpenSSL编程-RSA编程详解
- spring常用注解
- 程序员如何爱护自己的眼睛
- windows cmd批处理
- VM虚拟机错误:Transport(VMDB)error -44:Message
- POJ 2001 Shortest Prefixes【字典树】
- 在centos7 ubuntu15.04 上通过bosh-lite 搭建单机环境cloudfoundry
- *.ascx *.asax *.aspx.resx *.asax.resx是什么文件
- typedef struct与struct的区别
- LeetCode:Invert Binary Tree
- Android 基础控件之AutoCompleteTextView
- 跟我上“云”端(一)认识多租户
- 内存碎片及伙伴算法
- 常用排序算法之JavaScript实现