Hadoop家族
1. Pig
对于非java程序人员,是看不懂java语句的 ,如何让DBA能够使用类似SQL的语句就能够对Hadoop进行数据分析等操作。
2. HBase
该思想下数据表只需要一张表就可以的,通过BigTable思想的映射就能够形成一个表。
3. Hive
4. zookeeper
5. Sqoop
6. Avro
7. Chukwa
8.Cassandra
一、HBase
HBase是一个分布式的、面向列的数据库,“一个结构化数据的分布式存储系统”,Hbase不同于一般的关系型数据库,并且是适合于非结构化的数据存储的数据库,Hbase是基于列而不是基于行的。
BigTable的想法:
学生表的例子S(s#, sn, sd, sa),存放为关系的学生表,以bigtable的方式考虑所有的二维关系表可以用三列来表示,第一个表示key是该数据的唯一性表示,第二个列是属性例如(学生的系别、年级等),第三列的表示值,这样对于任何数据表只需要一张表就行了,但是在该表上不等进行group by,联接合并等操作,但是对于key-value的查询操作速度是非常快的。
HBase的逻辑模型
以表形式存放数据,表有 行和列组成 ,每一列属于某一个列族,由行和列确定的存储单元称为元素。每个元素保存了同一份数据的多个版本,有时间戳来标识。
列族可以有多个。列族中存放的是key=value来表示。若是删除表,则会在表中添加删除标记而不是物理的删除。因为HBase中的数据是只读的,不允许修改部分,只能插 入或删除全部。Hbase会周期性的将小文件进行合并,若是被打上删除标记或时间戳比较旧的则直接删除即可。因此HBase是面向时间查询的。
行键
是数据行在表中的唯一标识,并作为搜索记录的主键。访问表里面的行有三种方式:1. 通过 单个行键访问;2.给定行键的范围访问;3.全表扫描
行键的最大长度不超过64kb的任意字符串,并按照字典序存储。对于经常一起读取的行 ,其行键需要精心设计。
列族与列
列表示:<列族>:<限定符>
HBase在磁盘上按照列族存放数据,key-value的格式如下图,每一个格式相当于一个数据单元,相当于B+树中的叶子节点,按照key进行排序。因此同一列族的会被 放在一起。列族的元素最好具有相同的读写方式(例如等长的字符串),以提高性能。
时间戳:
二、HBase的物理模型
表在行方向上,按照行键范围划分成若干的Region,每个表最初只有一个region,当记录数增加到超过某个阈值时,开始分裂成两个。物理上所有数据存放在HDFS, 由Region服务器提供region的管理,一台物理节点只能跑一个HRegionServer,一个Hregionserver可以管理多个Region实例,一个Region实例包括Hlog日志和存放 数据的Store,Hmaster作为总控节点,Zookeeper负责调度
HLog用于灾难恢复,预写是日志,记录所有更新操作,操作先记录进日志,数据才会写入。每一个Store表示一个列族
MemStore 与 Storefile
- 一个region由多个store组成,每个store包含一个列族的所有数据
- Store包括位于把内存的memstore和位于硬盘的storefile
- 写操作先写入memstore,当memstore中的数据量达到某个阈值,Hregionserver会启动flashcache进程写入storefile,每次写入形成单独一个storefile
- 当storefile文件的数量增长到一定阈值后,系统会进行合并,在合并过程中会进行版本合并和删除工作,形成更大的storefile
- 当storefile大小超过一定阈值后,会把当前的region分割为两个,并由Hmaster分配到相应的region服务器,实现负载均衡
- 客户端检索数据时,先在memstore找,找不到再找storefile
Hbase VS Oracle
1. 索引不同造成行为差异,
2. Hbase适合大量插入同时又有读的情况,只适合简单的key-value查看,不适合复杂的数据库操作。
3. Hbase的瓶颈是硬盘速度,Oracle的瓶颈是硬盘的寻道时间
4. Hbase很适合寻找按照时间排序 top n的场景。
传统数据库的行式存储
数据存放在数据文件内,数据文件的基本组成单位是块/页,块内结构:块头,数据区
行式存储的问题
读某个列必须读入整行,行不等长,修改数据可能导致行迁移,行数据较多是可能会导致行链。
BigTable是的LSM(Log Structured Merge Trees )索引,Hbase中数据和日志是一体化的。行标识访问使用B索引,缺点是空间代价,创建时间代价,维护代价较高,重复值多时影响效率。