Hadoop学习(10)——Hbase介绍

一、Hbase介绍

1.1、Hbase简介

Hadoop Database(Hbase): 是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库;

利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为其分布式协同服务;

主要用来存储非结构化和半结构化的松散数据(列存 NoSQL 数据库)

1.2、HBase 数据模型

HBase是由row key,column family,column和cell(单元格)组成,row key确定唯一的一行,column family由若干column组成,column是表的字段,cell存储了实际的值或数据,如何访问单元格呢?必须通过列族和列。 

(1)ROW  KEY

  • 决定一行数据
  • 按照字典顺序排序的。
  • Row key只能存储64k的字节数据

(2)Column Family列族 & qualifier列

HBase表中的每个列都归属于某个列族,列族必须作为表模式(schema)定义的一部分预先给出。如 create ‘test’, ‘course’;

列名以列族作为前缀,每个“列族”都可以有多个列成员(column);如course:math, course:english, 新的列族成员(列)可以随后按需、动态加入;

权限控制、存储以及调优都是在列族层面进行的;

HBase把同一列族里面的数据存储在同一目录下,由几个文件保存

(3)Timestamp时间戳

在HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。

时间戳的类型是 64位整型。

时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。

时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。

(4)Cell单元格

由行和列的座标交叉决定;

单元格是有版本的;

单元格的内容是未解析的字节数组;
由{row key, column( =<family> +<qualifier>), version} 唯一确定的单元。
cell中的数据是没有类型的,全部是字节数组形式存贮。

(5)HLog(WAL log)

HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。

HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的KeyValue

 

1.3、HBase 架构

(1)Client

包含访问HBase的接口并维护cache来加快对HBase的访问

(2)Zookeeper

保证任何时候,集群中只有一个活跃master
存贮所有Region的寻址入口。
实时监控Region server的上线和下线信息。并实时通知Master
存储HBase的schema和table元数据

(3)Master

为Region server分配region
负责Region server的负载均衡
发现失效的Region server并重新分配其上的region
管理用户对table的增删改操作

(4)RegionServer

Region server维护region,处理对这些region的IO请求
Region server负责切分在运行过程中变得过大的region

(5)Region

HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据

每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region(裂变)

当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Regionserver 上。

HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不同的HRegion可以分布在不同的 HRegion server上

HRegion由一个或者多个Store组成,每个store保存一个columns family

每个Strore又由一个memStore和0至多个StoreFile组成。如图:StoreFile以HFile格式保存在HDFS上:

 

(6)Memstore storefile

      一个region由多个store组成,一个store对应一个CF(列族

      store包括位于内存中的memstore和位于磁盘的storefile写操作先写入memstore,当memstore中的数据达到某个阈值,hregionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile

     当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile

     当一个region所有storefile的大小和数量超过一定阈值后,会把当前的region分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡

客户端检索数据,先在memstore找,找不到再找storefile

1.4、Hbase原理

HBase是依赖hadoop的,依赖hdfs的,HBase存储的所有数据其实是在DataNOde上面,数据是存在RegoinServer上面的,RegionServer里面的数据具体是存在DataNode上面的,HBase视觉上能看到的是RegoinServer和Hmaster两个节点,类似于NameNode和DataNode节点。HBase在操作表的时候有原数据,原数据存到zookeeper上

HBase内置有zookeeper,但一般我们会有其他的Zookeeper集群来监管master和regionserver,Zookeeper通过选举,保证任何时候,集群中只有一个活跃的HMaster,HMaster与HRegionServer 启动时会向ZooKeeper注册,存储所有HRegion的寻址入口,实时监控HRegionserver的上线和下线信息。并实时通知给HMaster,存储HBase的schema和table元数据,默认情况下,HBase 管理ZooKeeper 实例,Zookeeper的引入使得HMaster不再是单点故障。一般情况下会启动两个HMaster,非Active的HMaster会定期的和Active HMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个HMaster反而增加了Active HMaster的负担。

一个RegionServer可以包含多个HRegion,每个RegionServer维护一个HLog,和多个HFiles以及其对应的MemStore。RegionServer运行于DataNode上,数量可以与DatNode数量一致

1.5、Hbase使用场景

不支持事物的回滚和撤销;HBase直接在线上使用的话也是比较少的,一般还是关系型数据库处理实时的在线数据,处理完之后,定期再把数据弄到HBase上面,这个定期的频率很低,所以一般称之为,HBase接入的就是在线的业务

  • 如果数据有很多列,且包含很多空字段:如果数据有很多null字段,HBase压缩的时候,直接就不占空间了,而且整个列的存储方式,是可以面向不对称的、非结构化的数据的;
  • 数据包含了不定数量的列
  • 需要维护数据的版本
  • 需要很高的横向扩展性
  • 需要大量的压缩数据
  • 需要大量的I/O

何时不使用:

  • 数据总量不大时(比如就几个G)
  • 当需要JOIN以及关系型数据库的一些特性时
  • 如果关系型数据库可以满足需求

1.6Hbase特点

(1)结构:

  • 数据库以region的形式存在
  • 支持HDFS文件系统,当然也支持其他的上面关系型数据库的文件系统,包括其他的分布式系统(比如亚马逊的s3)
  • 使用WAL(Write-Ahead Logs)存储日志
  • 参考系统是Zookeeper
  • 使用行键(row key)
  • 支持分片
  • 使用行、列、列族和单元格

(2)功能

  • 支持向外扩展(即横向扩展,不需要升级原来集群里面的配置,只需要不停的往上加就可以了,这样的好处就是,如果不停的向外扩展的话,总有一个极限,硬件总会达到一个瓶颈,这个时候可以选择数量变多,这样的扩展就很好,这也是hbase火的一个原因)
  • 使用API和MapReduce来访问HBase表数据(上面看到put xxxx这样的语句,其实底层还是api,可以通过java代码去操作里面的数据,底层集成了MapReduce,比如HBase中间过程会产生一些小文件,这些小文件会严重影响集群性能,它会定期的在闲时的时候自动的通过MapReduce把小文件合并成大文件。)
  • 面向列,即每一列都是在某一页上的一个连续的单元。
  • rowkey是唯一的,但是不是单纯的数字递增的,比如还可以是abc helloworld,rowkey包含了若干个列族,若干个列,在访问某个列的时候,就会把整个rowkey存储单元全部读下来,暴扣里面的列族,这就是hbase的存储单元
  • 数据总量不依赖具体某台机器,而取决于机器数量(依赖于集群的数量)

  • HBase不支持ACID(Atomicity、Consistency、Isolation、Durability)

  • 适合结构化数据和非结构化数据:比如hive中的数据都是tab键隔开的就是结构化数据,rowkey中第一个列族里面有六列,第二个里面只有两列,有点类似java中的map Map<String,Map<String,String>> ,是无规律可循的,就像map里面还可以继续嵌套map,没有任何规律,对于数据的存储就是给一个key,给一个value,但是总不能确定value一定是string

  • 一般都是分布式的

  • HBase不支持事务

  • 不支持Join

  • 如果需要查询数据,只需要通过键值便可以成功访问

1.7、为什么HBase访问很快?

客户端去访问某一条数据的时候,先去内存里面找, MemStore是内存里面的结构化分区,MemStore和内存数据缓冲池,都是内存,只不过这两个东西在内存中的结构区分开了,客户端在访问数据的时候,会先去MemStore里面查看是否有数据,如果有的话直接就返回了,这种情况非常快,不会涉及到磁盘io,第二种情况是客户端去MemStore里面找数据没找到,会去内存缓冲池里面找,这个数据是怎么来的呢?是通过LRU算法,维护的都是最近操作的数据,因为他也是在内存中所以很快,如果没有的话,去region里面读,先读到内存缓冲池中,读完之后直接返回给客户端。如果新读进来内存缓冲池里面没有内存的话,就删除掉之前权重比较小的数据。
 

1.8、为什么hive和HBase很多时候要结合起来访问?

HBase可以和hive进行对接,hive和HBase之间可以通过sqoop进行数据的导入导出。HBase适合结构化和非结构化存储,而hive适合分析,HBase是不适合分析的,所以同HBase进行大量数据的存储,用hive进行大量数据的分析,小公司HBase用的不多,关系型数据库就能搞定

1.9、HBase的优缺点

优点:

  • 方便高效的压缩数据;
  • 支持快速数据检索:LRU算法、自动分区、LSM算法;
  • 管理和配置简单,支持横向扩展,所以非常容易扩展;
  • 聚合查询性能非常高:因为每个列都是一个单独的存储单元,对同一个列进行聚合的时候非常容易,比如说count就是一个聚合操作,如果把count应用在HBase的某一列上面,就特别的容易;
  • 可高效地进行分区,提供自动分区机制把大的region切分成小的subregion。

缺点:

  • 对JOIN以及多表合并数据的查询性能不好:需要通过MapReduce实现,在设计表的时候,把几十亿数据设计到一张表中就挺好;
  • 更新过程中有大量的写入和删除操作,需要频繁合并和分裂,降低存储效率;
  • 对关系模型支持不好,分区和索引模式设计比较困难。

二、HBase特征简要

2.1、自动故障处理和负载均衡

HBase运行在HDFS上,所以HBase中的数据以多副本形式存放,数据也服从分布式存放,数据的恢复也可以得到保障。另外,HMaster和RegionServer也是多副本的。
通过MapReduce不断的将小文件合并为大文件,本身就是负载均衡的机制,HMaster是高可用的,可以依赖zookeeper配置HMaster高可用

2.2、自动分区

HBase表是由分布在多个RegionServer中的region组成的,这些RegionServer又分布在不同的DataNode上,如果一个region增长到了一个阈值,为了负载均衡和减少IO,HBase可以自动或手动干预的将region切分为更小的region,也称之为subregion。

2.3、集成Hadoop/HDFS

虽然HBase也可以运行在其他的分布式文件系统之上,但是与HDFS结合非常之方便,而且HDFS也非常之流行。支持很多的文件系统,这里比较流行的hdfs

2.4、实时随机大数据访问

HBase采用log-structured merge-tree作为内部数据存储架构,这种架构会周期性地将小文件合并成大文件以减少磁盘访问同时减少NameNode压力。响应速度应该在毫秒级别的。

log-structured merge-tree log日志结构化的合并:

第一次内存中是没有树的,就可以新建一棵树,当里面的树存储到一定程度了,就把这个数据结构存到磁盘里面,存完之后又有新的数据往里面添加,会再建一棵树,然后数据又写满了,又放到磁盘里面,如此往复会产生很多这样的树,通过ls算法把这些树合并到一个,LSM算法是通过B tree和 B+ Tree 这两个算法演化而来的

2.5、MapReduce

HBase内建支持MapReduce框架,更加方便快速,并行的处理数据。
HBase本身是不支持join操作的,可以通过MapReduce实现类似的功能,但是不建议这样做,因为效率低。

2.6、Java API

HBase提供原声的Java API支持,方便开发。

2.7、横向扩展

HBase支持横向扩展,这就意味着如果现有服务器硬件性能出现瓶颈,不需要停掉现有集群提升硬件配置,而只需要在现有的正在运行的集群中添加新的机器节点即可,而且新的RegionServer一旦建立完毕,集群会开始重新调整。

2.8、列存储

HBase是面向列存储的,每个列都单独存储,所以在HBase中列是连续存储的,而行不是。

2.9、HBase Shell

HBase提供了交互式命令行工具可以进行创建表、添加数据、扫描数据、删除数据等操作和其他一些管理命令。
 

三、HBase 部署

3.1、伪分布式

(1)配置

1.hbase-env.sh中配置JAVA_HOME
2.配置hbase-site.xml如下
<property>
<name>hbase.rootdir</name>
<value>file:///home/testuser/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/testuser/zookeeper</value>
</property>

3.2、完全分布式

(1)前提

1Hadoop集群正常运行

2ZooKeeper集群正常运行

(2)配置

配置regionservers ,主机名
配置backup-masters
配置hbase-env.sh
配置JAVA_HOME
配置HBASE_MANAGERS_ZK=false
配置hbase-site.xml
添加hdfs-site.xml到conf目录下

启动Hbase: start-hbase.sh 

Hbase-site.xml:

<property>
<name>hbase.rootdir</name>
<value>hdfs://namenode.example.org:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node-a.example.com,node-b.example.com,node-c.example.com</value>
</property>

 

四、HBase Shell

通过 hbase shell命令进入HBase 命令行接口(通过help可查看所有命令的支持以及帮助手册)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章