【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章目录三 HBase整体架构四 HBase安装五 HBase shell 命令基本操作六 HBase的高级shell管理命令七 Hive与HBase的集成八 HBase客户端API操作九 操作HBase2 -sql 连接 3映射Hbase 表
前言
各位小伙伴大家好,最近因为公司电脑固态硬盘坏掉和大院拆迁被迫搬家的事情,心情一直比较苦闷;在周末搬完家后,想着怎么写个专题类的文章跟各位小伙伴们一起在知识的海洋中遨游下,好好用知识让我们自己放松下,最终确认下来干一篇非常全面的HBase文章,大家可以一键三连加评论,有相关的意见和想法可以一起讨论学习 。话不多说,直接开始我们今天的正题,让我们在HBase海洋中尽情遨游吧:
一 HBase简介
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC 上搭建起大规模结构化存储集群 。
HBase的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据 。
HBase是 的开源实现,但是也有很多不同之处 。比如: 利用GFS作为其文件存储系统,HBase利用 HDFS作为其文件存储系统;运行来处理中的海量数据,HBase同样利用 来处理HBASE中的海量数据; 利用作为协同服务,HBase利用作为对应 。它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作) 。主要用来存储非结构化和半结构化的松散数据 。
HBase与mysql、、db2、等关系型数据库不同,它是一个NoSQL数据库(非关系型数据库)
HBase的表模型与关系型数据库的表模型不同:
HBase与mysql、、db2、等关系型数据库不同,它是一个NoSQL数据库(非关系型数据库)
HBase的表模型与关系型数据库的表模型不同:
HBase的表没有固定的字段定义;
HBase的表中每行存储的都是一些key-value对;
Hbase的表中有列族的划分,用户可以指定将哪些kv插入哪个列族;
Hbase的表在物理存储上,是按照列族来分割的,不同列族的数据一定存储在不同的文件中;
Hbase的表中的每一行都固定有一个行键,而且每一行的行键在表中不能重复;
Hbase中的数据,包含行键,包含key,包含value,都是byte[ ]类型,hbase不负责为用户维护数据类型;
HBASE对事务的支持很差;
HBASE相比于其他nosql数据库(、redis、、)的特点:
Hbase的表数据存储在HDFS文件系统中,所以,hbase具备如下特性:
海量存储
列式存储
数据存储的安全性可靠性极高
支持高并发
存储容量可以线性扩展
二 HBase表的数据模型

【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章插图
1 行键
table的主键,table中的记录按照 的字典序进行排序
Row key行键可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-)
2列族
列族或列簇
HBase表中的每个列,都归属与某个列族
列族是表的的一部分(而列不是),即建表时至少指定一个列族
【【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识】比如创建一张表,名为user,有两个列族,分别是info和data,建表语句 ‘user’, ‘info’, ‘data’
3 列
列肯定是表的某一列族下的一个列,用列族名:列名表示,如info列族下的name列,表示为info:name
属于某一个,类似于我们mysql当中创建的具体的列
4 cell单元格
指定row key行键、列族、列,可以确定的一个cell单元格
cell中的数据是没有类型的,全部是以字节数组进行存储
5 时间戳
可以对表中的Cell多次赋值,每次赋值操作时的时间戳,可看成Cell值的版本号 ;即一个Cell可以有多个版本的值
三 HBase整体架构
【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章插图
1 客户端
是操作HBase集群的入口;
对于管理类的操作,如表的增、删、改操纵,通过RPC与通信完成;
对于表数据的读写操作,通过RPC与交互,读写数据
类型:
HBase shell
Java编程接口
、Avro、Rest等等
2 集群
作用:
实现了的高可用,多间进行主备选举;
保存了HBase的元数据信息meta表,提供了HBase表中的寻址入口的线索数据;
对和实现了监控;
3
HBase集群也是主从架构,是主的角色,是老大
主要负责Table表和的相关管理工作:
关于Table
管理对Table的增删改的操作
关于
在分裂后,负责新分配到指定的上
管理间的负载均衡,迁移分布
当宕机后,负责其上的的迁移
4
HBase集群中从的角色,是小弟
作用:
响应客户端的读写数据请求
负责管理一系列的
切分在运行过程中变大的
5
HBase集群中分布式存储的最小单元
一个对应一个Table表的部分数据
HBase使用,主要有两种形式:①命令;②Java编程
四 HBase安装
HBASE是一个分布式系统
其中有一个管理角色:(一般2台,一台,一台)
其他的数据节点角色:(很多台,看数据量)
1 安装准备
需要先有一个java环境
首先,要有一个HDFS集群,并正常运行;应该跟hdfs中的在一起
其次,还需要一个集群,并正常运行,然后,安装HBase
角色分配如下:
Hdp01:
Hdp02:
Hdp03:
2 安装步骤
解压HBase安装包
修改hbase-env.sh
export JAVA_HOME=/root/apps/jdk1.7.0_67export HBASE_MANAGES_ZK=false
修改hbase-site.xml
hbase.rootdirhdfs://hdp01:9000/hbasehbase.cluster.distributedtruehbase.zookeeper.quorumhdp01:2181,hdp02:2181,hdp03:2181
修改
hdp01hdp02hdp03
3 启动HBase集群
cd /kkb/install/hbase-1.2.0-cdh5.14.2bin/start-hbase.sh
启动完后,还可以在集群中找任意一台机器启动一个备用的
bin/hbase-daemon.sh start master
新启的这个会处于状态
4 停止HBase集群
cd /kkb/install/hbase-1.2.0-cdh5.14.2bin/stop-hbase.sh
五 HBase shell 命令基本操作 1 进入HBase客户端命令操作界面
执行以下命令,进入HBase的shell客户端
cd /kkb/install/hbase-1.2.0-cdh5.14.2bin/hbase shell
【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章插图
如果出现下图所示情况,说明HBase未正常启动
【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章插图
以下为正常启动页面,并且有相关进程
【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章插图
① list查看当前数据库中有哪些表
【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章插图
② 查看HBase集群状态
【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章插图
③ 查看HBase集群版本
【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章插图
ps:操作
HBase系统默认定义了两个缺省的namespacehbase:系统内建表,包括namespace和meta表default:用户建表时未指定namespace的表都创建在此创建:create_namespace 'lzc'删除:drop_namespace 'lzc'查看:describe_namespace 'lzc'列出所有:list_namespace在namespace下创建表:create 'lzc:user_info','id','name','age'查看namespace下的表 :list_namespace_tables'lzc'
2 HBase表模型特点
【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章插图
1.一个表,有表名
2.一个表可以分为多个列族(不同列族的数据会存储在不同文件中)
3.表中的每一行有一个“行键”,而且行键在表中不能重复
4.表中的每一对kv数据称作一个cell
5.hbase可以对数据存储多个历史版本(历史版本数量可配置)
6.整张表由于数据量过大,会被横向切分成若干个(用范围标识),不同的数据也存储在不同文件中
【由浅入深讨论HBase:自认全网最全最细】,你想了解的关于HBase知识

文章插图
7.hbase会对插入的数据按顺序存储:
要点一:首先会按行键排序
要点二:同一行里面的kv会按列族排序,再按k排序
3 HBase数据类型
hbase中只支持byte[]
此处的byte[] 包括了:,key,value,列族名,表名
4 HBase命令行操作 名称命令表达式
创建表
‘表名’, ‘列族名1’,‘列族名2’,‘列族名N’
查看所有表
list
描述表
‘表名’
判断表存在
‘表名’
判断是否禁用启用表
‘表名’‘表名’
添加记录
put ‘表名’, ‘’, ‘列族 : 列‘ , ‘值’
查看记录下的所有数据
get ‘表名’ , ‘’
查看表中的记录总数
count ‘表名’
获取某个列族
get ‘表名’,‘’,‘列族’
获取某个列族的某个列
get ‘表名’,‘’,'列族:列’
删除记录
‘表名’ ,‘行名’ , ‘列族:列’
删除整行
‘表名’,‘’
删除一张表
先要屏蔽该表,才能对该表进行删除 第一步‘表名’,第二步 drop ‘表名’
清空表
‘表名’
查看所有记录
scan “表名”
查看某个表某个列中所有数据
scan “表名” , {=>‘列族名:列名’}
更新记录
就是重写一遍,进行覆盖,hbase没有修改,都是追加
① help 帮助命令
hbase(main):005:0> help
查看具体命令的帮助信息
hbase(main):006:0> help ‘’
②创建表
创建user表,包含info、data两个列族
使用命令
hbase(main):008:0>‘user’, ‘info’, ‘data’
0 row(s) in 1.3080
或者
=> Hbase::Table - user
hbase(main):009:0>‘user’,{NAME => ‘info’,=> ‘3’},{NAME => ‘data’}
ERROR: Table: user!
③ put 插入数据操作
向表中插入数据
使用put命令
向user表中插入信息,row key为,列族info中添加名为name的列,值为
HBase(main):011:0> put ‘user’, ‘’, ‘info:name’, ‘’
向user表中插入信息,row key为,列族info中添加名为的列,值为
HBase(main):012:0> put ‘user’, ‘’, ‘info:’, ‘’
向user表中插入信息,row key为,列族info中添加名为age的列,值为20
HBase(main):013:0> put ‘user’, ‘’, ‘info:age’, 20
向user表中插入信息,row key为,列族data中添加名为pic的列,值为
HBase(main):014:0> put ‘user’, ‘’, ‘data:pic’, ‘’
④ 查询数据操作一
查询方式一 使用get命令通过进行查询
获取user表中row key为的所有信息(即所有cell的数据)
使用get命令
HBase(main):015:0> get ‘user’, ‘’
使用get命令查看下某个列族的信息
获取user表中row key为,info列族的所有信息
HBase(main):016:0> get ‘user’, ‘’, ‘info’
使用get命令查看指定列族指定字段的值
获取user表中row key为,info列族的name、age列的信息
HBase(main):017:0> get ‘user’, ‘’, ‘info:name’, ‘info:age’
使用get命令查看指定多个列族的信息
获取user表中row key为,info、data列族的信息
HBase(main):018:0> get ‘user’, ‘’, ‘info’, ‘data’
或者你也可以这样写
HBase(main):019:0> get ‘user’, ‘’, { => [‘info’, ‘data’]}
或者你也可以这样写,也行
HBase(main):020:0> get ‘user’, ‘’, { => [‘info:name’, ‘data:pic’]}
使用get命令指定与列值过滤器查询
获取user表中row key为,cell的值为的信息
HBase(main):021:0> get ‘user’, ‘’, { => “(=, ‘:’)”}
使用get命令指定与列名模糊查询
获取user表中row key为,列标示符中含有a的信息
HBase(main):022:0> get ‘user’, ‘’, { => “(=,‘:a’)”}
继续插入一批数据
HBase(main):023:0> put ‘user’, ‘’, ‘info:name’, ‘’
HBase(main):024:0> put ‘user’, ‘’, ‘info:’, ‘’
HBase(main):025:0> put ‘user’, ‘’, ‘info:’, ‘中国’
HBase(main):026:0> get ‘user’, ‘’, { => “(=, ‘:中国’)”}
⑤ 查询所有行的数据二
查询user表中的所有信息
使用scan命令
HBase(main):027:0> scan ‘user’
使用scan命令进行列族查询
查询user表中列族为info的信息
scan ‘user’, { => ‘info’}
//当把某些列的值删除后,具体的数据并不会马上从存储文件中删除;查询的时候,不显示被删除的数据;如果想要查询出来的话,RAW => true
scan ‘user’, { => ‘info’, RAW => true,=> 5}
scan ‘user’, { => ‘info’, RAW => true,=> 3}
使用scan命令进行多列族查询
查询user表中列族为info和data的信息
scan ‘user’, { => [‘info’, ‘data’]}
使用scan命令指定列族与某个列名查询
查询user表中列族为info、列标示符为name的信息
scan ‘user’, { => ‘info:name’}
查询info:name列、data:pic列的数据
scan ‘user’, { => [‘info:name’, ‘data:pic’]}
查询user表中列族为info、列标示符为name的信息,并且版本最新的5个
scan ‘user’, { => ‘info:name’,=> 5}
使用scan命令指定多个列族与条件模糊查询
查询user表中列族为info和data且列标示符中含有a字符的信息
scan ‘user’, { => [‘info’, ‘data’],=> “(=,‘:a’)”}
使用scan命令指定的范围查询
查询user表中列族为info,rk范围是[, )的数据
scan ‘user’, { => ‘info’,=> ‘’,=> ‘’}
使用scan命令指定模糊查询
查询user表中row key以rk字符开头的数据
使用scan命令指定数据版本的范围查询
查询user表中指定范围的数据(前闭后开)
scan ‘user’, { => [80, 84]}
hbase(main):039:0> scan ‘user’, { => [07,22]}
⑥ 更新数据操作
1 更新数据值
更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加
使用put命令
2 更新版本号
将user表的f1列族版本数改为5
HBase(main):040:0> alter ‘user’, NAME => ‘info’,=> 5
⑦ 删除数据以及删除表操作
1 指定以及列名进行删除
删除user表row key为,列标示符为info:name的数据(删除一个kv数据)
HBase(main):041:0>‘user’, ‘’, ‘info:name’
删除整行数据
hbase(main):024:0> deleteall 't_user_info','001'0 row(s) in 0.0090 secondshbase(main):025:0> get 't_user_info','001'COLUMNCELL0 row(s) in 0.0110 seconds
2 指定,列名以及版本号进行删除
删除user表row key为,列标示符为info:name,为16的数据
hbase(main):042:0>‘user’, ‘’, ‘info:name’, 16
3 删除一个列族
删除一个列族:
alter ‘user’, NAME => ‘info’,=> ‘’
或 alter ‘user’, ‘’ => ‘info’
4 清空表数据
HBase(main):045:0>‘user’
5 删除表
首先需要先让该表为状态,使用命令:
HBase(main):049:0>‘user’
然后使用drop命令删除这个表
HBase(main):050:0> drop ‘user’
(注意:如果直接drop表,会报错:Drop the named table. Table must first be )
⑧ 统计一张表有多少行数据
HBase(main):046:0> count ‘user’
六 HBase的高级shell管理命令 1
例如:显示服务器状态
HBase(main):051:0>‘’
2
显示HBase当前用户,例如:
HBase>
3 list
显示当前所有的表
HBase > list
4 count
统计指定表的记录数,例如:
HBase> count ‘user’
为了展示下面功能,然后重新创建user表,并插入数据
创建user表,包含info、data两个列族
使用命令
hbase(main):008:0> create 'user', 'info', 'data'0 row(s) in 1.3080 seconds
向表中插入数据
使用put命令
向user表中插入信息,row key为,列族info中添加名为name的列,值为
HBase(main):011:0> put 'user', 'rk0001', 'info:name', 'zhangsan'
向user表中插入信息,row key为,列族info中添加名为的列,值为
HBase(main):012:0> put 'user', 'rk0001', 'info:gender', 'female'
向user表中插入信息,row key为,列族info中添加名为age的列,值为20
HBase(main):013:0> put 'user', 'rk0001', 'info:age', 20
向user表中插入信息,row key为,列族data中添加名为pic的列,值为
HBase(main):014:0> put 'user', 'rk0001', 'data:pic', 'picture'
5
展示表结构信息
HBase>‘user’
6
检查表是否存在,适用于表量特别多的情况
7 、
检查表是否启用或禁用
HBase>‘user’
HBase>‘user’
8 alter
该命令可以改变表和列族的模式,例如:
为当前表增加列族:
HBase> alter ‘user’, NAME => ‘CF2’,=> 2
为当前表删除列族:
HBase(main):002:0> alter ‘user’, ‘’ => ‘CF2’
9 /
禁用一张表/启用一张表
HBase>‘user’
HBase>‘user’
10 drop
删除一张表,记得在删除表之前必须先禁用
11
禁用表-删除表-创建表
七 Hive与HBase的集成
Hive提供了与HBase的集成,使得能够在HBase表上使?HQL语句进?查
询 插?操作以及进?Join和Union等复杂查询、同时也可以将hive表中的
数据映射到Hbase中 。
版本说明:
? hbase版本:hbase-1.2.0-cdh5.14.2
? hive版本:hive-1.1.0-cdh5.14.2
数据模型:
row,,age,
001,,20,alex
002,,34,jack
003,,23,lili
创建HBase的数据:
create 'stu20210308','info'put 'stu20210308','001','info:addres','guangzhou'put 'stu20210308','001','info:age','20'put 'stu20210308','001','info:username','alex'put 'stu20210308','002','info:addres','shenzhen'put 'stu20210308','002','info:age','34'put 'stu20210308','002','info:username','jack'put 'stu20210308','003','info:addres','beijing'put 'stu20210308','003','info:age','23'put 'stu20210308','003','info:username','lili'
ps:退出HBASE指令是!quit
创建与HBase集成的Hive的外部表:
CREATE EXTERNAL TABLE stu20210308(id string,addres string,age string,username string)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITH SERDEPROPERTIES ("hbase.columns.mapping" =":key,info:addres,info:age,info:username")TBLPROPERTIES ("hbase.table.name" = "stu20210308");hive (test)> CREATE EXTERNAL TABLE stu20210308(> id string,> addres string,> age string,> username string)> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'> WITH SERDEPROPERTIES (> "hbase.columns.mapping" => ":key,info:addres,info:age,info:username")> TBLPROPERTIES ("hbase.table.name" = "stu20210308");OKTime taken: 1.933 secondshive (test)> select * from stu20210308;OKstu20210308.idstu20210308.addresstu20210308.age stu20210308.username001guangzhou20alex002shenzhen34jack003beijing 23liliTime taken: 0.09 seconds, Fetched: 3 row(s)
ps:具体这里可查看Hive与HBase的集成
Hive表映射HBase实例二
建HBase表
hbase(main):018:0>‘’,‘info’
数据插入HBase
info:
info:
info:
info:
建hive映射表
create external table wedw_tmp.t_user_info(idstring,order_idstring,order_amt string,user_idstring,user_name string)STORED by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'with serdeproperties("hbase.columns.mapping"=":key,info:order_id,info:order_amt,info:user_id,info:user_name")tblproperties("hbase.table.name"="user_info");
查询映射好的hive表
* from .;
八 HBase客户端API操作
表创建
增加数据
删除数据
全表扫描
过滤器
匹配
九 操作HBase
,由 开源的一个项目,后又捐给了 。它相当于一个Java 中间件,帮助开发者,像
使用jdbc 访问关系型数据库一样,访问NoSql 数据库HBase 。
与其他 产品完全集成,如Spark,Hive,Pig,Flume 和 。
1 安装 1.1 下载
注意:下载 的时候,请注意对应的版本,其中4.14 版本可以运行在.98、1.1、1.2、1.3、1.4 上 。
下载时也可以直接使用:
wget http://mirrors.shu.edu.cn/apache/phoenix/apache-phoenix-4.14.0-HBase-1.2/bin/apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz
1.2 解压
tar -zxvf apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz
1.3 整合到hbase
查看 下的所有的文件,将-4.14.0-HBase-1.2-.jar 拷贝到所有HBase 节点(包括以及)的lib 目录下:
重启HBase:bin/stop-hbase.shbin/start-hbase.sh
1.4 使用 SQL命令行
进入 的安装包,执行:
bin/sqlline.py bigdata1:2181
1.4.1 创建表
在 终端下创建 表:
>> CREATE TABLE IF NOT EXISTS us_population (state CHAR(2) NOT NULL,city VARCHAR NOT NULL,population BIGINTCONSTRAINT my_pk PRIMARY KEY (state, city));
使用! 查看创建的表:
>> !tables
1.4.2 编辑并导入数据
在 目录下创建一个data 目录,在data 目录下创建:
vi .csv
NY,New York,8143197CA,Los Angeles,3844829IL,Chicago,2842518TX,Houston,2016582PA,Philadelphia,1463281AZ,Phoenix,1461575TX,San Antonio,1256509CA,San Diego,1255540TX,Dallas,1213825CA,San Jose,912332
执行bin/psql.py data/.csv 导入数据 。
除了导入数据外,还可以使用 的语法插入数据: into(‘NY’,‘’,);
1.4.3 查询数据
方式一:在data 目录下创建s.sql 文件:
SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum"FROM us_populationGROUP BY stateORDER BY sum(population) DESC;
执行bin/psql.py data/s.sql 检索数据 。
方式二:使用命令行终端
bin/sqlline.py bigdata1:2181>> select * from us_populcation;
2 -sql 连接 2.1 下载-sql
#
2.2 设置-sql 连接
拷贝jar【-4.14.0-HBase-1.2-.jar】到-sql 的lib 目录;
设置 连接的 信息,其中 为 所在的主机地址,填写一个即可 。
3映射Hbase 表
进入Hbase 命令行终端bin/hbase shell
创建Hbase 表’’:
– 创建Hbase 表,列族info
‘’,‘info’
– 添加数据
put ‘’, ‘’,‘info:name’,‘’
put ‘’, ‘’,‘info:name’,‘hbase’
映射HBase 表的方式有两种,一直是视图映射,一种是表映射 。
两者的区别就是对HBase 的物理表有没有影响;
删除 视图映射不会对Hbase 的表造成影响;
删除 表映射会将Hbase 的表也删除;
非必要情况下一般创建视图映射 。
3.1 视图映射
在 下创建视图映射HBase 表:
-- 创建视图关联映射Hbase 表create view "phoenix" (pk VARCHAR primary key,"info"."name" VARCHAR);
查询创建好的 视图:
– 删除视图后,在hbase shell 终端下查看 依然存在
drop view "phoenix";
3.2 表映射
在 下创建表映射HBase 表:
– 创建表关联映射Hbase 表,4.10 以后 优化了列映射,=0 禁用列映射 。
create table "phoenix" (pk VARCHAR primary key,"info"."name" VARCHAR) COLUMN_ENCODED_BYTES = 0;
查询数据:
结语:
本篇文章介绍到此结束,码字不易,如果本篇文章对您有所帮助,麻烦动动发财的小手,三连点赞,关注,收藏支持下 。有需要沟通交流的,可随时沟通交流,多谢大家支持!!!