hbase 是 nosql的一种。nosql的话,不需要sql作为查询语言,也不需要固定的表模式(table schema),也不怎么有sql的join操作,一般都能水平扩展,放宽ACID属性(因为CAP定理)。Hbase是C+P类型的,强一致性(仅支持单行事务)。最常见的应用场景还是采集的网页数据的存储,日志信息的存储,不需要完全结构化的应用。hbase 是 OLTP应用为主。
hive不一样,针对OLAP应用,底层不是hbase(支持么?),而是hdfs。存储靠hdfs,所以所谓的hive表,就是纯逻辑表,只是表的定义,即表的元数据。hive告诉机器,如何将数据文件解析,然后结构化为一张数据库表,并提供sql查询。hive一般用于查询分析统计,而不是其他的CUD操作,他去做增量实时同步相当困难。
hive是基于MR处理数据,MR是基于行的处理,hbase是基于列的处理,适合大数据的随机访问。hbase的表是稀疏的存储,用户可以给行定义各种不同的列,而hive是稠密的,定义了多少列,那么每一行都有存储固定列数的数据。hive因为是MR,所以数据处理不能低延迟,而hbase支持实时查询。hive不提供 row-level的更新,他适合的是 append-only的数据批处理,比如日志。而hbase,支持row-level的更新。hql是完整的sql实现,分析历史数据绝佳。而hbase不适用于有join,多级索引,表关系复杂的应用场景。
mysql,oracle之类的RDBM,主要还是结构化,事务一致性要求高,业务规则逻辑复杂,数据模型复杂的应用。当然如果技术够,用hbase也无不可,更何况hbase的伸缩性好,数量级比mysql至少高一个量级。RDBMS本身也可以做水平扩展,如主从复制,分片(sharding),来提高性能。主从实现读写分离,写一台,读多台。对于大数据集,主节点需要将数据复制到从节点,关键读取可能不准确,因为写还没有来得及向下传播。分片,垂直分区,将不需要进行联合查询的数据表分散到不同的服务器上,水平分区,将同一张表的记录拆分到不同的表甚至服务器,但是需要一种读取的算法能正确从不同的服务器上取到数据。
CAP理论
分布式系统只能满足三项中的两项,做不到全部:1.一致性(consistency)2.可用性(availability)3.分区容忍性(partition tolerance)
一致性就是所有节点同一时间具有相同数据,可用性就是保证每次请求都有相应,无论成功与否,分区容忍性就是任意信息的丢失或失败不影响系统的继续运作。对于分布式数据系统,分区容忍性是基本要求,否则无价值,因此只能在一致性和可用性选一个牺牲。放款一致性,只是牺牲强一致性,可以达到最终一致性。
一致性有两种,ACID和BASE。ACID 就是强一致性,要求关系型数据库,要求更新过的数据能被后续所有的访问都看到。BASE是弱一致性,基本可用,不要求所有事件都一致,最终能一致性。