1、一张图看懂 HBase :1 HBase在 Hadoop中的位置 又叫 HMaster,负责 HBase中 Table和 Region的管理,包括表的增删改查; Region Server的负载均衡, Region分布调整; Region分裂以及分裂后的 Region分配; Region Server失效后的 Region迁移等。 HBase(Hadoop Database)是一个开源的、 面向列 ( Column-Oriented)、适合 存储海量非结构化数据或半结构化数据 的、具备 高可靠性 、 高性能 、 可灵活扩展伸缩 的、支持 实时数据读写 的 分布式存储系统 。 Row Key T
2、ime Stamp ColumnFamily : contents ColumnFamily : anchor “n.www“ t9 anchor: = “CNN“ “n.www“ t8 anchor:my.look.ca = “CNN.com“ “n.www“ t6 contents:html = “.“ “n.www“ t5 contents:html = “.“ “n.www“ t3 contents:html = “.“ ColumnFamily01 ColumnFamily02 Col 01 Col 02 Col 03 Col 01 Col 02 Col 03 Col 04 Row-
3、01 Row-02 Row-03 Row-04 Row-05 Row-06 Row-07 Row-08 Row-09 Row-10 Row-11 Row-12 Row-13 Row-14 Row-15 HDFS YARN Hive Map Reduce HBase ZooKeeper BookKeeper AVROPig Sqoop 存储在 HBase中的表的典型特征: 大表( BigTable):一个表可以有上亿行,上百万列 面向列:面向列 (族 )的存储、检索与权限控制 稀疏:表中为空 (null)的列不占用存储空间 2 HBase集群典型部署组网 代表 HDFS集群, HBase中的数据
4、最终存储在 Data Node的块( Block)上。 HBase 系统架构 3 负责数据路由、数据读写和数据持久化,是HBase 的数据处理和计算单元,同时还负责区域的分割(即 Region Split)。 Region Server要求和 HDFS的 Data Node一起部署。 HBase数据模型 4 FaceBook、 eBay、淘宝们都在使用 HBase,用来存储 海量消息数据、搜索引擎抓取的网页、历史交易信息等。 行键,相当于关系表的主键,每一行数据的唯一标识。字符串、整数、二进制串都可以作为RowKey。所有记录按照 RowKey排序后存储。 每次数据操作对应的时间戳,数据按时间
5、戳区分版本,每个 Cell的多个版本的数据按时间倒序存储。 Column Family,列簇,一个表在水平方向上由一个或多个 CF组成。一个 CF可以由任意多个 Column组成。Column是 CF下的一个标签,可以在写入数据时任意添加,因此 CF支持动态扩展,无需预先定义 Column的数量和类型。 HBase中表的列非常稀疏,不同行的列的个数和类型都可以不同。此外,每个 CF都有独立的 TTL(生存周期)。可以只对行上锁,对行的操作始终是原始的。 HBase的物理存储结构 5 建表时默认只有一个 Region,如果指定 Split Key,就会有多个 Region。当表的记录行超过阈值,
6、表按水平方向分割成 2个Region,可把 Region理解为子表。当 Region的行数超过阈值,Region继续分裂。不同的Region被 HMaster分配给合适的 HRegionServer管理。每个Region都包含一个随机 ID,Region内的数据按照 Row Key有序存储。 存储在 HBase表每一行数据都有可排序的关键字( Row Key)和任意列项( Column & Column Family)。在 HBase中,仅能通过主键( Row Key)和主键版本号来检索数据, 仅支持单行事务。下面以 HBase存储搜索引擎的网页为例: HBase在进行数据存储时,物理上将同“
7、列簇”的数据存储在一起,不同“列簇”的数据分开存储。例如这里的 Store1-1对应存储表 Region1上的 CF1的所有数据,底层实际存储时为一个 HFile。 数据在写入时,首先写入预写日志( Write Ahead Log),每个 HRegion Server服务的所有 Region的写操作日志都存储在同一个日志文件中。数据并非直接写入 HDFS,而是等缓存到一定数量再批量写入,写入完成后在日志中做标记。 Zookeeper集群存储 -ROOT-表的地址和Master地址, Region Server主动向Zookeeper注册 , 使得 Master可随时感知各Region Serv
8、er的健康状态。 Zookeeper另一个重要作用是 避免 Master 单点故障( SPOF) 。 HRegionServer内部管理了一系列 HRegion对象,每个 HRegion对应Table中的一个 Region。HRegion由多个 Store组成。每个 Store对应Table中的一个 Column Family的存储, 即一个Store管理一个 Region上的一个列族( CF)。每个 Store包含一个MemStore和 0到多个StoreFile。 Store是HBase的 存储核心,由MemStore 和 StoreFile组成 。 Client使用 HBase的 RPC
9、机制与 HMaster、HRegionServer 进行通信 。 Client与 HMaster进行 管理类通信, 与 HRegion Server进行 数据操作类通信。 HDFS在文件系统根目录下为 HBase建立专用存储目录。 在 HBase目录下按照表名创建子目录。 在表名子目录下存放 HBase Region块目录。 在 Region块目录下按照所存放表的 CF建立子目录,同时该目录下有一个固定的文件 regioninfo目录。 regioninfo目录下建立的文件用来存放表的 Scheme信息。 Column Family下放置的是该 CF的 HFile文件。 HBase存储的数据都
10、是通过元数据来管理: -ROOT-: -ROOT-表存储 .META.表的索引数据信息。包含 .META.表的起始 key和结束 key,以及对应的 .META.表的 Region的位置信息 IP和 .META.表的Scheme信息 。 .META.: .META.表存储 User Region表的索引数据信息。包含 User Region表的起始 key和结束 key,以及对应的 Region的位置信息 IP和 User Region信息 。 User Region :在 HBase中 User Region是以 HFile的形式存在 HDFS的文件系统中,通过 HFile特定的文件结构实现
11、数据路由。 HBase Client Zookeeper HRegionServer HMaster HRegion Store MemStore StoreFile HFile StoreFile HFile HLogDFS Client DML MemStore是 一个有序的内存缓存区 ,用户写入的数据首先 放入 MemStore,当 MemStore满了以后 Flush成一个 StoreFile( 存储时对应为 HFile), 当 StoreFile数量增到一定阈值,触发Compact合并,将多个 StoreFiles合并成一个 StoreFile。StoreFiles 合并 后逐步形成
12、越来越大的 StoreFile, 当 Region内所有 StoreFiles( Hfile)的总 大小超过阈值( hbase.hregion.max.filesize)即 触发 分裂 Split,把当前 的Region Split成 2个 Region,父 Region下线,新 Split出的 2个孩子 Region被 HMaster分配到 合适的 HRegionServer 上,使得原先 1个 Region的压力得以分流到 2个 Region上 。 DataNode DataNode DataNode HRegionServer HRegion Store MemStore StoreFile HFile StoreFile HFile HLogDFS Client DataNode