千家信息网

HBase学习小节v1.2

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,1. HBase一个构建在HDFS上的高可靠、高性能、面向列、可伸缩、分布式列存储开源数据库,主要用于存储海量数据,同时使用mapreduce处理HBase中的数据,利用zookeeper作为协同服务
千家信息网最后更新 2025年02月02日HBase学习小节v1.2

1. HBase

一个构建在HDFS上的高可靠、高性能、面向列、可伸缩、分布式列存储开源数据库,主要用于存储海量数据,同时使用mapreduce处理HBase中的数据,利用zookeeper作为协同服务。读写相对简单,不支持条件查询

2. HBase与HDFS对比

都具有良好的容错性和扩展性

HDFS适合批处理场景,但是不支持数据随即查找,不适合增量数据处理,不支持数据更新

3. HBase的特点:

海量数据:可支持上百万列,分成多个region

无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列

面向列存储:面向列的存储和权限控制,列独立检索

记录稀疏:列为空(NULL),并不占用存储空间

数据多版本:每个单元的数据可以有多个版本,通过timestamp区分

数据类型单一:所有数据都是字符串

4. HBase结构组成

Row key:

Byte array

表中每条记录的"主键"

方便快速查找

Timestamp:

每次数据操作对应的时间戳,看作数据的version number

Column Family:

拥有一个名称(string)

包含一个或者多个相关列(Column)

Column:

value:

5. 支持的操作

所有操作基于rowkey的

支持CRUD(create、read、update、delete)以及put、get、multiput、scan

没有内置join操作,可使用MapReduce实现

6. HBase为每个值维护了多级索引,即

Table中的所有行都按照row key的字典序排列,在行的方向上分割为多个region,region是HBase中分布式存储与负载均衡的最小单元,不同的Region分布到不同RegionServer上;

region增大到一个阀值的时候,region就会分为两个新的region,之后会有越来越多的region

region由一个或多个store组成,每个store保存一个columns family

每个store又由一个memStore和0至多个StoreFile组成;

memStore存储在内存中,StoreFile存储在HDFS上

7. HBase的基本组件

Client:通过RPC与HMaster及HRegionServer进行通信,并维护cache加快对HBase的访问

Zookeeper:

保证集群中总是存在一个HMaster

存储所有Region的寻址入口

实时监控Region server的上线和下线信息,并实时通知给Master

存储HBase的schema和table元数据

HMaster:

为Region server分配region

复杂Region server的负载均衡

发现失效的Region server并重新分配其上的region

管理用户对table的增删改查操作

HRegionServer:

维护region,处理对region的I/O请求

负责切分在运行过程中变得过大的region

8.HBase容错机制

HMaster:zookeeper重新选择一个新的Master

无Master过程中,数据读取仍照常进行

无Master过程中,region切分、负载均衡等无法进行

HRegionServer容错:定时向Zookeeper汇报心跳,如果一定时间内未出现心跳

HMaster将该HRegionServer上的Region重新分配到其他RegionServer上

失效服务器上"预写"日志由主服务器进行分割并派送给新的RegionServer上

9. HBase访问方式

Native Java API:常规高效

创建一个Configuration对象(包含各种配置信息hbase-default.xml,hbase-site.xml)

Configuration conf=HbaseConfiguration.create()

构建一个HTable句柄(提供Configuration对象,提供待访问Table的名称)

HTable table=new HTable(conf,tableName)

仅提供行级事务,严格的行一致性,并发读,顺序写

执行操作(支持put,get,delete,scan等的批处理)

table.getTableName();

关闭HTable句柄(内存数据刷新到磁盘上,释放资源)

table.close()

HBase Shell:用于管理

Thrift Gateway:序列化,支持C++,Python等语言

启动thrift server:hbase-daemon.sh start thtift

生成Hbase thrift client接口文件

thrift --gen xxx Hbase.thrift

编写客户端代码

eg:1. thrift --gen py hbase.thrift

2. ${HBASE_HOME}/src/examples/thrift/DemoClient.py

3. python DemoClient.py

Rest Gateway:Rest风格的Http API

Mapreduce:使用Mapreduce作业处理Hbase数据

提供TableMapper、TableReducer、TableInputFormat、TableOutputFormat等api

10.HBase Shell的主要用法

进入控制台:bin/hbase shell

创建表:create TABLE_NAME,COLUMN_Family1, COLUMN_Family2,...COLUMN_FamilyN

添加记录:put TABLE_NAME,ROW_NAME,COLUMN_Family:COLUMN_NAME,VALUE

查看记录:get TABLE_NAME,ROW_NAME #默认返回最近的值

统计记录数:count TABLE_NAME

删除表:

disable TABLE_NAME

drop TABLE_NAME

删除记录:

delete TABLE_NAME,ROW_NAME,COLUMN_Family:COLUMN_NAME #删除一条

delete TABLE_NAME,ROW_NAME #删除所有

删除一个列簇

disable TABLE_NAME

alter TABLE_NAME, {NAME=>'tab1_add', METHOD=>'delete'}

enable TABLE_NAME

全表扫描:

scan TABLE_NAME

指定列中的所有数据:scan TABLE_NAME,COLUMN_Family

查看所有表:list

查看服务器状态:status

查看hbase版本:version

查看表结构:descirbe TABLE_NAME

判断表是否存在:exists TABLE_NAME

判断表是否为enable is_enabled TABLE_NAME

清空表:truncate TABLE_NAME


0