Hadoop-HBase

Hadoop-HBase,第1张

Hadoop-HBase

 1.Hbase介绍   1.1Hbase简介

        Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。

        利用Hadoop HDFS作为其文件存储系统,利用Zookeeper作为其分布式协同服务主要用来存储非结构化 和半结构化的松散数据(列存 NoSQL 数据库)。

1.2Hbase优点 

        (1)容量大:Hbase单表可以有百亿列、百万列,数据矩阵横向和纵向两个维度所支持的数据量级都非常具有d性。、

        (2)面向列:面向列的存储和权限控制,并支持独立检索,可以动态增加列,即,可单独对列进行各方面的 *** 作 列式存储,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数量。

        (3)多版本:Hbase的每一个列的数据存储有多个Version,比如住址列,可能有多个变更,所以该列可以有多 个version

        (4)高可靠性:WAL机制,保证数据写入的时候不会因为集群异常而导致写入数据丢失 Replication(复制)机制,保证了在集群出现严重的问题时候,数据不会发生丢失或者损坏 Hbase底层使用HDFS,本身也有备份。

        (5)拓展性:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点服务(机器)就可以了。

        (6)高性能:底层的LSM数据结构和RowKey有序排列等架构上的独特设计,使得Hbase写入性能非常高。

2.Hbase数据模型

         Hbase 是一个稀疏的、分布式、持久、多维、排序的映射,它以行键(row key),列簇(column Family),列名(Column Qualifier)和时间戳(timestamp)为索引。

2.1.NameSpace

         命名空间是类似于关系数据库系统中的数据库的概念,它其实是表的逻辑分组。这种抽象为多租户相关功能奠定了基础。

命名空间是可以管理维护的,可以创建,删除或更改命名空间。

Hbase有两个特殊预定义的命名空间:

  • default-没有明确指定名称空间的表将自动落入此名称空间
  • hbase-系统命名空间,用于包含Hbase内部表
2.2.Table    

 Hbase的table由多个行组成。

2.3.RowKey 
  •  RowKey 是用来检索记录的主键,是一行数据的唯一标识
  •  RowKey行键 (RowKey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10- 100bytes),RowKey以字节数组保存。
  • 存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分排序存储这个 特性,将经常一起读取的行存储放到一起。
2.4.Column Family
  • 列族在物理上包含了许多的列与列的值,每个列族都有一些存储的属性可配置
  • 将功能属性相近的列放在同一个列族,而且同一个列族中的列会存放在同一个Store中
  • 列族一般需要在创建表的时候进行声明,而且一般一个表中的列族数不要超过3个(和后期的优化有关)
  • 列隶属于列族,列族隶属于表
2.5. Column Qualifier
  • 列族的限定词,理解为例的唯一标识,但是列标识是可以改变的,因此每一行可能有不同的列标识
  • 使用的时候必须 列族:列
  • 列可以根据需求动态添加或者删除,同一个表中不同行的数据列都可以不同
2.6. Timestamp
  • 通过rowkey和column family,column qualifier确定的一个存贮单元通过时间戳来索引
  • 每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面
  • 为了避免数据存在过多版本中造成管理 (包括存贮和索引)负担,Hbase 提供了两种数据版本回收方式。(一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天))。
2.7. Cell
  • Cell是由row,column family,column qualifier,version 组成的
  • Cell中的数据是没有类型的,全部是字节码形式存贮(因为HDFS上的数据都是字节数组)
3.Hbase访问方式 3.1. Hbase shell

我们可以先用Hbase提供的命令行工具,位于hbase的/bin/目录下

(1)进入退出

hbase shell(访问Hbase)

exit(退出)

(2)查看帮助信息

help

(3)查询服务器状态

status

(4)查看hive版本

 version

3.1.1Shell实现DDL *** 作 

1.创建一个表

语法:create '表命' , {NAME => , VERSIONS => }

例如:创建表t1,有两个family name:f1,f2,且版本数均为2例如:创建表t1,有两个family name:f1,f2,且版本数均为2

hbase(main)> create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}

还有一种非标准创建的语法,创建表member,列族是member_id,address,info,版本为1。如下: 

hbase(main):011:0>create 'member','member_id','address','info'

2.获得表的描述 

语法:describe

hbase(main):012:0>list

hbase(main):006:0>describe 'member'

 3.删除一个列族,alter,disable,enable

假设之前建了3个列族,但是发现member_id这个列族是多余的,因为他就是主键,所以我们要将其删除

hbase(main):003:0>alter 'member',{NAME=>'member_id',METHOD=>'delete'}

将表enable

 hbase(main):008:0> enable 'member'

4.列出所有的表

hbase(main):028:0>list 

 5.drop一个表

create 'temp_table','member_id','address','info'

hbase(main):029:0>disable 'temp_table'(删除表之前先将表禁用)

hbase(main):030:0>drop 'temp_table'

 6.truncate此命令将删除并重新创建一个表

truncate '表名'

3.1.2. Shell实现DML *** 作 

1.插入几条记录

put'member','guojing','info:age','24'

put'member','guojing','info:birthday','1987-06-17' put'member','guojing','info:company','alibaba'

注:现在表的数据都存在内存中,并没有落地到磁盘,如果这时想要落地到磁盘可以执行命令手动落地

命令:flush 'tablename'--(flush '表名')

 2.更新一条记录 将scutshuxue的年龄改成99

hbase(main):004:0>put 'member','scutshuxue','info:age' ,'99'

3. 删除id为temp的值的‘info:age’字段

hbase(main):016:0>delete 'member','temp','info:age'

 4.删除整行

hbase(main):001:0>deleteall 'member','xiaofeng' 

 5.查询表中有多少行

hbase(main):019:0>count 'member'

6.将整张表清空 

hbase(main):035:0>truncate 'member'

 3.1.3Shell实现DQL *** 作

1.获取一个Id的所有数据

hbase(main):001:0>get 'member','linghuchong'

 2.获取一个id,一个列族的所有数据

hbase(main):002:0>get 'member','linghuchong','info'

 3.获取一个id,一个列族中一个列的所有数据

hbase(main):002:0>get 'member','linghuchong','info:age'

4全表扫描

 hbase(main):013:0>scan 'member'

 4. Hbase架构模型

Hbase有三个主要组成部分:客户端库,主服务器和区域服务器。 

 4.1.Client

1.客户端负责发送请求到数据库,客户端连接的方式有很多种

  • hbase shell
  • 类JDBC

 2.发送的请求主要包括

  • DDL:数据库定义语言(表的建立,删除,添加删除列族,控制版本)
  • DML:数据库 *** 作语言(增删改)
  • DQL:数据库查询语言(查询--全表扫描--基于主键--基于过滤器)

3.client维护着一些cache来加快对hbase的访问,比如regione的位置信息 

4.2.HMaster

        1.Hbase集群的主节点,HMaster也可以实现高可用(active--standby),通过Zookeeper来维护主副节点的切换。

        2.为Region server分配region并负责region server的负载均衡。

        3.管理用户对table的结构DDL(创建,删除,修改) *** 作。

        4.当HRegionServer下线的时候,HMaster会将当前HRegionServer上的Region转移到其他的 HRegionServer。

4.3.zookeeper 

        1.保证任何时候,集群中只有一个master

        2.存贮所有Region的寻址入口,存储所有的的元数据信息。

        3.实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master

        4.存储Hbase的schema,包括有哪些table,每个table有哪些column famil

4.4. HRegionServer

        1.Region server属于Hbase具体数据的管理者

        2.Region server维护Master分配给它的region,处理对这些region的IO请求

        3.会实时的和HMaster保持心跳,汇报当前节点的信息

        4.当接收到Hmaster命令创建表的时候,分配一个Region对应一张表

        5.Region server负责切分在运行过程中变得过大的region

        6.当客户端发送DML和DQL *** 作的时候,HRegionServer负责和客户端建立连接

        7.当意外关闭的时候,当前节点的Region会被其他HRegionServer管理

4.5.HRegion 

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

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

        3.每个表一开始只有一个region,一个Region只属于一张表,随着数据不断插入表,region不断增大。

        4.Region达到阈值10G的时候会被平分(逻辑上平分,尽量保证数据的完整性)。切分后的其中一个Region转移到其他的HRegionServer上管理。

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

        6.为了防止前期数据的处理都集中在一个HRegionServer,我们可以根据自己的业务进行预分区。

4.6.Store 

        1.HRegion是表获取和分布的基本元素,由一个或者多个Store组成,每个store保存一个columns family。

        2.每个Store又由1个memStore和0或多个StoreFile组成。

        MemStore:当数据最开始优先写入到MemStore,当Flush的时候才会被写入到磁盘,默认情况下一个MemStore的大小为128M,当客户端向数据库插入数据的时候,当内存使用到128的时候,直接重新申请128M的空间,数据直接写入到新内存中,原来已经满的数据写到HDFS,称为HFile。

        StoreFile:数据存储文件的映射,对应HDFS上的HFile,一个Table对应多个Region,一个Region对应多个Store,一个Store对应一个MemStore和多个StoreFile,多个StoreFile内部有序,但是外部无序。集群会设置一些阈值,当达到阈值的时候开始将小文件合并成大文件。

4.7.Hlog

        1.一个HRegionServer只有一个Log文档 。

        2.WAL(Write After Log)做任何 *** 作之前先写日志,日志也会存储到HDFS,以后MemStore丢失数据或者RegionServer异常都能通过日志进行恢复,一个RegionServer对应一个HLog.

5. Hbase读写流程  5.1读取数据流程    

(1) Client访问zookeeper,获取hbase:meta所在RegionServer的节点信息。

(2) Client访问hbase:meta所在的RegionServer,获取hbase:meta记录的元数据后先加载到内存中,然后再从内存中根据需要查询的RowKey查询出RowKey所在的Region的相关信息(Region所 在RegionServer)

(3) Client访问RowKey所在的Region对应的RegionServer,发送数据读取请求

(4) RegionServer构建RegionScanner(需要查询的RowKey分布在多少个Region中就需要构建多少个RegionScanner),用于对该Region的数据检索

(5) RegionScanner构建StoreScanner(Region中有多少个Store就需要构建多少个StoreScanner, Store的数量取决于Table的ColumnFamily的数量),用于对该列族的数据检索

 (6) 多个StoreScanner合并构建最小堆(已排序的完全二叉树)StoreHeap:PriorityQueue

(7) StoreScanner构建一个MemStoreScanner和一个或多个StoreFileScanner(数量取决于 StoreFile数量)

(8) 过滤掉某些能够确定所要查询的RowKey一定不在StoreFile内的对应的StoreFileScanner或MemStoreScanner

(9) 经过筛选后留下的Scanner开始做读取数据的准备,将对应的StoreFile定位到满足的RowKey的 起始位置

(10) 将所有的StoreFileScanner和MemStoreScanner合并构建最小堆KeyValueHeap:PriorityQueue,排序的规则按照KeyValue从小到大排序

(11) 从KeyValueHeap:PriorityQueue中经过一系列筛选后一行行的得到需要查询的KeyValue。

5.2写入数据流程

(1) 首先客户端和RegionServer建立连接

(2) 然后将DML要做的 *** 作写入到日志wal-log

(3) 然后将数据的修改更新到memstore中,然后本次 *** 作结束(一个region由多个store组成,一个store对应一个CF(列族),store包括位于内存中的memstore和位于磁盘的storefie,写 *** 作先写入memstore)

(4) 当memstore数据写到阈值之后,创建一个新的memstore

(5) 旧的memstore写成一个独立的storefile,regionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile,存放到hdfs。

(6) 当storefile文件的数量增长到一定阈值后,系统会进行合并

(7)在合并过程中会进行版本合并和删除工作,形成更大的storefile

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

(9) Store负责管理当前列族的数据

(10) 当我们进行数据DML的时候,以插入数据为例

  •         我们会将数据先存储到memstore中,当memstore达到阈值(128M)
  •         首先创建一个新的memstore
  •         然后会将memstore中的数据写成一个storefile,storefile会存储到hdfs上

(11) 随着时间的推移:

  •         HFile中会存放大量的失效数据(删除,修改)
  •         会产生读个HFile
  •         等达到阈值(时间、数量)会进行合并,多个HFile合并成一个大的HFile,合并会触发连锁反应,相邻的store也会进行合并

(12) 在Hbase中,表被分割成多个更小的块然后分散的存储在不同的服务器上,这些小块叫做 Regions,存放Regions的地方叫做RegionServer。Master进程负责处理不同的RegionServer之间 的Region的分发。在Hbase实现中HRegionServer和HRegion类代表RegionServer和Region。 HRegionServer除了包含一些HRegions之外,还处理两种类型的文件用于数据存储。

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5636140.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存