本系列为大数据学习个人笔记,如有错误,欢迎指正,也欢迎各路朋友交流讨论。
What is NoSQL?
- A NoSQL (originally referring to “non SQL”, “non relational” or “not only SQL”) (最初指"非SQL")
- NoSql -> 不仅仅只有SQL.
- NoSQL是一个通用术语,用于指代不遵循传统RDBMS模型的任何数据存储 - 具体而言,数据是非关系型的,并且它不使用SQL作为主要查询语言。 它用于尝试解决可伸缩性和可用性问题的数据库,而不是原子性或一致性
Relational vs. NoSQL
- Relational(关系型数据库)
- 分为表,与外键,DB约束,标准化数据,通过SQL来操作
- NoSQL类的数据
- 以无模式格式存储,鼓励冗余,应用程序访问确定存储格式。 接口各不相同,并针对实现进行了优化,没有强制DB约束
What Are Tradeoffs from NoSQL?(什么是NoSQL的权衡)
- Eventual consistency (最终的一致性,为了性能牺牲了数据库的一致性)
- 强一致性:要执行update,RDB会里面立马执行数据的更新操作,把数据替换掉。
- 最终一致性:要执行update操作,会立马返回给客户端操作,并且在后台把需要update的数据标记。在某个时刻在做update并且同步到所有节点,更多的强调批处理,还有保证所有节点的数据同步。
- 应用程序增加了责任,例如维护一致性和处理事务,比如说hbase不支持整型,字符串,都是byte
CAP Theory(理论)
- Databases may only excel at 2 of 3 (数据库可能只擅长3个中的2个)
- Consistency:一致性
- Availability:高可用性
- PartitionTolerance:分区容错性
- 能否存储海量的数据
- 能否解决数据容错的问题
- NoSQL不提供"ACID"保证
- Nosql产品和RDB产品是各有利弊
- 相反,它提供了“最终的一致性”
Eventually Consistency(最终的一致性)
- 库存,帐户余额等应该是一致的,不适合nosql
- 像目录信息至少不需要马上显示出来)
- 比如域名解析:对数据的同步更新可以有一定的延迟,可以使用Nosql数据库
- 因此,在某些情况下,为了速度而牺牲一致性是可以的
Key-Value Stores
- 最普遍的,不一定是最受欢迎的
- 每个行都有一个大词典/关联数组
- Common on cloud platforms (常见于云平台)
- 例如Amazon SimpleDB,Azure表存储
- MemcacheDB, Voldemort, Couchbase, DynamoDB (AWS), Dynomite, 【Redis】 and Riak
- 国内重点是【Redis】
Document Stores
- Documents are typically JSON objects (文档通常是JSON对象)
- Each document has properties and values (每个文档都有属性和值)
- 值可以是数组、他数据库中的文档的链接或子文档(即包含JSON对象——允许分层存储)
- Old versions are retained (保留旧版本)
- Most popular with developers, startups, VCs (最受开发者、初创公司和风投公司欢迎)
- CouchDB, MongoDB, CouchBase
What is Apache HBase
HBase产生背景:
HBase,Cassandra,CouchDB,Dynamo 和 MongoDB 都是一些存储大量数据和以随机方式访问数据的数据库,这是HDFS和Hive做不到的地方。
HBase 是 Hadoop Database 的简称,Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。
HBase 项目是由 Powerset 公司的 Chad Walters 和 Jim Kelleman 在2006年末发起,根据 Google 的Chang 等人发表的论文"Bigtable:A Distributed Storage System for Strctured Data"来设计的。
- 2007年10月发布了第一个版本。 2010年5月,HBase 从 Hadoop 子项目升级成 Apache 顶级项目。
- HBase 是 BigTable 的开源(源码使用Java编写)版本。是 Apache Hadoop 的数据库,是建立在HDFS 之上,被设计用来提供高可靠性、高性能、列存储、可伸缩、多版本的 NoSQL 的分布式数据存储系统,实现对大型数据的实时、随机的读写访问。
- HBase依赖于HDFS做底层的数据存储,BigTable依赖Google GFS做数据存储
- HBase依赖于MapReduce做数据计算,BigTable依赖Google MapReduce做数据计算
- HBase依赖于ZooKeeper做服务协调,BigTable依赖Google Chubby做服务协调
- 与 Hadoop 一样,HBase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。所以,HBase 是一个通过大量廉价机器解决海量数据的高速存储和读取的分布式数据库解决方案
- HBase特点总结
- 高并发,以扩展,解决海量数据集的随机实时增删改查
- HBase本质依然是Key-Value数据库,查询数据功能很简单,不支持join等复杂操作(可通过Hive支持来实现多表join等复杂操作,通过Hive绑定hbase的表做join)
- 不支持复杂的事务,只支持行级事务
- HBase中支持的数据类型:byte[](底层所有数据的存储都是字节数组)
- 主要用来存储结构化和半结构化的松散数据。
- HBase中的表的特点
- 大表:一个表可以有上十亿行,上百万列
- 面向列:列可以灵活指定,面向列(族)的存储和权限控制,列(簇)独立检索。
- 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
- 无严格模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列
Apache HBase Use Case
- Capturing Incremental Data – Time Series Data (捕获增量数据 - 时间序列数据)
- High volume, high velocity writes (高容量,高速写入)
- Information Exchange – Messaging (消息传递)
- High volume, high velocity write/read (高容量,高速写入/读取)
- Content Serving – Web Application Backend (内容服务 - Web应用程序后端)
- High volume, high velocity reads
HBase数据的写入过程:
- Client访问zookeeper,获取元数据存储所在的regionserver
- 通过刚刚获取的地址访问对应的regionserver,拿到对应的表存储的regionserver
- 去表所在的regionserver进行数据的添加
- 查找对应的region,在region中寻找列族,先向memstore中写入数据
- 当memstore写入的值变多,触发溢写操作(flush),进行文件的溢写,成为一个StoreFile
- 当溢写的文件过多时,会触发文件的合并(Compact)操作,合并有两种方式(major,minor)
HBase Architecture Advantages(HBase体系结构优势)
HBase provides the following benefits (HBase具有以下优点)
- Strong consistency model (健壮的一致性)
- when a write returns, all readers will see same value
- Scales automatically (自动扩展)
- Splits when regions become too large (当region变得太大时自动分裂)
- Uses HDFS to spread data and manage space (使用HDFS分散数据和管理空间)
- Built-in recovery (内置恢复)
- Using a Write Ahead Log, similar to journaling on file system (写日志,便于恢复)
- Integrated with Hadoop (与Hadoop集成)
- MapReduce on HBase is straightforward (HBase上的MapReduce非常简单)
How to Access HBase – hbase shell
- HBase shell is an interactive mode of using hbase (HBase shell是一种使用HBase的交互模式)
- It support full set of hbase commands (它支持完整的hbase命令集)