0%

HBase基础

一、 HBase 基本概念二、 HBase伪分布式安装三、HBase Shell四、注意

一、 HBase 基本概念

HBase是一个分布式的、面向列的、基于Google Bigtable的开源实现。名字来源于Hadoop database,即hadoop数据库。不同于一般的关系数据库,它可以存储非结构化数据,而且它是基于列的而不是基于行的模式。

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

表结构

HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(column family),每个列族/列簇下面可以有多个普通列。image001-6

表(Table)

HBase采用表来组织数据,表由许多行和列组成,列划分为多个列族。

行(Row)

在表里面,每一行代表着一个数据对象。每一行都是由一个行键(Row Key)和一个或者多个列组成的。行键是行的唯一标识,行键并没有什么特定的数据类型,以二进制的字节来存储,按字母顺序排序。

行键 (Row Key)

行键,每一行的主键列,每行的行键要唯一,行键的值为任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在HBase内部,rowKey保存为字节数组byte[]。

列族(Column Family)

列族是每个子列的父级,每个子列都属于一个列族,一个列族包含一个或者多个相关列,创建表的时候需要指定列族,而不需要必须指定列。通过“列族名:列名”来表示某个具体的子列。HBase中的Schema就是由 TableName 和 Column Family Name构成。

列(Column)

列由列族(Column Family)和列限定符(Column Qualifier)联合标识,由“:”进行间隔,如 family:qualifier。

列限定符(Column Qualifier)

就是列族下的每个子列名称,或者称为相关列,或者称为限定符,只是翻译不同。通过columnFamily:column来定位某个子列。

存储单元 (Cell)

外观看到的每个单元格其实都可以对应着多个存储单元,默认情况下一个单元格对应着一个存储单元,一个存储单元可以存储一份数据,如果一个单元格有多个存储单元就表示一个单元格可以存储多个值。可以通过version来设置存储单元个数。可以通过

rowKey + columnFamily + column + timestamp来唯一确定一个存储单元。cell中的数据是没有类型的,全部是字节码形式存贮。

区域(Region)

Table在行的方向上分割为多个Region。Region是按大小分割的,每个表开始只有一个region,随着数据的增多,Region不断增大,当增大到一个阈值的时候,Region就会等分为两个新的Region,之后会有越来越多的Region。Region是HBase中分布式存储和负载均衡的最小单元。不同的Region分布到不同的RegionServer上。Region由一个或者多个Store组成, 每个Store保存一个columnFamily, 每个Store又由一个MemStore(存储在内存中)和0到多个StoreFile(存储在HDFS上)组成。image003-6

时间戳( Time Stamp)

每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由HBase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

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

命名空间(Namespace)

命名空间指对一组表的逻辑分组,类似关系数据库中的database,方便对表在业务上划分。

HBase系统默认定义了两个缺省的namespace:

  • hbase:系统内建表,包含namespace和meta表;
  • default:用户建表时未指定namespace的表都创建在此。

二、 HBase伪分布式安装

安装

将HBase的安装包hbase-1.4.0-bin.tar.gz 复制到/apps目录下并解压缩。

1
cp ~/big_data_tools/hbase-1.4.0-bin.tar.gz /apps
1
tar zxvf hbase-1.4.0-bin.tar.gz

重命名为hbase,删除压缩包hbase-1.4.10-bin.tar.gz。

1
mv /apps/hbase-1.4.0 /apps/hbase
1
rm /apps/hbase-1.4.0-bin.tar.gz

添加HBase的环境变量。打开用户环境变量配置文件~/.bashrc

1
vim ~/.bashrc 

在文件末尾位置,追加HBase的bin目录路径相关配置,并保存退出。

1
2
3
4
5
# Hbase 

export HBASE_HOME=/apps/hbase

export PATH=$HBASE_HOME/bin:$PATH

到目前位置我们安装了Java,Hadoop和HBase,环境变量配置文件添加内容如下图所示image-20221018190108536

执行source命令,使环境变量生效。

1
source ~/.bashrc 

此时就可以调用HBase的bin目录下的脚本了。先来查看一下HBase的版本信息。

1
hbase version

image-20221018190144732

配置

切换到目录/apps/hbase/conf下,打开文件hbase-env.sh

1
cd /apps/hbase/conf 
1
vim hbase-env.sh 

在文件末尾追加下面的内容,并保存退出。

1
2
3
export JAVA_HOME=/apps/java  
export HBASE_MANAGES_ZK=true
export HBASE_CLASSPATH=/apps/hbase/conf

说明:

  • JAVA_HOME为Java安装目录;
  • HBASE_MANAGES_ZK表示是否使用HBase自带的Zookeeper环境;
  • HBASE_CLASSPATH 配置HBase配置文件的位置。

打开文件hbase-site.xml。在两个之间添加如下内容,并保存退出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<property>
<name>hbase.master</name>
<value>localhost</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/data/tmp/zookeeper-hbase</value>
</property>

配置项说明:

  • hbase.master:HBase主节点地址。
  • hbase.rootdir:HBase文件在HDFS上的存储位置。
  • hbase.cluster.distributed:HBase是否为分布式模式。
  • hbase.zookeeper.quorum:配置ZooKeeper服务器地址。
  • hbase.zookeeper.property.dataDir:HBase在ZooKeeper上存储数据的位置。

注意:这里hbase.zookeeper.property.dataDir目录,需要提前创建。

1
mkdir -p /data/tmp/zookeeper-hbase

启动HBase。输入jps,查看Hadoop进程是否已经启动。若未启动,先启动Hadoop。

1
/apps/hadoop/sbin/start-all.sh

当Hadoop相关进程启动后,启动HBase服务。

1
/apps/hbase/bin/start-hbase.sh

输入jps,查看HBase相关进程。

输入jps,查看HBase相关进程。image-20221018190551763

可以看到HBase的三个进程HMaster、HRegionServer、HQuorumPeer都已启动,其中HQuorumPeer为ZooKeeper进程。

测试

进入HBase Shell接口。

1
hbase shell 

输入list的命令,查看当前有哪些HTable表。

1
list

创建一张表tb,表中含有一个列簇mycf。

1
create 'tb','mycf'

再次输入list,列出HBase中的表。image-20221018191215494

HBase在HDFS上的存储位置是在hbase-site.xml设置的,可以使用HDFS shell 命令进行查看。image-20221018191249402

三、HBase Shell

HBase Shell 是官方提供的一组命令,用于操作HBase。如果配置了HBase的环境变量,就可以在终端中输入hbase shell 命令进入命令行。

1
hbase shell

image-20221018190628730

help命令

通过help命令可以查看hbase shell 支持的所有命令,HBase将命令分成了不同的组,如general, ddl, dml等。

image-20221018191438620

可以通过 help ‘命令名称’来查看命令的作用和用法。例如

1
help 'list'

image-20221018191508991

General 命令

  1. 查询服务器状态

image-20221018191530050

  1. 查询版本

image-20221018191544814

DDL 操作

数据定义语言(Data Defination Language,DDL)操作主要用来定义、修改和查询表。

1.创建一个表

​ 创建一个具有两个列族(address, info)的表students。

1
create 'students','address','info'

image-20221018191848730

2.列出所有表

image-20221018191910537

3.获取表的描述,自己弄清楚下图输出信息各项含义。

1
describe 'students'

image-20221018191952141

4.删除一个列族

删除列族’info’

1
alter 'students', {NAME => 'info', METHOD => 'delete'}

image-20221018192026152

image-20221018192037794

5.删除一个表

要彻底删除一表数据和表结构,需要先disable,再drop。

image-20221018192207924

6.查询表是否存在

image-20221018192254887

7.查看表是否可用

image-20221018192323788

DML 操­­­­­作

DML(Data Manipulation Language,数据操作语言)操作主要用来对表的数据进行添加、修改、获取、删除和查询。

创建一个具有三个列族(name,address, info)的表students。

1
create 'students','name','address','info'

1.插入数据

给 students 表‘xiaoming‘行和’xiaowang’行插入数据

1
put 'students', 'xiaoming', 'address:province', 'zhejiang'

image-20221018192705731

1
put 'students', 'xiaoming', 'address:city', 'jinhua'

image-20221018192719842

1
put 'students', 'xiaoming', 'info:age', '20'

image-20221018192742689

1
put 'students', 'xiaowang', 'address:city', 'hangzhou'

image-20221018192812618

2.获取数据

获取 students 表的 xiaoming 行的所有数据。

1
get 'students', 'xiaoming'

image-20221018192829909

获取 students 表的 xiaoming 行的address列族的所有数据。

1
get 'students', 'xiaoming', 'address'

image-20221018192851626

获取 students 表的 xiaoming 行的address列族中city列的数据。

1
get 'students', 'xiaoming', 'address:city'

image-20221018192906854

3.更新一条记录

更新students表的 xiaowang 行、address 列族中 province列的值。

1
put 'students', 'xiaowang', 'address:city', 'shanghai'

image-20221018192938404

查看更新的结果。

1
get 'students', 'xiaowang', 'address:city'

image-20221018192957166

4.全表扫描

image-20221018193029521

5.删除一列

删除students 表 xiaoming行的address列族的列city。

1
delete 'students', 'xiaoming', 'address:city'

检查删除操作的结果。

1
get 'students', 'xiaoming'

image-20221018193104927

6.删除行的所有单元格

使用“deleteall”命令删除students表 xiaoming 行的所有列。

1
deleteall 'students', 'xiaoming'

image-20221018193135700

7.统计表中的行数

1
count 'students'

image-20221018193200801

8.清空整张表

1
truncate 'students'

9.存储多个版本的数据

创建的表,默认列族的VERSIONS=1,也就是只会存取一个版本的列数据,当再次插入的时候,后面的值会覆盖前面的值。

image-20221018193229615

修改表结构,让表支持存储3个本版

1
alter 'students', {NAME=>'address', VERSIONS=>3}

image-20221018193253028

插入三行数据

1
put 'students', 'xiaoming', 'address:city', 'hangzhou'
1
put 'students', 'xiaoming', 'address:city', 'suzhou'
1
put 'students', 'xiaoming', 'address:city', 'shanghai'

一次读三个数据

1
get 'students','xiaoming', {COLUMN=>'address:city', VERSIONS=>3}

image-20221018193333626

四、注意

报错如下

image-20221018190958756

需离开安全模式,执行以下命令hadoop dfsadmin -safemode leave

1
hadoop dfsadmin -safemode leave