一, Habse 概述,安装和快速上手

一, HBase 简介

1.0.起源

  • HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统
  • Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据
  • Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为协同服务

1.1 HBase的特点

概括: 高性能,分布式,可伸缩, 面向列,实时读写,随机访问

  1. 高性能: 相比于hadoop 高延时, 离线查询, HBase可以做到低延时,实时计算;
  2. 高可靠性: WAL(预写日志)机制,保证数据写入的时候不会因为集群异常而导致写入数据丢失; Replication机制,保证了在集群出现严重的问题时候,数据不会发生丢失或者损坏; Hbase底层使用HDFS,本身也有备份。
  3. 分布式: HBase底层依靠HDFS作为其文件存储系统, 而HDFS是分布式存储数据的, 自然HBase也具有分布式的特点;
  4. 可伸缩:关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来从水平方向上实现性能的伸缩
  5. 面向列: 通常在传统的关系性数据库中,每一列的数据类型是事先定义好的,会占用固定的内存空间,在此情况下,属性值为空(NULL)的列也需要占用存储空间。而在 HBase 中的数据都是以字节数组 形式存储的,为空的列并不占用存储空间,可以用来来存储结构化和半结构化的松散数据。
  6. 实时读写, 随机访问: HBase在内部使用哈希表并提供随机访问,并且将数据存储在索引的HDFS文件中,以加快查找速度。

1.2 HBase 数据模型

1.2.1 HBase 逻辑结构, 物理存储结构

  • 表, 是HBase中数据的逻辑组织方式, 从用户视图来看, HBase的逻辑模型如表1所示, HBase中的一个表有若干行, 每行有多个列族, 每个列族中包含多个列, 列的值可以有多个版本;
    在这里插入图片描述

  • 表1, 展示了HBase中一张典型的表, 表是学生信息表Student, 有三行记录和两个列族, 行键(RowKey)分别为0001, 00002, 0003, 两个列族(Column Fambily)分别为StuInfo 和 Grades, 每个列族中含有若干列, 如列族StuInfo中包含Name, Age, Sex和Class 四列, 列族Grades包括Bigdata, Computer和Math 三列;

  • 注意: 在HBase中, 列不是固定的表结构, 在创建表时, 不需要预先定义列名, 可以在插入数据时临时创建.

HBase表逻辑结构与关系数据库表结构的区别:

  1. 关系数据库添加新列, 需要修改表结构, 这会对已有的数据产生很大的影响, 同时, 关系数据库中的表为每个列都预留了存储空间, 即表1中的空白Cell数据在关系型数据库中以"Null"值实际的占用存储空间, 所以, 对于稀疏数据来说, 关系型数据库表中就会产生很多Null值, 消耗大量的存储空间;
  2. 在HBase中, 如表1中的空白Cell在物理上是不占用存储空间的, 即不会存储空白的键值对, 因此, 若一个请求为获取RowKey:001, 列族为StuInfo, 列名为Class, 时间戳为T2, 得到的是一个空白值;
  3. 与面向行存储的关系型数据库不同, HBase 是面向列存储的, 在实际的物理存储中, 列是分开存储的, 即表1的学生信息将会被存储为StuInfo和Grades两个部分.

在这里插入图片描述


对HBase 表关键词的解释

在这里插入图片描述

  1. NameSpace- 命名空间

    • 类似于关系数据库下的database的该你那,每个命名空间下有多个表, 不同命名空间下的表名可以相同; 在HBase中有两个自带的命名空间, 分别是hbase和default, hbase中存放的是HBase内置的系统表, default是用户默认使用用户空间;
  2. RowKey-行键:

    • RowKey的概念和mysql中的主键是一样的, HBase使用RowKey来唯一的区分一行数据;
    • HBase对RowKey有三种查询方式:
      1. 基于RowKey的某一行进行访问;
      2. 基于RowKey的范围进行扫描;
      3. 全表扫描;
    • 在HBase内部, rowkey保存为字节数组, hbase会将表中的数据按照rowkey 的字典顺序进行排序;
  3. ColumnFambily-列族:

    • HBase通过列族来划分数据的存储, 列族是在创建表的时候就定义好了的(就像是关系数据库中建表时必须指定列一样),
    • Hbase 的每个列族可以包含任意多的列, 每个列可以因为rowkey 的不同而有各种各样的值;
    • 列族也不是越多越好, 官方推荐是 <=3;
  4. ColumnQualifier-列限定符:

    • HBase 中的每个列都由 Column Family(列族)和 Column Qualifier(列限定符)进行限定,例如 info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。
  5. Cell-单元格:

    • 由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell 中的数据是没有类型的,全部是字节码形式存贮。
  6. timeStamp-时间戳:

    • 用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入 HBase 的时间。
  7. rigion-分区:

    • 在 HBase 中,表的所有行都是按照 RowKey 的字典序排列的,表在行的方向上分割为多个分区(Region),如下图所示。region内包含了多条rowkey的数据;

在这里插入图片描述

1.3 HBase 基本架构(后面文章再说)

二, HBase 安装和快速上手

2.1 Hbase 2.3.7 安装

  1. 前期环境, Hadoop集群启动, Zookeeper集群启动;
#搭配之前使用的hadoop, zk集群启停脚本, 开启各自的集群

>myhadoop start
>zk start

在这里插入图片描述

  1. 把HBase的tar.gz安装吧放到/opt/software中, 并把它解压到我们前面经常使用的/opt/module/中去, 并改名为hbase-2.3.7
>tar -zxvf apache-hadoop-hbase-2.3.7.tar.gz /opt/module
>mv apache-hadoop-hbase-2.3.7.tar.gz hbase-2.3.7
  1. 配置相关的配置文件

./conf/hbase-env.sh

export JAVA_HOME=/opt/module/jdk1.8
export HBASE_MANAGES_ZK=false  #hbase自带的zk管理

./conf/regionservers

bigdata01
bigdata02
bigdata03

./conf/Hbase-site.xml

<configuration>
<!--- hbase在hdfs存储的根目录-->
	<property>
		<name>hbase.rootdir</name>
		<value>hdfs://bigdata01:9000/hbase</value>
	</property>
	
<!-- hbase集群分布, true时为分布式集群, false时为单机 -->
	<property>
		<name>hbase.cluster.distributed</name>
		<value>true</value>
	</property>
	
<!-- habse 的默认端口-->
	<property>
		<name>hbase.master.port</name>
		<value>16000</value>
	</property>
	
<!-- hbase master 的web ui的页面端口 -->
	<property>
		<name>hbase.master,info.port</name>
		<value>16010</value>
	</property>
	
<!-- zookeeper 配置下面-->
	<property>
		<name>hbase.zookeeper,quorum</name>
		<value>bigdata01,bigdata02,bigdata03</value>
	</property>
	<property>
		<name>hbase.zookeeper.property.dataDir</name>
		<value>/opt/module/zookeeper-3.5.7/zkData</value>
	</property>
</configuration>
  1. 软链接, 配置hadoop配置文件的位置

在这里插入图片描述

  1. 分布hbase安装目录到各个节点
>xsync hbase-1.3.1

在这里插入图片描述

  1. 启动hbase服务

启动方式一:

>bin/hbase-daemon.sh start master

>bin/hbase-daemon.sh start regionserver

启动方式二;:

>bin/start-hbase.sh

>bin/stop-hbase.sh

在这里插入图片描述

  1. 查看hbase web页面
  • 启动成功后,可以通过“主机名:port”的方式来访问 HBase 管理页面,例如:
    http://bigdata01:16010
    在这里插入图片描述

2.2 HBase Shell 操作

2.2.1 基本操作

  1. 进入HBase客户端命令行/bin/hbase shell, 查看帮助命令help, 查看数据中有哪些表list:

在这里插入图片描述

  • 比较常用的命令:

    • 在这里插入图片描述
  • 我们还可以使用 help '命令',查看特定命令的帮助信息, 或者在输入某个命令后, 直接按TAB键, 也可查看此命令的帮助信息;

另外: 如果在hbase shell中打错命令了, 而且你已经回车了怎么办?

输入一个单引号', 然后回车, 重复两次即可返回
在这里插入图片描述

2.2.2 对表的操作(DDL)

  1. 创建表–create
  • hbase创建表用到的命令是create '表名-table','列族1-Column_family_1', '列族2_Column_family_2'....
  • 注意每个表, 必须至少拥有一个列族, create 表名 是不对的;
create 'person','familyOne','familyTwo','familyThree'

在这里插入图片描述

  1. 删除表–drop
  • hbase删除表用到的是drop命令, 但是我们还要了解: hbase中的表在创建成功后, 默认状态是enable, 即"使用中"的状态, 删除表之前需要设置表为"关闭中"
  • 设置表为"使用中": enable '表名', 相应的关闭表就是: disable '表名'

在这里插入图片描述

  1. 查看表–list, 查看表结构–describe
  • 前面我们提过一嘴, 列出hbase中当前所有的表的命令:list;
  • 现在, 我们主要来看查看指定一张表的表结构: describe "表名"

在这里插入图片描述

  1. 统计表数据行数–count
  • 统计表中的数据行数: count "表名"

在这里插入图片描述

  1. 清空表数据–truncate
  • 跟删除表一样,清除表中数据之前也一定要先停用表-'disable '表名',
  • 然后使用truncate '表名'即可清除表中的数据;
  1. 变更表信息–alter

在这里插入图片描述

Alter a table. Tables can be altered without disabling them first.
Altering enabled tables has caused problems
in the past, so use caution and test it before using in production.

You can use the alter command to add,
modify or delete column families or change table configuration options.
Column families work in a similar way as the 'create' command. The column family
specification can either be a name string, or a dictionary with the NAME attribute.
Dictionaries are described in the output of the 'help' command, with no arguments.

For example, to change or add the 'f1' column family in table 't1' from
current value to keep a maximum of 5 cell VERSIONS, do:

  hbase> alter 't1', NAME => 'f1', VERSIONS => 5

You can operate on several column families:

  hbase> alter 't1', 'f1', {
    
    NAME => 'f2', IN_MEMORY => true}, {
    
    NAME => 'f3', VERSIONS => 5}

To delete the 'f1' column family in table 'ns1:t1', use one of:

  hbase> alter 'ns1:t1', NAME => 'f1', METHOD => 'delete'
  hbase> alter 'ns1:t1', 'delete' => 'f1'

2.2.2 对数据的操作(DML)

  1. 向表中插入一条数据–put
  • 通过前面的概述, 我们可以知道,hbase按照表名->rowkey->列族:列->来取出/读取一行数据
  • 我们在插入数据的时候也是通过 put命令利用这个形式来的: put '表名','RowKey', '列族:列', '要插入的值'
  • put 'table', 'rowkey','columnfambily:column','value'
hbase(main)>put 'person','1001','familyOne:name','happy' 

在这里插入图片描述

注意: hbase的’put’命令, 一条语句只能插入或更新一个cell即一个单元格的数据; 如果我们需要往同一个rowkey,同一个列族但不同的列下插入多条数据, 需要使用多条语句实现:

在这里插入图片描述

  1. 向表中更新一条数据–put
  • hbase中对更新一行数据,同样适用put指令, 使用方法跟上面一致;

在这里插入图片描述

  1. 从表取出一条数据–get
  • 从表中取出数据, 我们通常使用’get’命令, 格式为:
  • get '表名-table', 'rowkey', ...

在这里插入图片描述

注意: 使用get命令时, 表名, rowkey是必选项, 我们还可以根据需要在后面加入一些筛选条件;

在这里插入图片描述

  1. 扫描列出整张表的数据-- scan
  • 使用get命令终究只是取出某一个row key的数据,若需要查看所有数据,还可以使用scan命令查看数据, 就像我们在别的数据库中使用select * from table 一样;

在这里插入图片描述

当然, 我们也是可以加入一些筛选条件的, 就像再别的数据库查询中加入了where语句一样;

在这里插入图片描述

  1. 删除表中的一条数据-- delete

注意, 如下图中帮助信息所述, delete '表名','rowkey','列族:列名'

在这里插入图片描述

跟上面讲到的get命令类似, delete删除的是一个cell, 即一个单元格的数据;
在这里插入图片描述

  1. 删除表中的一行数据–deleteadll

delete命令只能删除某一rowkey中, 处于某一个列族下的一个列的数据, 也就是一个单元格的数据, 所以我们还有个deleteall命令,用于删除一整行数据, deleteall '表名','rowkey'

在这里插入图片描述

Guess you like

Origin blog.csdn.net/nmsLLCSDN/article/details/121320178