hbase
1.hbase简介
1.1hbase定义
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库
1.2HBase数据模型
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。
1.2.1hbase逻辑结构
hbase 逻辑上是一张大表,行上面有region划分 ,列上面有列族划分(column family)
每个region上面有多个行(row)组成 每个行(row)有一个RowKey和多个Column(列)组成
row :HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符)进行限定,
Cell :由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。 在图中表示即 张三 为一个单元
Time Stamp :用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上该字段,其值为写入HBase的时间。
1.2.2HBase物理存储结构
1.2.3 HBase基本架构
架构角色:
1)Region Server
Region Server为 Region的管理者,其实现类为HRegionServer,主要作用如下:
对于数据的操作:get, put, delete;
对于Region的操作:splitRegion、compactRegion。
2)Master
Master是所有Region Server的管理者,其实现类为HMaster,主要作用如下:
对于表的操作:create, delete, alter
对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移。
3)Zookeeper
HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。
4)HDFS
HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用的支持。
2.hbase的安装部署
hbase是依赖zookeeper的 首先要安装zookeeper 这里就不多做介绍了 详见zookeeper 安装部署
1)下载hbase 并解压到指定目录 并重命名
tar -zxvf hbase-2.0.5-bin.tar.gz -C /opt/module
mv /opt/module/hbase-2.0.5 /opt/module/hbase
2) 配置环境变量
sudo vim /etc/profile.d/my_env.sh
#HBASE_HOME
export HBASE_HOME=/opt/module/hbase
export PATH=$PATH:$HBASE_HOME/bin
3)修改HBase对应的配置文件。 一共修改三个文件
1.hbase-env.sh修改内容:
export HBASE_MANAGES_ZK=false
2.hbase-site.xml修改内容
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop102:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop102,hadoop103,hadoop104</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
</configuration>
3.regionservers:
hadoop102
hadoop103
hadoop104
3.hbase的启动,关闭
start-hbase.sh
stop-hbase.sh
单点启动
hbase-daemon.sh start master
hbase-daemon.sh start regionserver
在哪个节点上启动 master就是那个节点
4.查看HBase页面
http://hadoop102:16010
5.高可用
在HBase中HMaster负责监控HRegionServer的生命周期,均衡RegionServer的负载,如果HMaster挂掉了,
那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以HBase支持对HMaster的高可用配置。
1.关闭HBase集群(如果没有开启则跳过此步)
stop-hbase.sh
2.在conf目录下创建backup-masters文件
touch conf/backup-masters
3.在backup-masters文件中配置高可用HMaster节点
echo hadoop103 > conf/backup-masters
4.将整个conf目录scp到其他节点
scp -r conf/ hadoop103:/opt/module/hbase/
scp -r conf/ hadoop104:/opt/module/hbase/
5.打开页面测试查看
http://hadooo102:16010
http://hadooo103:16010
6.HBase Shell操作
1.进入HBase客户端命令行
hbase shell
2.查看帮助命令
help
3.查看当前数据库中有哪些表
list
4.表的操作
1)创建表 所有数据都用引号引起来 指定表明 列族名
create 'student','info'
2)插入数据到表
put 'student','1001','info:name','zhangsan'
put 'student','1001','info:age','18'
put 'student','1001','info:gender','male'
put 'student','1002','info:name','lisi'
put 'student','1002','info:gender','female'
3)更新,修改指定字段的数据 (还是直接put就行)
put 'student','1001','info:name','wamhwu'
put 'student','1001','info:age','100'
4)扫描查看表数据 scan 查看全部或者行 get 查看一行或者一个cell get效率更高
查看全部 scan 'student'
查看指定行 从1001开始到最后 scan 'student',{STARTROW => '1001'}
查看指定行 从1001开始到指定位置 左闭右开 scan 'student',{STARTROW => '1001', STOPROW => '1003'} 即1001,1002两行
查看指定行 从1001开始到1003 scan 'student',{STARTROW => '1001', STOPROW => '1003!'}大于1003的最小数
查看指定行 从10001开始到1003之前的所有行 scan 'student',{STARTROW => '1001', STOPROW => '1002|'} 大于1002的最大数但不超过1003
查看全部信息 scan 'student', {RAW => true, VERSIONS => 10}
查看指定cell get 'student','1001','info:name'
查看指定行 get 'student','1001'
5)查看表结构
describe 'student'
6)统计表数据行数(rowkey的个数)
count 'student'
7)删除数据
删除某rowkey的全部数据:deleteall 'student','1001'
删除某rowkey的某一列数据: delete 'student','1002','info:sex'
8)清空表数据
truncate 'student'
清空表的操作顺序为先disable,然后再truncate。
9)删除表
首先需要先让该表为disable状态:disable 'student'
然后才能drop这个表:drop 'student'
如果直接drop表,会报错:ERROR: Table student is enabled. Disable it first.
10)变更表信息
将info列族中的数据存放3个版本将info列族中的数据存放3个版本
alter 'student',{NAME=>'info',VERSIONS=>3}
get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
11)namespace
※list_namespace
default(创建表时未指定命名空间的话默认在default下)
hbase(系统使用的,用来存放系统相关的元数据信息等,勿随便操作)
※创建namespace
create_namespace "test" or create_namespace "test",{"author"=>"xiaobu", "create_time"=>"2020-03-10 08:08:08"}
※查看namespace
describe_namespace "test01"
※修改namespace的信息
alter_namespace "test01", {METHOD => 'set', 'author' => 'xiaobu'}
※删除namespace
drop_namespace "test01" 注意的是要删除的namespace必须是空的,其下没有表。
7.整合phoenix
1.上传并解压tar包 tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /opt/module/
2.复制server包并拷贝到各个节点的hbase/lib (自我理解:这里phoenix相当于hbase的一个客户端,用sql的方式操作hbase)
cp /opt/module/phoenix/phoenix-5.0.0-HBase-2.0-server.jar /opt/module/hbase/lib/ 然后分发到所有的hbase集群中,保证每个hbase机器上有server包
3.配置环境变量(这个比较特殊,解压完成之后没有lib目录或者其他目录存放相关的jar包,所以配置了类路径)
export PHOENIX_HOME=/opt/module/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin
4.启动hbase
start-hbase
5.phoenix架构 thin
6.Phoenix Shell操作
1)创建schema
默认情况下,在phoenix中不能直接创建schema。需要将如下的参数添加到Hbase中conf目录下的hbase-site.xml 和 phoenix中bin目录下的 hbase-site.xml中,hbase-site.xml集群中的每台机器都要有这个文件。
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
重启hbase客户端和phoenix客户端
2)启动phoenix客户端的两种方式 thick and thin
thick client :sqlline.py hadoop102,hadoop103,hadoop104:2181
thin client: 1) queryserver.py start 2) sqlline-thin.py Hadoop102:8765 有架构图可知,首先启动queryserver,然后在启动sqlline
两种方式都可以不用指定主机名以及端口号
create schema bigdata;
注意:在phoenix中,schema名,表名,字段名等会自动转换为大写,若要小写,使用双引号,如"student"。create schema if not exists “student”
3)显示所有表
!table 或者!tables
4)创建表
直接指定单个列作为RowKey
CREATE TABLE IF NOT EXISTS student(
id VARCHAR primary key,
name VARCHAR,
addr VARCHAR);
指定多个列的联合作为RowKey
CREATE TABLE IF NOT EXISTS us_population (
State CHAR(2) NOT NULL,
City VARCHAR NOT NULL,
Population BIGINT
CONSTRAINT my_pk PRIMARY KEY (state, city));
upsert into us_population values('NY','New York',8143197) ;
upsert into us_population values('CA','Los Angeles',3844829) ;
5)插入数据(比较特殊 insert 和upset的结合)
upsert into student values('1001','zhangsan','beijing');
6)查询
select * from student;
select * from student where id='1001';
7)删除记录
delete from student where id='1001';
8)删除表
drop table student;
9)退出命令行
!quit
7.表的映射
1) Hbase中没有表,phoenix中创建表会同时在hbase中也创建表
create 'emp','info'
put 'emp','1001','info:name','zhangsan'
put 'emp','1001','info:addr','beijing'
2) Hbase中有表, 可以在phoenix中创建视图(只读)进行映射
create view "emp"(
id varchar primary key ,
"info"."name" varchar ,
"info"."addr" varchar
)
select * from "emp" ;
select id , "name","addr" from "emp" ;
upsert into "emp" values('1002','lisi','shanghai'); Error: ERROR 505 (42000): Table is read only. (state=42000,code=505)
drop view "emp";
删除view后,habse 中的表不会删除
3) Hbase中有表, 可以在phoenix中创建表进行映射
create table "emp"(
id varchar primary key ,
"info"."name" varchar ,
"info"."addr" varchar
)
COLUMN_ENCODED_BYTES = NONE;
select * from "emp" ;
select id , "name","addr" from "emp" ;
drop table "emp";
删除phoenix后,hbase中的表连带被删除
8.表映射中数值类型的问题
phoenix存,phoenix查.没有问题 phoenix 默认int hbase 默认long
phoenix存,hbase查.有问题
hbase存,hbase查,没有问题
hbase存,phoenix查,有问题
phoenix存,hbase查(phoenix存,phoenix查没有问题)
数字改成无符号类型的 UNSIGNED_INT
create table test (
id varchar primary key ,
name varchar ,
salary UNSIGNED_INT
)
COLUMN_ENCODED_BYTES = NONE;
upsert into test values('1001','zs',123456);
hbase中数字默认编码解码LONG类型,所以用下列方式
scan "TEST1",{COLUMNS => ['0:SALARY:toInt']}
hbase存,hbase查 还要把之前phoenix存的删除
put 'TEST','1002','0:NAME','ls'
put 'TEST','1002','0:SALARY',Bytes.toBytes(456789)
scan "TEST1",{COLUMNS => ['0:SALARY:toLong']}
用hbaseAPI存入一个INT类型的值 ,即可在phoenix查出