HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
学习整理:
-
hbase运行原理,rowkey的作用?
HBase 是一个高可靠、高性能、面向列、可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群。
HBase 中的每一张表就是所谓的 BigTable。BigTable 会存储一系列的行记录,行记录有三个基本类型的定义:Row Key、Time Stamp、Column。
- Row Key 是行在 BigTable 中的唯一标识(字典排序)。
- Time Stamp 是每次数据操作对应关联的时间戳,可以看做 SVN 的版本。
- Column 定义为< family>:< label>,通过这两部分可以指定唯一的数据的存储列,family 的定义和修改需要 对 HBase 进行类似于 DB 的 DDL 操作,而 label ,不需要定义直接可以使用,这也为动态定制列提供了一种手段 。family 另一个作用体现在物理存储优化读写操作上,同 family 的数据物理上保存的会比较临近,因此在业务设计的过程中可以利用这个特性。
- cell 是由{row key, column( = + ), version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。
在物理存储上, Table 在行的方向上分割为多个HRegion,每个HRegion分散在不同的RegionServer中,当HRegion大小达到一个阈值(默认256M)时会自动分裂成两个新的HRegion。HRegion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的Hregion可以分布在不同的HRegion server上。但一个Hregion是不会拆分到多个server上的。
HRegion
每个HRegion由多个Store构成,每个Store由一个memStore和0或多个StoreFile组成,每个Store保存一个Columns Family,每个storeFile以Hfile的格式存储在hdfs上。
Store
hbase存储架构如下:
image.png
从HBase的架构图上可以看出,HBase中的存储包括HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等,每个模块作用如下:
zookeeper作用:
- 保证任何时候,集群中只有一个master
- 存贮所有Region的寻址入口。
- 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master
- 存储Hbase的schema,包括有哪些table,每个table有哪些column family
HMaster的作用:
- 为Region server分配region。
- 负责Region server的负载均衡。
- 发现失效的Region server并重新分配其上的region。
- HDFS上的垃圾文件回收。
- 处理schema更新请求。
HRegionServer作用:
- 维护master分配给他的region,处理对这些region的io请求。
- 负责切分正在运行过程中变的过大的region。
可以看到,默认一个HRegion超过256M就要被分割成两个,这个过程由HRegionServer管理,而HRegion的分配由HMaster管理。client访问hbase上的数据并不需要master参与(寻址访问zookeeper和region server,数据读写访问region server),master仅仅维护table和region的元数据信息(table的元数据信息保存在zookeeper上),负载很低。
hbase使用三层结构来定位Region
ZooKeeper--> -ROOT-(单Region)--> .META.--> 用户表
- 通过zk里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一个region。
- 通过-ROOT-表查找.META.表的第一个表中相应的region的位置。其实-ROOT-表是.META.表的第一个region;.META.表中的每一个region在-ROOT-表中都是一行记录。
- .META. 表包含所有的用户空间region列表,以及RegionServer的服务器地址。
Client通过访问ZK来请求目标数据的地址。
ZK中保存了-ROOT-表的地址,所以ZK通过访问-ROOT-表来请求数据地址。
同样,-ROOT-表中保存的是.META.的信息,通过访问.META.表来获取具体的RS。
.META.表查询到具体RS信息后返回具体RS地址给Client。
Client端获取到目标地址后,然后直接向该地址发送数据请求。
同时,Client端有缓存,第一次查询到相应region所在RS后,这个信息将被缓存到Client端,以后每次访问都直接从缓存中获取RS地址即可。
Region数据写入:
- Client通过三层索引获得RS的地址后,即可向指定RS的对应region进行数据写入,HBase的数据写入采用WAL(write ahead log)的形式,先写log,后写数据。
- HBase是一个append类型的数据库,没有关系型数据库那么复杂的操作,所以记录HLog的操作都是简单的put操作(delete/update操作都被转化为put进行)
再来看看HRegion内部结构,帮助我们理解rowkey是怎样起作用的。
HRegion内部还包含:
- MemStore(memStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个阀值(默认64MB)时,memStore会被flush到文件,即生成一个快照。)
- StoreFile ( memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。)
- HLog(WAL log):WAL意为write ahead log,用来做灾难恢复使用,HLog记录数据的所有变更,一旦region server 宕机,就可以从log中进行恢复。
HFile是HBase中KeyValue数据的存储格式,是hadoop的二进制格式文件,机构如下:
HFile结构
HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。Trailer中有指针指向其他数据块的起始点,FileInfo记录了文件的一些meta信息。 Data Block是hbase io的基本单元,为了提高效率,HRegionServer中有基于LRU的block cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定(默认块大小64KB),大号的Block有利于顺序Scan,小号的Block利于随机查询。每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成,Magic内容就是一些随机数字,目的是防止数据损坏
- Data Block段用来保存表中的数据,这部分可以被压缩。
- Meta Block段(可选的)用来保存用户自定义的kv段,可以被压缩。
- FileInfo段用来保存HFile的元信息,不能被压缩,用户也可以在这一部分添加自己的元信息。
- Data Block Index段(可选的)用来保存Meta Blcok的索引。
- Trailer这一段是定长的,保存了每一段的偏移量。
读取一个HFile时,会首先读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。
DataBlock Index采用LRU机制淘汰。
HFile的Data Block,Meta Block通常采用压缩方式存储,压缩之后可以大大减少网络IO和磁盘IO,随之而来的开销当然是需要花费cpu进行压缩和解压缩。
备注: DataBlock Index的缺陷。 a) 占用过多内存 b) 启动加载时间缓慢
参见:
详解HBase架构原理:https://blog.csdn.net/qq_35732963/article/details/78901581
-
Mysql和Hbase数据同步方法?
主要是使用sqoop来传递数据到各个系统中去,先来介绍一下sqoop。
Apache Sqoop 被设计用于在一个 Hadoop 生态系统与 MySQL、Oracle、MS SQL、Postgre SQL 和 DB2® 等关系型数据库管理系统 (RDBMS) 中的结构化数据存储之间传输数据。作为 Hadoop 生态系统不可或缺的一部分,Sqoop 启用了一个 MapReduce 作业(极其容错的分布式并行计算)来执行任务。Sqoop 的另一大优势是其传输大量结构化或半结构化数据的过程是完全自动化的。
sqoop数据流架构
命令如下:
- 将mysql数据导入 HDFS
$ bin/sqoop import --connect jdbc:mysql://localhost:3306/hadoop
--driver com.mysql.jdbc.Driver --username root --password root --table bse30
$ bin/sqoop import --connect jdbc:mysql://localhost:3306/hadoop
--driver com.mysql.jdbc.Driver --username root --password root --table bsefmcg
- HDFS 导出数据到 mysql
$ bin/sqoop export --connect jdbc:mysql://localhost:3306/hadoop
--driver com.mysql.jdbc.Driver --username root --password root --table bse30
--export-dir /user/surajit/bse30
$ bin/sqoop export --connect jdbc:mysql://localhost:3306/hadoop
--driver com.mysql.jdbc.Driver --username root --password root --table bsefmcg
--export-dir /user/surajit/bsefmcg
- 将mysql数据导入 Hive
$ bin/sqoop create-hive-table --connect jdbc:mysql://localhost:3306/hadoop $ bin/sqoop create-hive-table --conn
--driver com.mysql.jdbc.Driver --username root --P --table bse30
$ bin/sqoop create-hive-table --connect jdbc:mysql://localhost:3306/hadoop
--driver com.mysql.jdbc.Driver --username root --P --table bsefmcg
- hive 导出数据到mysql
$ bin/sqoop export --connect jdbc:mysql://localhost:3306/hadoop
--driver com.mysql.jdbc.Driver --username root --password root --table bse30
--export-dir /user/hive/warehouse/bse30
$ bin/sqoop export --connect jdbc:mysql://localhost:3306/hadoop
--driver com.mysql.jdbc.Driver --username root --password root --table bsefmcg
--export-dir /user/hive/warehouse/bsefmcg
- 将mysql数据导入 HBase
bin/sqoop import --connect jdbc:mysql://localhost:3306/hadoop
--driver com.mysql.jdbc.Driver --username root --P --table bse30 --hbase-row-key date
--hbase-create-table --column-family firstdecade --hbase-table bse30
$ bin/sqoop import --connect jdbc:mysql://localhost:3306/hadoop
--driver com.mysql.jdbc.Driver --username root --P --table bsefmcg --hbase-row-key date
--hbase-create-table --column-family firstdecade --hbase-table bsefmcg
- 从 HBase 导出数据到HDFS
在从 HBase 导出数据到 HDFS 时,Sqoop 会创建序列文件。使用序列文件的一个限制是,没有用于访问序列文件中数据的通用方法。序列文件由 Java(可写)类文件创建,该类文件是 Sqoop 用代码生成的文件。这引入了一个严重问题:在将 Sqoop 升级到一个较新版本时,代码生成的类文件无法访问旧版 Sqoop 创建的序列文件。由于这一限制,不推荐使用 HBase 序列文件通过 Sqoop 导出操作。
参见:
Sqoop:NoSQL 与 RDBMS 之间的大数据管道:https://www.ibm.com/developerworks/cn/data/library/bd-sqoopconduit/index.html
TO BE CONTINUED ......
网友评论