HBase 列族数据库

数据模型

 我们可以将一个表想象成一个大的映射关系,通过行健、行健+时间戳或行键+列(列族:列修饰符),就可以定位特定数据,HBase是稀疏存储

数据的,因此某些列可以是空白的,

   


Row Key


Time Stamp


Column Family:c1


Column Family:c2






r1


t7


c1:1


value1-1/1


 


 


t6


c1:2


value1-1/2


 


 


t5


c1:3


value1-1/3


 


 


t4


 


 


c2:1


value1-2/1


t3


 


 


c2:2


value1-2/2


t2


t2


c1:1


value2-1/1


 


 


t1


 


 


c2:1


value2-1/1

从上表可以看出,test表有r1和r2两行数据,并且c1和c2两个列族,在r1中,列族c1有三条数据,列族c2有两条数据;在r2中,列族c1有一条数据,

列族c2有一条数据,每一条数据对应的时间戳都用数字来表示,编号越大表示数据越旧,反而表示数据越新。

3:物理视图

    虽然从概念视图来看每个表格是由很多行组成的,但是在物理存储上面,它是按照列来保存的。

   


Row Key


Time Stamp


Column Family:c1




r1


t7


c1:1


value1-1/1


t6


c1:2


value1-1/2


t5


c1:3


value1-1/3

             表:HBase数据的物理视图(1)

 


Row Key


Time Stamp


Column Family:c2




r1


t4


c2:1


value1-2/1


t3


c2:2


value1-2/2

          表:HBase数据的物理视图(2)

需要注意的是,在概念视图上面有些列是空白的,这样的列实际上并不会被存储,当请求这些空白的单元格时,会返回null值。如果在查询的时候不

提供时间戳,那么会返回距离现在最近的那一个版本的数据,因为在存储的时候,数据会按照时间戳来排序。

通过shell操作hbase 会更清楚结构

这里我们用一个学生成绩表作为例子,对HBase的基本操作和基本概念进行讲解:

 

下面是学生的成绩表:

name grad      course:math   course:art

Tom    1                87                    97

 

Jerry   2            100                  80

 

        这里grad对于表来说是一个列,course对于表来说是一个列族,这个列族由两个列组成:math和art,当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族.

 

        有了上面的想法和需求,我们就可以在HBase中建立相应的数据表啦!

 

1, 建立一个表格 scores 具有两个列族grad 和courese

 

hbase(main):002:0> create 'scores', 'grade', 'course'

 

0 row(s) in 4.1610 seconds

 

2,查看当先HBase中具有哪些表

 

hbase(main):003:0> list

 

scores

 

1 row(s) in 0.0210 seconds

 

3,查看表的构造

 

hbase(main):004:0> describe 'scores'

 

{NAME => 'scores', IS_ROOT => 'false', IS_META => 'false', FAMILIES => [{NAME => 'course', BLOOMFILTER => 'false', IN_MEMORY => 'false', LENGTH => '2147483647', BLOCKCACHE => 'false', VERSIONS => '3', TTL => '-1', COMPRESSION => 'NONE'}, {NAME => 'grade', BLOOMFILTER
=> 'false', IN_MEMORY => 'false', LENGTH => '2147483647', BLOCKCACHE => 'false', VERSIONS => '3', TTL => '-1', COMPRESSION => 'NONE'}]}

 

1 row(s) in 0.0130 seconds

 

4, 加入一行数据,行名称为 Tom 列族grad的列名为”” 值位1

 

hbase(main):005:0> put 'scores', 'Tom', 'grade:', '1'

 

0 row(s) in 0.0070 seconds

 

5,给Tom这一行的数据的列族添加一列 <math,87>

 

hbase(main):006:0> put 'scores', 'Tom', 'course:math', '87'

 

0 row(s) in 0.0040 seconds

 

6,给Tom这一行的数据的列族添加一列 <art,97>

 

hbase(main):007:0> put 'scores', 'Tom', 'course:art', '97'

 

0 row(s) in 0.0030 seconds

 

7, 加入一行数据,行名称为 Jerry 列族grad的列名为”” 值位2

 

hbase(main):008:0> put 'scores', 'Jerry', 'grade:', '2'

 

0 row(s) in 0.0040 seconds

 

8,给Jerry这一行的数据的列族添加一列 <math,100>

 

hbase(main):009:0> put 'scores', 'Jerry', 'course:math', '100'

 

0 row(s) in 0.0030 seconds

 

9,给Jerry这一行的数据的列族添加一列 <art,80>

 

hbase(main):010:0> put 'scores', 'Jerry', 'course:art', '80'

 

0 row(s) in 0.0050 seconds

 

10,查看scores表中Tom的相关数据

 

hbase(main):011:0> get 'scores', 'Tom'

 

COLUMN                       CELL

 

course:art                  timestamp=1224726394286, value=97

 

course:math                 timestamp=1224726377027, value=87

 

grade:                      timestamp=1224726360727, value=1

 

3 row(s) in 0.0070 seconds

 

11,查看scores表中所有数据

 

hbase(main):012:0> scan 'scores'

 

ROW                          COLUMN+CELL

 

Tom                         column=course:art, timestamp=1224726394286, value=97

 

Tom                         column=course:math, timestamp=1224726377027, value=87

 

Tom                         column=grade:, timestamp=1224726360727, value=1

 

Jerry                        column=course:art, timestamp=1224726424967, value=80

 

Jerry                        column=course:math, timestamp=1224726416145, value=100

 

Jerry                        column=grade:, timestamp=1224726404965, value=2

 

6 row(s) in 0.0410 seconds

 

12,查看scores表中所有数据courses列族的所有数据

 

hbase(main):013:0> scan 'scores', ['course:']

 

ROW                          COLUMN+CELL

 

Tom                         column=course:art, timestamp=1224726394286, value=97

 

Tom                         column=course:math, timestamp=1224726377027, value=87

 

Jerry                        column=course:art, timestamp=1224726424967, value=80

 

Jerry                        column=course:math, timestamp=1224726416145, value=100

 

4 row(s) in 0.0200 seconds

 

        上面就是HBase的基本shell操作的一个例子,可以看出,hbase的shell还是比较简单易用的,从中也可以看出HBase shell缺少很多传统sql中的一些类似于like等相关操作,当然,HBase作为BigTable的一个开源实现,而BigTable是作为 google业务的支持模型,很多sql语句中的一些东西可能还真的不需要.

一、   简介

history 

started by chad walters and jim

2006.11 G release paper on BigTable

2007.2 inital HBase prototype created as Hadoop contrib

2007.10 First useable Hbase

2008.1 Hadoop become Apache top-level project and Hbase becomes subproject

2008.10 Hbase 0.18,0.19 released

hbase是bigtable的开源山寨版本。是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。

它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。主要用来存储非结构化和半结构化的松散数据。

与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。

HBase中的表一般有这样的特点:

1 大:一个表可以有上亿行,上百万列

2 面向列:面向列(族)的存储和权限控制,列(族)独立检索。

3 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。

下面一幅图是Hbase在Hadoop Ecosystem中的位置。

二、   逻辑视图

HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族(row family)

Row Key column-family1 column-family2 column-family3
column1 column1 column1 column2 column3 column1
key1 t1:abc 
t2:gdxdf
t4:dfads 
t3:hello 
t2:world
key2 t3:abc 
t1:gdxdf
t4:dfads 
t3:hello
t2:dfdsfa 
t3:dfdf
key3 t2:dfadfasd 
t1:dfdasddsf

t2:dfxxdfasd

t1:taobao.com

Row Key

与nosql数据库们一样,row key是用来检索记录的主键。访问hbase table中的行,只有三种方式:

1 通过单个row key访问

2 通过row key的range

3 全表扫描

Row key行键 (Row key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。

存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)

注意:

字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。

行的一次读写是原子操作 (不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。

列族

hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如 courses:history   ,   courses:math   都属于   courses  这个列族。

访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能 帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因 为隐私的原因不能浏览所有数据)。

时间戳

HBase中通过row和columns确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

Cell

由 {row key, column(  =<family> + <label> ), version}  唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。

三、   物理存储

1 已经提到过,Table中的所有行都按照row key的字典序排列。

2 Table 在行的方向上分割为多个Hregion。

3 region按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Hregion就会等分会两个新的Hregion。当table中的行不断增多,就会有越来越多的Hregion。

4 Hregion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的Hregion可以分布在不同的HRegion server上。但一个Hregion是不会拆分到多个server上的。

5 HRegion虽然是分布式存储的最小单元,但并不是存储的最小单元。

事实上,HRegion由一个或者多个Store组成,每个store保存一个columns family。

每个Strore又由一个memStore和0至多个StoreFile组成。如图:

StoreFile以HFile格式保存在HDFS上。

HFile的格式为:

Trailer部分的格式:

HFile分为六个部分:

Data Block 段–保存表中的数据,这部分可以被压缩

Meta Block 段 (可选的)–保存用户自定义的kv对,可以被压缩。

File Info 段–Hfile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。

Data Block Index 段–Data Block的索引。每条索引的key是被索引的block的第一条记录的key。

Meta Block Index段 (可选的)–Meta Block的索引。

Trailer–这一段是定长的。保存了每一段的偏移量,读取一个HFile时,会首先 读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。DataBlock Index采用LRU机制淘汰。

HFile的Data Block,Meta Block通常采用压缩方式存储,压缩之后可以大大减少网络IO和磁盘IO,随之而来的开销当然是需要花费cpu进行压缩和解压缩。

目标Hfile的压缩支持两种方式:Gzip,Lzo。

HLog(WAL log)

WAL 意为Write ahead log(http://en.wikipedia.org/wiki/Write-ahead_logging),类似mysql中的binlog,用来 做灾难恢复只用,Hlog记录数据的所有变更,一旦数据修改,就可以从log中进行恢复。

每个Region Server维护一个Hlog,而不是每个Region一个。这样不同region(来自不同table)的日志会混在一起,这样做的目的是不断追加单个 文件相对于同时写多个文件而言,可以减少磁盘寻址次数,因此可以提高对table的写性能。带来的麻烦是,如果一台region server下线,为了恢复其上的region,需要将region server上的log进行拆分,然后分发到其它region server上进行恢复。

HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是”写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue,可参见上文描述。

四、   系统架构

Client

1 包含访问hbase的接口,client维护着一些cache来加快对hbase的访问,比如regione的位置信息。

Zookeeper

1 保证任何时候,集群中只有一个master

2 存贮所有Region的寻址入口。

3 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master

4 存储Hbase的schema,包括有哪些table,每个table有哪些column family

Master

1 为Region server分配region

2 负责region server的负载均衡

3 发现失效的region server并重新分配其上的region

4 GFS上的垃圾文件回收

5 处理schema更新请求

Region Server

1 Region server维护Master分配给它的region,处理对这些region的IO请求

2 Region server负责切分在运行过程中变得过大的region

可以看到,client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和region server,数据读写访问regione server),master仅仅维护者table和region的元数据信息,负载很低。

五、关键算法   /   流程

region定位

系统如何找到某个row key (或者某个 row key range)所在的region

bigtable 使用三层类似B+树的结构来保存region位置。

第一层是保存zookeeper里面的文件,它持有root region的位置。

第二层root region是.META.表的第一个region其中保存了.META.z表其它region的位置。通过root region,我们就可以访问.META.表的数据。

.META.是第三层,它是一个特殊的表,保存了hbase中所有数据表的region 位置信息。

说明:

1 root region永远不会被split,保证了最需要三次跳转,就能定位到任意region 。

2.META.表每行保存一个region的位置信息,row key 采用表名+表的最后一样编码而成。

3 为了加快访问,.META.表的全部region都保存在内存中。

假设,.META.表的一行在内存中大约占用1KB。并且每个region限制为128MB。

那么上面的三层结构可以保存的region数目为:

(128MB/1KB) * (128MB/1KB) = = 2(34)个region

4 client会将查询过的位置信息保存缓存起来,缓存不会主动失效,因此如果client上的缓存全部失效,则需要进行6次网络来回,才能定位到正确的region(其中三次用来发现缓存失效,另外三次用来获取位置信息)。

读写过程

上文提到,hbase使用MemStore和StoreFile存储对表的更新。

数据在更新时首先写入Log(WAL log)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并 且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。于此同时,系统会在zookeeper中 记录一个redo point,表示这个时刻之前的变更已经持久化了。(minor compact)

当系统出现意外时,可能导致内存(MemStore)中的数据丢失,此时使用Log(WAL log)来恢复checkpoint之后的数据。

前面提到过StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更 新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对 StoreFile进行split,等分为两个StoreFile。

由于对表的更新是不断追加的,处理读请求时,需要访问Store中全部的 StoreFile和MemStore,将他们的按照row key进行合并,由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引,合并的过程还是比较快。

写请求处理过程

1 client向region server提交写请求

2 region server找到目标region

3 region检查数据是否与schema一致

4 如果客户端没有指定版本,则获取当前系统时间作为数据版本

5 将更新写入WAL log

6 将更新写入Memstore

7 判断Memstore的是否需要flush为Store文件。

region分配

任何时刻,一个region只能分配给一个region server。master记录了当前有哪些可用的region server。以及当前哪些region分配给了哪些region server,哪些region还没有分配。当存在未分配的region,并且有一个region server上有可用空间时,master就给这个region server发送一个装载请求,把region分配给这个region server。region server得到请求后,就开始对此region提供服务。

region server上线

master使用zookeeper来跟踪region server状态。当某个region server启动时,会首先在zookeeper上的server目录下建立代表自己的文件,并获得该文件的独占锁。由于master订阅了server 目录上的变更消息,当server目录下的文件出现新增或删除操作时,master可以得到来自zookeeper的实时通知。因此一旦region server上线,master能马上得到消息。

region server下线

当region server下线时,它和zookeeper的会话断开,zookeeper而自动释放代表这台server的文件上的独占锁。而master不断轮询 server目录下文件的锁状态。如果master发现某个region server丢失了它自己的独占锁,(或者master连续几次和region server通信都无法成功),master就是尝试去获取代表这个region server的读写锁,一旦获取成功,就可以确定:

1 region server和zookeeper之间的网络断开了。

2 region server挂了。

的其中一种情况发生了,无论哪种情况,region server都无法继续为它的region提供服务了,此时master会删除server目录下代表这台region server的文件,并将这台region server的region分配给其它还活着的同志。

如果网络短暂出现问题导致region server丢失了它的锁,那么region server重新连接到zookeeper之后,只要代表它的文件还在,它就会不断尝试获取这个文件上的锁,一旦获取到了,就可以继续提供服务。

master上线

master启动进行以下步骤:

1 从zookeeper上获取唯一一个代码master的锁,用来阻止其它master成为master。

2 扫描zookeeper上的server目录,获得当前可用的region server列表。

3 和2中的每个region server通信,获得当前已分配的region和region server的对应关系。

4 扫描.META.region的集合,计算得到当前还未分配的region,将他们放入待分配region列表。

master下线

由于master只维护表和region的元数据,而不参与表数据IO的过 程,master下线仅导致所有元数据的修改被冻结(无法创建删除表,无法修改表的schema,无法进行region的负载均衡,无法处理region 上下线,无法进行region的合并,唯一例外的是region的split可以正常进行,因为只有region server参与),表的数据读写还可以正常进行。因此master下线短时间内对整个hbase集群没有影响。从上线过程可以看到,master保存的 信息全是可以冗余信息(都可以从系统其它地方收集到或者计算出来),因此,一般hbase集群中总是有一个master在提供服务,还有一个以上
的’master’在等待时机抢占它的位置。

六、访问接口

  • HBase Shell
  • Java clietn API
  • HBase non-java access
    • languages talking to the JVM
      • Jython interface to HBase
      • Groovy DSL for HBase
      • Scala interface to HBase
    • languages with a custom protocol
      • REST gateway specification for HBase
      • 充分利用HTTP协议:GET POST PUT DELETE

§

      • text/plain
      • text/xml
      • application/json
      • application/x-protobuf
    • Thrift gateway specification for HBase
      • java
      • cpp
      • rb
      • py
      • perl
      • php
  • HBase Map Reduce
  • Hive/Pig

七、结语:

全文对   Hbase做了   简单的介绍,有错误之处,敬请指正。未来将结合   Hbase  在淘宝数据平台的应用场景,在更多细节上进行深入

时间: 2024-11-02 14:58:10

HBase 列族数据库的相关文章

hbase源码系列(四)数据模型-表定义和列族定义的具体含义

hbase是一个KeyValue型的数据库,在<hbase实战>描述它的逻辑模型[行键,列族,列限定符,时间版本],物理模型是基于列族的.但实际情况是啥?还是上点代码吧. HTableDescriptor tableDesc = new HTableDescriptor("test"); //日志flush的时候是同步写,还是异步写 tableDesc.setDurability(Durability.SYNC_WAL); //MemStore大小 tableDesc.se

HBase最佳实践-列族设计优化

随着大数据的越来越普及,HBase也变得越来越流行.会用HBase现在已经变的并不困难,然而,怎么把它用的更好却并不简单.那怎么定义'用的好'呢?很简单,在保证系统稳定性.可用性的基础上能够用最少的系统资源(CPU,IO等)获得最好的性能(吞吐量,读写延迟)就是'用的好'.HBase是一个庞大的体系,涉及到很多方面,很多因素都会影响到系统性能和系统资源使用率,根据场景对这些配置进行优化会很大程度上提升系统的性能.笔者总结至少有如下几个方面:HDFS相关配置优化,HBase服务器端优化(GC优化.

《HBase权威指南》一1.5 HBase:Hadoop数据库

1.5 HBase:Hadoop数据库 看过BigTable的架构之后,我们可能会简单地认为HBase完全是Google的BigTable的开源实现.但是这个说法可能过于简单,因为两者之间还有些差异(大多是细微的)值得一提. 1.5.1 历史 HBase是Powerset㉑在2007年创建的,最初是Hadoop的一部分.之后,它逐步成为Apache软件基金会旗下的顶级项目,具备Apache软件许可证,版本为2.0. HBase项目的主页是http://hbase.apache.org/,通过这个

海量高性能列式数据库HiStore技术架构解析

HiStore 介绍 HiStore是阿里中间件团队研发的数据库产品,是一款基于独特的知识网格技术的列式数据库,定位于海量数据高压缩比列式存储,是低存 储成本,低维护成本,海量数据OLAP存储引擎;有效的解决了海量数据存储的成本问题,以及在百亿数据场景下支持实时高效的多维度自 由组合的检索. 关键字: 列式,分布式,高压缩比; 一.HiStore HiStore 专门针对OLAP应用程序进行设计和优化,在常规X86服务器上,HiStore可以在百亿数据场景下进行高性能,多维度自由组合 的adho

分布式列式数据库 IndexR 开源啦!

2017新年好!IndexR开源啦! IndexR是一个专注于大数据实时分析的分布式列式数据库,它基于HDFS,能快速分析海量结构化数据,支持实时导入并且查询秒级延迟,特别适合ad-hoc场景下的OLAP查询. IndexR具体实现参考并使用了众多优秀的开源项目,比如 Infobright,Hbase,Druid,Drill 等,与Hadoop生态圈深度结合.目前它主要通过作为Apache Hive和Apache Drill的插件来使用. IndexR已经正式开源.我们希望通过这种方式为开源社区

MySQL · 引擎特性 · Infobright 列存数据库

简介 系统架构 存储引擎 优化器和执行器 数据装载和卸载 领域知识 查询优化 简单场景的示例 小结 存储结构 Data Pack Knowledge Node 数据压缩 总结 简介 Infobright 是一个面向 OLAP 场景的开源列存数据库.比较容易找到代码的版本是 Infobright Community Edition 4.0.7,大概是 2006 年前后的代码.2016 年6 月,Infobright 决定停止开源1.由于它同时提供企业版和社区版,开源版本的功能相比企业版而言,肯定是

以前认为数据库就是一层,但现在学习的Hbase,HDFS的数据库,怎么感觉是多层?应怎样理解?

问题描述 以前认为数据库就是一层,但现在学习的Hbase,HDFS的数据库,怎么感觉是多层?应怎样理解? 以前学习数据库时,就只知道MySql,就这一个东西就是数据库. 但现在学习大数据,了解到 Titan graph数据库建立在HBase数据库之上,而HBase又要建立在HDFS之上. 这里就把数据库分成了三层,最顶层是Titan, 中间是HBase,下面是HDFS, 问题就是: 1.它们每层应该叫什么名字啊?顶层叫数据库框架吗?中间层叫后端数据库?底层叫分布式文件系统数据库? 2.它们各个组

海量高性能列式数据库HiStore介绍

HiStore是阿里中间件技术团队研发的数据库产品,是一款基于独特的知识网格技术的列式数据库,定位于海量数据高压缩比列式存储,是低存储成本,低维护成本,海量数据OLAP存储引擎:有效的解决了海量数据存储的成本问题,以及在百亿数据场景下支持实时高效的多维度自由组合的检索. HiStore的优势 • 存储数据量大:TB级数据大小,百亿条记录.数据量存储主要依赖自己提供的高速数据加载工具(2TB/小时)和高数据压缩比(>10:1): • 高压缩比:平均压缩比>10:1,远高于常规压缩算法,甚至可以达

《NoSQL权威指南》——2.1 列式数据库的历史

2.1 列式数据库的历史 列式存储以及倒排或不按顺序存储文件的方式并不是最新提出的.TAXIR是1969年为生物学建立的第一个列式数据库存储系统.加拿大统计局于1976年实现了RAPID系统,并将其用于加拿大人口和住房普查数据的处理和检索,以及其他与统计相关的一些应用.RAPID被拿来与世界各地的其他统计机构共享,并在20世纪80年代被广泛使用.直到20世纪90年代,它一直被加拿大统计局使用. 多年来,Sybase IQ是市面上唯一一个可以商用的列式DBMS.然而,当OLAP(online an