BigTable
- HDFS:分布式文件系统
- MapReduce:分布式计算框架
- Hive:数据仓库。用来计算分析数据
最下面两层是数据存储
上面两层做数据分析
1、非关系型数据库
- cassandra hbase mongodb
- counchdb 文件存储数据库
- Neo4j非关系型图数据库
2、HBase简介:
- Hadoop Database,是一个高可靠、高性能、面向列(面向列的键值对格式。没有固定的列数,随着插入的数据来决定,有可能第一行两列,下一行三列)、可伸缩(可以动态的扩展机器,不需要暂停当前集群的服务,可以扩充或减少机器)、实时读写(支持海量数据的快速查询)的分布式数据库
- 利用HadoopHDFS作为其文件存储系统,利用hadoop MapReduce来处理HBase中的海量数据,利用zookeeper做为其分布式协同服务
- 主要用来存储非结构化和半结构化的松散数据
3、HBase数据模型:
- KEY=Row Key+时间戳+列族(column family)+列名,来唯一的确定一个值。
- 不存在删除更新操作,等到溢写和文件合并时将失效标记的数据删除。
- 一行里面可能包含n多个列,每个列一定是属于某个列族(column family)的(面向列存储)
- ROW KEY
- 决定一行数据(类似于mysql中的主键)
- 按照字典顺序排序的
- Row key只能存储64k的字节数据 (64*1024byte)(一般只存10-100byte)
- Column Family列族
- HBase表中的每个列都归属于某个列族,列族必须作为表模式定义的一部分预先给出。HBase表创建的时候不需要指定列,列是伴随着插入数据值的时候指定的。 但是定义表的时候必须给出列族,才能知道数据存放到哪个列族里面去。
- 列名以列族作为前缀,每个列族都可以有多个列成员;如course:math,course:english,新的列族成员(列)可以随后按需、动态加入;
- 权限控制、存储以及调优都是在列族层面进行的;(最小粒度就是列族,该列族下的所有列都具有相同的属性)
- HBase把同一列族里面的数据存储在同一目录下,由几个文件保存。
- Timestamp时间戳
- 在HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。
- 时间戳的类型是64位整型
- 时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间
- 时间戳也可以由客户显示赋值(但一般不用),如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳
- Cell单元格
- 由行和列的坐标交叉决定
- 单元格是由版本的(timestamp)
- 单元格的内容是未解析的字节数组
- 由{row key,列族+列名+版本} 唯一确定的单元
- cell中的数据是没有类型的,全部是字节数组形式存储
- HLog(WAL log (write ahead log预写日志))
- 记录操作信息和值信息,为了防止数据丢失,恢复时使用
- HLog文件就是一个普通的Hadoop Sequence File,Sequence File的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括sequence number和timestamp,timestamp是写入时间,sequencenumber 的起始值为0,或者是最近一次存入文件系统中的sequence number。
- HLog Sequence File的value是HBase的KeyValue对象,即对应HFile中的KeyValue
4、HBase架构
-
角色(服务):namenode datanode resourcemanager nodemanager等等,它们各自承担一部分功能
-
HBase也有角色
- client:访问zookeeper,hmaster也访问zookeeper,client不直接和HMaster交互。zookeeper类似于一个数据中心。client访问zk得到元数据信息,hm将元数据信息存到zk中。
- zookeeper:高可用+分布式协作服务(存储一些元数据的元数据)
- HMaster
- 在HBase中是一个主从架构,并非主备架构,主备结构是做同一件事,主从架构类似于resourcemanager和nodemanager,分工合作
- HRegionServer:HBase的从节点。
- 承担具体的查询存储等工作
-
启动集群,hm和hrs的服务被启动,启动完之后,hm和hrs做交互,他们之间有心跳机制。zk和hrs也要通讯,因为zk主要负责消息发布订阅,当hmaster启动完之后要告诉zk我是一个master,已经启动完毕。hrs也需要向zk做同样的汇报。
-
client提交一个请求,先访问zk,zk存储的是元数据,zk提供的元数据并不是特别多,只能存 1M。所以zk中的数据是元数据的元数据,即元数据存放在哪个位置等。
-
当client拿到元数据信息后再访问hrs。hrs记录的是所有表的所有相关信息,查到对应的表,得到对应的startkey和endkey,(因为row key是按字典序排序,相邻的一组数据放在连续的空间内),再到对应的节点上拿取表的数据。
-
1、访问zk,拿元数据所在节点的位置信息;2、访问元数据所在的那台hrs;3、去对应的hregionserver访问表里面的数据
-
三步执行完之后,如果向表里面写数据,该表对应了某一个hregionserver或者某多个
- 先找到对应的HRegion(和表同一个层次,一个表至少有一个HRegion):里面有hlog和store(对应列族)
- 先写入到hlog中(数据丢失之后可以根据hlog恢复数据),先写入内存,然后由一个单独的线程检测该内存中是否有数据,如果有数据则写入hdfs中。(分两步,异步)(每60min打开一个新的日志文件,不可能只往一个日志文件中存)HLOG被当前Hregionserver中的所有hregion所共享。
- 再找到对应的store(列族),找到store之后,写到内存中MemStore(默认64M),对hdfs而言是小文件(因为默认的块是128M),当内存中达到阈值后会发生溢写,溢写之后变成一个一个的小文件称为storefile,storefile是hfile的封装,当小文件数目过多时会发生合并(合并的方式有两种)。当数据存储到hdfs上时叫hfile,只不过在HBASE内叫storefile。
- MemStore和StroeFile整体叫 LogStructMerge树,先写入内存(memstore),当内存满了再由另外一个线程往磁盘写(storefile)。
- 当磁盘是顺序写时,速度会较随机写快很多
- 当memstore满了,会被添加到溢写队列中然后开一个新的memstore
- MemStore和StroeFile整体叫 LogStructMerge树,先写入内存(memstore),当内存满了再由另外一个线程往磁盘写(storefile)。
-
1、访问zk,拿元数据所在节点的位置信息;2、访问元数据所在的那台hr;3、去对应的hregionserver访问表里面的数据
-
三步执行完之后,如果读数据,找到对应的hregion,先去memstore找,如果没有再去blockcache找(blockcche被每一个regionserver所共享),如果没有再去找磁盘,找完之后会把结果缓存blockcache(也是一块内存)中。存在一个淘汰机制,当blockcache中满了,谁先进来的谁先走。
-
各个角色承担的任务
-
client
- 包含访问HBase的接口(命令行、API)并维护cache(客户端缓存)来加快对HBase的访问
-
Zookeeper
- 保证任何时候,集群中只有一个活跃的master
- 存储所有region(所有表)的寻址入口,(表存储在哪个regionserver中(元数据的元数据))
- 实时监控region server的上线和下线信息。并实时通知master。
- 当rs不正常要通知master,因为rs原本存储了很多表的元数据,当该rs挂掉之后,如果不将它原本存储的元数据放到健康的rs中,那么对应的真实数据就无法被访问到了。真实数据文件是存储在hdfs中的,并没有丢失,还应该继续被访问。同样的当有空闲的rs时也应该告诉master,建表时可以存到该rs中。
- 存储hbase的schema和table元数据
-
Master
- 为RegionServer分配region(表)(来决定哪张表存到哪个rs中)
- 负责region server的负载均衡(不要出现某些特别忙,某些很闲的情况)
- 发现失效的region server并重新分配其上的region(表)
- 管理用户对table的增删改操作
-
Region Server
- rs维护region(表),处理对这些region的io请求
- rs负责切分在运行过程中变得过大的region,(等分,将另一半放在比较空闲的rs中。所以一个表对应n多个region,每一个region分布在不同的rs中,region有可能在同一台有可能不在同一台)
-
Region
-
HBase自动把表水平划分成多个region,每个region会保存一个表里面某段连续的数据
-
每一个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阈值的时候,region就会等分成两个新的region(裂变)
-
当table中的行不断增多,就会有越来越多的region。这样一个完整的表被保存在多个region server中。
-
Memstore与storefile
- 一个region由多个store组成,一个store对应一个列族
- store包括位于内存中的memstore和位于磁盘的storefile。写操作先写入memstore,当memestore中的数据达到某个阈值,hregionserver会启动flashcache进程写入storefile,每次形成单独的一个storefile
- 当storefile文件的数量增长到一定阈值后,(达到3个之后会合并)系统会进行合并(minor(3-10个文件)、major (当前region下的所有文件)compaction),在合并过程中会进行版本合并和删除工作(将失效标记的数据删除),形成更大的storefile
- 当一个region所有storefile的大小和数量超过一定阈值后,会把当前region分割为两个,并由hmaster分配到相应的regionserver,实现负载均衡
- 客户端检索数据,先在memstore找,找不到再找blockcache,找不到再找storefile。
-
HRegion是HBase中分布式存储和负载均衡的最小单元,最小单元就表示不同的HRegion可以分布在不同的HRegionserver上。
-
HRegion有一个或多个store组成,每个store保存一个column family(列族)
-
每个store又由一个memstore和0至多个storefile组成。 storefile以hfile格式保存在hdfs上
每一个regionserver包含多个region,每一个region包含多个storm,每一个storm由一个memstore和0至多个storefile组成。
row key按字典序排序,在memstore中会有一次排序,溢写出的小文件内部是有序的,文件与文件之间是无序的,所以文件合并时会对应一次排序。
-