1.初识Hbase


一、Hbase介绍:

  (HBase的默认端口号:60010)

   一个分布式、可扩展的支持海量数据存储的NoSQL数据库,基于HDFS分布式文件系统,利用zookeeper作为协同服务去构建的。他的数据是存储在HDFS之上。主要用来存储非结构化和半结构化的松散数据。(所以启动的时候先启动HDFS和zookeeper)

 

 

 一个列簇包含有多个列(一个H表中尽量少的设计列簇,而列可以随意多)。

真正往HDFS上存储的就是store的内容。

Region就是表的切片,一个表被分成多个Region。

 特点:

    1.低成本;

    2.高并发的随机写;

    3.支持实时查询;

    4.存储海量数据;(上亿行,上百万列)

    5.数据的“结构”非常灵活;

    6.面向列(簇)的存储和权限控制,独立检索(仅能通过主键(row key)和主键的range来检索数据)

    7.表设计稀疏:值为空的列不占空间

  

  学习HBase最好不要用RDBMS类型来理解,Hbase是面向列(实际上是列簇),而传统的关系型数据库是面向行存储的。

 


 二、Hbase入门:

首先来理解几个概念

1.Row Key:行键

  用来检索记录的主键。

  访问Hbase table中的行,只有三种形式:

    A、通过单个row key访问

    B、通过row key 的range

    C、全表扫描

  行键 (Row key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。

  存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)

  注意:

  字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。

 

2、Columns Family:列簇

  Hbase表中的每个列,都属于某个列簇,一个列簇可包含多个列。列名都以列簇为前缀。例如:student : name , student : age 这两个列,都属于student这个列簇。


3、Time Stamp:时间戳

  Hbase中通过rowkey和columns确定的为一个存储单元称为cell。每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是64位整型。时间戳可以由

Hbase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显示赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。

每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面

  为了避免数据存在过多版本造成的管理(包括存储和索引)负担,Hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,而是保存最近一段时间内的版本(比如最近7天)。用户可以针对每个列簇进行设置。


4、Cell:单元

  由{row key,columnFamily,version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存储。(hbase底层就是字节数组)。

 


三、Hbase架构

系统架构图:

Hbase中的角色:

1. 一个或者多个(高可用)主节点:Hmaster

  Hmaster可以有多个,通过zookeeper的Master Election机制,活跃状态的只有一个。

  主要负责Table和Region的管理工作:

    1.   管理用户对表的增删改查操作(注意是对表!!!DDL!!!不是对表数据DML!!!)
    2.   管理HRegionServer的负载均衡,调整Region分布
    3.   Region Split后,负责新Region的分布
    4.   在HRegionServer停机后,负责失效HRegionServer上Region迁移

 

2. Hbase依赖项:zookeeper

  Zookeeper Quorum 存储-ROOT-表地址、Hmaster地址。

  客户端首先联系ZooKeeper子集群(quorum)(一个由ZooKeeper节点组成的单独集群)查找行健。上述过程是通过ZooKeeper获取含有-ROOT-的region服务器名(主机名)来完成的。通过含有-ROOT-的region服务器可以查询到含有.META.表中对应的region服务器名,其中包含请求的行健信息。这两处的主要内容都被缓存下来了,并且都只查询一次。最终,通过查询.META服务器来获取客户端查询的行健数据所在region的服务器名。一旦知道了数据的实际位置,即region的位置,HBase会缓存这次查询的信息,同时直接联系管理实际数据的HRegionServer。所以,之后客户端可以通过缓存信息很好地定位所需的数据位置,而不用再次查找.META.表。

  以上也正是Hbase虽然基于HDFS但任然高效的原因所在。

 

3.多个从节点:HregionServer

  Hbase中核心部分,主要负责响应客户端的I/O请求,向HDFS系统进行读写。负责管理Region对象。它是对表的数据进行增删改查DML,注意区分开他和Hmaster的分工。

 4.Hregion

  Hbase表中行的方向上分隔为多个Hregion。不同的Hregion可以分布在不同的HregionServer上,但同一个Hregion只能放在一个HregionServer上。

  Hregion按照大小进行分隔,一个表初始只有一个region,随着数据不断增加,region也在不断扩大,当达到某一个阈值(默认128M,有些地方说256M,有待考察。。。) 时就会随分成2个region。Split

  每一个Region由以下两部分确定:

    1.表名+startRowKey+创建时间

    2.由目录表(-ROOT-和.META.)记录该region的endRowKey。

  那么我们如何定位Hregion?====>三层结构:

    1.   通过zookeeper里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一个region。
    2.   通过-ROOT-表查找.META.表的第一个表中相应的region的位置。.META.表中的每一个region在-ROOT-表中都是一行记录。
    3.   通过.META.表找到所要的用户表region的位置。用户表中的每个region在.META表中都是一行记录

    以上三层结构就像一个分布式的B+树,-ROOT-永远只有一个region,他是根。

  Table和Hregion的关系:

    table默认最初只有一个region,随着记录数的不断增加而变大,起初的region会逐渐分裂成多个region,一个region由【startKey, endKey】表示,不同的region会被master分配给相应的regionserver管理。region是hbase分布式存储和负载均衡的最小单元,不同的region分到不同的regionServer。region虽然是分布式存储的最小单元,但并不是存储的最小单元。region是由一个或者多个store组成的,每个store就是一个column family。每个store又由memStore和1至多个store file 组成(memstore到一个阀值会刷新,写入到storefile,有hlog来保证数据的安全性,一个regionServer有且只有一个hlog)。

5.Hstore:

  HBase存储的核心。由MemStore和StoreFile组成。存储的其实就是我们的列簇。

 

6.Hlog:

  在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。

 

总结下:

  HMaster管理的是对库、表的操作(DDL),HRegionServer管理的是对表里数据的操作(DML);

  HMaster还负责管理Hregion具体往那个HRegionServer上分布(负载均衡);

  HregionServer管理着Hregion和Hlog;

  Hregion其实就是表中的多行数据(整行),他包含Store和MemStore;

  Store中其实存储的就是列簇;

  Hlog里记录的是你的数据的操作,因为一切操作在内存上完成,假如内存崩掉,数据

就会丢失,这时Hlog记录了你的操作,他会进行落盘。


 

 下篇讨论Hbase的读写流程。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM