HBase笔记

1、HBase基本介绍

大数据中一款nosql型的数据库, 既然是nosql型数据库, hbase不支持事务(多行事务),也不支持SQL, 也没有表关系, 不支持join操作

hbase是使用java语言开发的, 基于HDFS的, 数据最终都是存储在HDFS的

hbase中查询数据主要有三种方式: 

- 1) 通过主键查询
- 2) 通过主键的range范围查询
- 3) 全表扫描

主要是用于存储结构化和半结构化的数据 

hbase中支持的数据类型: byte[] (字节数组) 

		nosql型数据库:  一切皆字节

hbase中表一般具有以下的特征:

- 1) 大: 一个表可以支持有上十亿行的数据, 支持有上百万个列
- 2) 面向列: 面向列族的存储和权限的管理工作
- 3) 稀疏性: 对于为空(null)的列, 并不占用存储空间, 因为表可以设计非常的稀疏

hbase的使用场景: 

- 数据量比较的庞大, 而且这些数据需要进行随机的读写操作,  不妨使用hbase来试一试

目前hbase是apache的顶级项目: 其域名为 https://hbase.apache.org

2、HBase特点

- 1) 强一致性的读写操作
- 2) 自动分块: region划分
- 3) 自动的故障转移
- 4) hbase可以和HDFS进行集成: 本身基于HDFS
- 5) hbase可以和MR进行集成: 
- 6) 支持普通的java API
- 7) 支持Thrift 接口API : 可以通过此API 实现和HUE的集成工作
- 8) 块缓存和布隆过滤器
- 9) hbase提供管理界面

3、HBase的表模型

1、表(table):hbase中数据存储在表中,  一个表可以支持有上百万列 也可以存储上十亿上数据
2、row key:主键,以字典序排序,数据最长支持16kb
	设计rowkey要确保唯一,否则数据会被覆盖,同时保证相关的数据要存放在一起
3、列族:创建表的时候,需要制定列族,HBase对列的管`在这里插入代码片`理基于列族
	列族的设计:设计列族的时候尽量精简,能用一个列族绝不使用两个,因为随着列族的增多,HBase效率会随之下降
4、列名:列名被列族管理,一个列族下可以有多个列名
	列名在添加数据的时候动态指定,不需要在建表的时候指定
5、时间戳:往每个单元格中添加数据的时候会自动生成时间戳,用于记录数据的添加时间
6、版本号:用于记录单元格中数据的变更版本(只有在创建表的时候指定保留多少个版本才会进行记录,如果不指定,只记录一个版本号,默认为1)
7、确定一个单元格:表名+rowkey+列族+列名+value

4、HBase原理

4.1、HBase的架构说明

在这里插入图片描述

如图:
	HBase集群由HClient(客户端)、HMaster(主节点)、HRegionServer(从节点)组成
	单节点(单个HMaster)、高可用(多个HMaster)、HRegionServer可以多个(奇数台)

4.1.1HMaster

描述:集群的主节点,可以单节点运行,支持一主一备和一主多备
作用:1、管理从节点
	 2、分配region

4.1.2HClient

描述:HBase客户端
作用:提供给用户对数据进行操作

4.1.3 HRegionServer

描述:集群的从节点
作用:1、管理主节点分配的region
	 2、负责数据的存放和读写
	 3、负责和主节点进行通信

4.1.4 HRegionServer组成

1、每一个HRegionServer由一个HLog和多个Region组成
2、每一个Region中有多个store模块组成
3、每一个store模块中,由一个MemStore和多个StoreFile组成

Region的划分:
	region是对表的水平划分,每一张表创建的时候只有一个region。一个region只能被一个RegionServer管理,一个RegionServer可以管理多个region。
Store的划分:
	store是对表进行垂直划分,一个列族会对应一个store。所以列族越多时,会对应更多的store,多个store会分散在不同的内存和文件中,读取数据时,会造成更多的IO和网络消耗。(所以建议能使用一个列族绝不使用两个)

4.2 HBase数据读取和写入流程

4.2.1 数据读取流程

在这里插入图片描述如图:

  • 1、HClient发起读取数据请求,先连接zookeeper,获取meta表所在的RegionServer位置(meta表存放的信息包括:要读取的表所包含的region信息,以及region所存在的RegionServer位置)
  • 2、连接meta表所对应的RegionServer,从meta中获取表数据存放在哪些region中,并将这些region所在的RegionServer的位置返回给客户端
  • 3、HClient开始并行连接这些RegionServer读取数据,读取顺序按照memStore->blockCache->StoreFile->大的HFile
  • 4、所有数据读取完毕后一起返回给客户端,客户端再根据条件过滤出需要的数据

4.2.2 写入数据流程

在这里插入图片描述如图:

  • 客户端的同步流程:
    • 1、HClient先连接zookeeper,获取HBase meta表所在的RegionServer地址
    • 2、连接meta表所在的RegionServer服务器,从meta表中获取要写入数据的表所在的region所在的server地址(基于rowkey的startKey和endKey来确定)
    • 3、连接RegionServer服务器,开始数据的写入
    • 4、首先将数据写入到RegionServer对应的HLog中,再将数据写入到region对应的memStore中,当这两部分的数据都写入完成后,客户端会认为数据已经写入成功
  • 服务器的异步执行流程:
    • 5、当数据不断写入到memStore中,memStore中的数据会越来越多,当其中的数据达到一定的阈值(128MB|1个小时),会启动一个flush线程,将数据刷新到HDFS中,并形成一个StoreFile文件
    • 6、当数据不断刷新到HDFS中,会生成多个StoreFile文件,当StoreFile文件到达一定数量(3个及以上)后,会启动一个compact线程,将StoreFile合并成一个大的HFile文件
    • 7、随着StoreFile文件不断合并,HFile文件会越来越大,当HFile文件达到10GB大小以后,启动split机制,将HFile文件一分为二,此时原来的region也会分裂成两个,每个region管理分裂完成后的HFlie文件,原来的region被下线
    • 8、随着HFile不断的split,region的数量也会越来越多

5、HBase常用的shell命令

1、获取帮助:help
2、查看系统中所有表:list
3、创建表:
	1、create '表名','列族名'...
	2、create '表名',{NAME=>'列族名',VERSION=>N}
4、添加数据:
	put '表名','rowkey','列族名:列名','列值'
5、查看某一条数据:
	get '表名','rowkey',['列族'|'列族:列名']
6、查看整张表所有数据:
	1、scan '表名'
	2、显示中文:scan '表名',{FORMATTER=>'toString'}
	3、显示前N条:scan '表名',{LIMIT=>N}
	4、显示指定列:scan '表名',{COLUMNS=>['列族','列族:列名'],VERSION=>N}
7、rowkey范围查询:
	scan '表名',{STARTROW=>'其实rowkey值',ENDROW=>'结束rowkey值'}
8、列值过滤器:
	get '表名','rowkey',{FILTER=>"ValueFilter(=,'binary:beijing')"}
9、列名过滤器:
	scan'表名',{FILTER=>"QualifierFilter(=,'substring:a')"}
	scan '表名',{FILTER=>"QualifierFilter(=,'binary:address')"}
10、rowkey前缀过滤器:
	scan '表名',{FILTER=>"PrefixFilter('rk')"}
11、修改数据:和添加数据一致,保持rowkey一致即可
	put '表名','rowkey','列族:列名','列值'
12、删除数据:
	delete '表名','rowkey','列族:列名'(可用于删除某个字段)
	deleteall '表名','rowkey',['列族':'列名']
	注意事项:
		- deleteall 是在 hbase 2.0版本后出现的, 在2.0版本之前, 只需要使用delete这个命令即可完成所有的删除数据工作
		- delete删除数据时候, 只会删除最新版本的数据, 而deleteall 直接将对应数据的所有的历史版本全部删除
13、删除一个列族:
	alter '表名',{NAME=>'列族',METHOD=>'delete'}
	alter '表名',{'delete'=>'列族'}
14、清空表:
	truncate '表名'
15、删除表(删除表之前,先禁用表,disable '表名'):
	drop '表名'
16、统计表中一共有多少行:
	count '表名'
17、查看表的详细信息:
	describe '表名'
18、判断一张表是否存在:
	exists '表名'
19、添加新的列族:
	alter '表名',NAME=>'列族'

6、HBase服务操作命令

1、服务器启动命令
	nohup start-hbase.sh 2>&1 &
2、启动客户端命令
	hbase shell
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值