hbase简介

  1. 概述
    1.1. 概述
    1.1.1. 概述
    hbase即Hadoop Database,NoSQL数据库,面向列,提供实时更新查询。是一个高可靠性 高性能 面向列 可伸缩的分布式存储系统,利用hbase技术可以在廉价的PC上搭建起大规模结构化存储集群。
    HBase利用HadoopHDFS作为其文件存储系统,利用Hadoop的MapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具 。
    1.2. 基本概念
    1.2.1. 行健
    行键 - RowKey - 即hbase的主键,访问hbse中的数据有三种方式
    通过单一行键访问
    通过一组行键访问
    全表扫描
    1.2.2. 列簇
    列族(簇) - Column Family,在建表时声明,不能后期增加,如果需要增加只能alter表,一个列族可以包含一个或多个列。
    1.2.3. 列
    列 - Column,可以动态增加列,不需要提前声明
    1.2.4. 时间戳
    时间戳 - cell timestamp,通过row和columns确定的一个存储单元为一个cell。每个cell都保存着一个数据的多个版本,版本通过时间戳来区别。
    数据都以二进制形式存储,没有数据类型的区别。
    所有空数据都不占用空间。
  2. 安装配置
    2.1. 安装配置
    2.1.1. 版本对应
    HBase-0.92.x HBase-0.94.x HBase-0.96
    Hadoop-0.20.205 S X X
    Hadoop-0.22.x S X X
    Hadoop-1.0.x S S S
    Hadoop-1.1.x NT S S
    Hadoop-0.23.x X S NT
    Hadoop-2.x X S S

前提条件,安装jdk,并配置了环境变量
2.2. 单机模式
2.2.1. 安装
直接解压安装包
tar -zxvf xxxxx.tar.gz
修改conf/hbase-site.xml,配置hbase使用的数据文件的位置,默认在/tmp/hbase-[username],此目录是linux的临时目录,可能会被系统清空,所以最好修改一下

hbase.rootdir
file:/// /hbase

2.2.2. 测试
bin/start-hbase.sh
bin/hbase shell
hbase>status

hbase>help

hbase>create ‘testtable’,'‘colfam1’,‘colfam2’
hbase>list
hbase>describe ‘testtable’
hbase>put ‘testtable’,‘myrow-1’,‘colfam1:q1’,‘value-1’
hbase>put ‘testtable’,‘myrow-2’,‘colfam1:q2’,‘value-2’
hbase>put ‘testtable’,‘myrow-2’,‘colfam1:q3’,‘value-3’
hbase>scan ‘testtable’
hbase>get ‘testtable’,‘myrow-1’
hbase>delete ‘testtable’,‘myrow-2’,‘colfam1:q2’
hbase>scan ‘testtable’
hbase>disable ‘testtable’
hbase>drop ‘testtable’

#建表时可以指定VERSIONS,配置的是当前列族在持久化到文件系统中时,要保留几个最新的版本数据,这并不影响内存中的历史数据版本
hbase>create ‘testtable’,{NAME=>‘colfam1’,VERSIONS=>3},{NAME=>‘colfam2’,VERSIONS=>1}
hbase>put ‘testtable’,‘myrow-1’,‘colfam1:q1’,‘value-1’
#直接使用scan而不加RAW=>true只能查询到最新版本的数据
hbase>scan ‘testtable’
hbase>put ‘testtable’,‘myrow-1’,‘colfam1:q1’,‘value-2’
hbase>scan ‘testtable’
hbase>put ‘testtable’,‘myrow-1’,‘colfam1:q1’,‘value-3’
hbase>scan ‘testtable’
#可以在查询时加上RAW=>true来开启对历史版本数据的查询,VERSIONS=>3指定查询最新的几个版本的数据
hbase>scan ‘testtable’,{RAW=>true,VERSIONS=>3}
hbase>put ‘testtable’,‘myrow-1’,‘colfam1:q1’,‘value-4’
hbase>scan ‘testtable’
hbase>scan ‘testtable’,{RAW=>true,VERSIONS=>3}

hbase>put ‘testtable’,‘myrow-1’,‘colfam2:x1’,‘value-1’
hbase>scan ‘testtable’
hbase>put ‘testtable’,‘myrow-1’,‘colfam2:x1’,‘value-2’
hbase>scan ‘testtable’
hbase>scan ‘testtable’,{RAW=>true,VERSIONS=>3}

#重启hbase
hbase>scan ‘testtable’,{RAW=>true,VERSIONS=>3}

hbase>exit
bin/stop-hbase.sh

hbase命令行下不能使用删除:
可以使用 ctrl+删除键 来进行删除

修改xshell配置:
文件->属性->终端->键盘
->delete键序列[VT220Del]
->backspace键序列[ASCII127]
2.3. 伪分布式模式
2.3.1. 配置文件
修改conf/hbase-env.sh修改JAVA_HOME
export JAVA_HOME=xxxx
修改hbase-site.xml,配置使用hdfs

hbase.rootdir
hdfs://hadoop00:9000/hbase


dfs.replication
1

启动hbase
2.4. 完全分布式模式
2.4.1. 配置文件
修改conf/hbase-env.sh修改JAVA_HOME
export JAVA_HOME=xxxx
修改hbase-site.xml,配置开启完全分布式模式
配置hbase.cluster.distributed为true。
配置hbase.rootdir设置为HDFS访问地址

hbase.rootdir
hdfs://hadoop00:9000/hbase


hbase.cluster.distributed
true

配置region服务器,修改conf/regionservers文件,其中配置所有hbase主机,每个主机名独占一行,hbase启动或关闭时会按照该配置顺序启动或关闭主机中的hbase

使用已有的zookeeper集群。这种方式下zookeeper脱离了hbase,不会随着hbase的启动关闭而启动关闭。需要自己来启动关闭。
hbase默认使用自带的zookeeper,如果需要使用外部zookeeper,需要先关闭
修改conf/hbase-env.sh禁用内部zookeeper
export HBASE_MANAGES_ZK false
在hbase-site.xml中配置Zookeeper的连接地址与端口号

hbase.zookeeper.quorum
hadoop01:2181,hadoop02:2181,hadoop03:2181

2.4.2. HBASE配置文件说明
hbase-env.sh配置HBase启动时需要的相关环境变量
hbase-site.xml配置HBase基本配置信息
HBASE启动时默认使用hbase-default.xml中的配置,如果需要可以修改hbase-site.xml文件,此文件中的配置将会覆盖hbase-default.xml中的配置
修改配置后要重启hbase才会起作用

2.4.3. 启动集群
启动zookeeper
启动hdfs
启动hbase
访问http://xxxxx:60010来访问web界面,通过web见面管理hbase
也可以通过hbase shell脚本来访问bhase

2.4.4. 关闭集群
stop-hbase.sh

  1. HBASE原理
    3.1. HBase的工作方式
    3.1.1. HBase的工作方式
    hbase中的表在行的方向上分隔为多个HRegion,分散在不同的RegionServe中,这样做的目的是在查询时可以将工作量分布到多个RegionServer中以提高速度。
    region由[startkey,endkey)表示
    HRegion是hbase分布式存储和负载均衡的最小单元
    要注意HRegion不在hdfs中,而是在RegionServer的内存中,在内存(其实也有数据在本地文件系统中,因为内存空间毕竟是有限的)中存储数据以提高查询性能,对于修改会将数据最终同步到hdfs中,以持久化数据。
    hbase中的数据按照rowkey的字典顺序(字典顺序!!!先比较第一位 如果相同再比较第二位。。。)按序存储,所以当以rowkey查询数据时,可以提高速度。
    hregion的分裂,当hregion变的很大时会分裂成两个,存放到不同的RegionServer中,防止一个Region过大,导致查询其中数据时速度很慢

hbase的系统结构:主要有client hmaster regionServer zookeeper

  1. hbase优势
    4.1. 为什么hbase可以很快
    4.1.1. 为什么hbase可以很快
    从逻辑结构上来说
    表按照行键进行了排序,所以查询时可以很快定位表按照行键进行了排序,所以查询时可以很快定位
    数据按照行键切分为多个HRegion,分布在多个RegionServer中,查询大量数据时,多个RegionServer可以一起工作,从而提高速度
    从物理结构上来说:
    HRegion是存活在RegionServer的内存中的,读写会非常的高效
    还有HFile的支持保证大量的数据可以持久化的保存
    数据最终落地到HDFS中,分布式的存储,保证数据段可靠性和可扩展性

4.2. 为什么hbase可以存储很多数据
4.2.1. 为什么hbase可以存储很多数据
基于hdfs,所以支持可扩展性,可以通过增加大量的廉价的硬件提高存储容量
按列存储,空的数据不占用空间,当存储稀疏数据时,不会浪费空间
按列存储,同一列的数据存放在一起,而同一列的数据一般都是同样的类型的内容相似的数据,可以实现非常高效的压缩,节省空间

4.3. 为什么hbase的数据是可靠的
4.3.1. 为什么hbase的数据是可靠的

基于hdfs,由hdfs的可靠性保证了hbase的可靠性--即数据可以有多个备份
利用zookeeper实现了HA,即使某一台机器挂掉另外的机器也可以很快的替换它

4.4. hbase和hive和传统的关系型数据库的比较
4.4.1. hbase和hive和传统的关系型数据库的比较
比起传统的关系型数据库,可以存储半结构化非结构化的数据,可以存储和处理更大级别的数据,提供高效的查询,对于稀疏数据的处理更好,具有更好的横向扩展性,免费开源性价比很高。但是不能支持非常好的事务特性,只支持行级的事务。只能通过行键来查询,表设计时难度更高。而mysql用来存储结构化的数据提供更好的事务控制。
比起hive,hive只是在mapreduce上包了一层壳,本质上还是离线数据的处理的工具,实时查询性能有限,本质上是一个基于hadoop的数据仓库工具,不能支持行级别的新增修改和删除。hbase可以提供实时的数据的处理能力,适用于在线数据查询处理,本质上是一种数据库工具。

  1. java api操作
    5.1. 导入开发包
    5.1.1. 导入开发包
    将hbase安装包中lib下包导入java项目
    5.2. 创建表
    5.2.1. 创建表
    Configuration conf = HBaseConfiguration.create();
    conf.set(“hbase.zookeeper.quorum”,
    “CentOS01:2181,CentOS02:2181,CentOS03:2181”);

HBaseAdmin admin = new HBaseAdmin(conf);

HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(“tabe”));
HColumnDescriptor hcd_fam1 = new HColumnDescriptor(“fam1”);
hcd_fam1.setMaxVersions(3);
HColumnDescriptor hcd_fam2 = new HColumnDescriptor(“fam2”);
htd.addFamily(hcd_fam1);
htd.addFamily(hcd_fam2);

admin.createTable(htd);

admin.close();
5.3. 插入数据
5.3.1. 插入数据
Configuration conf = HBaseConfiguration.create();
conf.set(“hbase.zookeeper.quorum”,“CentOS01:2181,CentOS02:2181,CentOS03:2181”);

HTable table = new HTable(conf,“tabe”);
Put put = new Put(Bytes.toBytes(“row1”));
put.add(Bytes.toBytes(“fam1”),Bytes.toBytes(“col1”),Bytes.toBytes(“val1”));
put.add(Bytes.toBytes(“fam1”),Bytes.toBytes(“col2”),Bytes.toBytes(“val2”));
put.add(Bytes.toBytes(“fam2”),Bytes.toBytes(“col3”),Bytes.toBytes(“val3”));
table.put(put);

table.close();

**javaapi操作hbase时,入口类为HTable,此对象创建时需要扫描.META表,以及其他操作,这非常耗时,所以,应该将该对象设置为单例,复用该对象,如果需要多个HTable对象,应该使用HTable
Pool,通过对象池复用对象
HTablePool pool = new HTablePool(conf,10);//不知道为什么过时了?
**hbase所有修改数据的操作都保证了行级别的原子性
试验:一次插入100万条数据
HTable table = new HTable(conf,“tabx”);
List puts = new ArrayList();
for(int i=1;i<=1000000;i++){
Put put = new Put(Bytes.toBytes(“row”+i));
put.add(Bytes.toBytes(“fam1”),Bytes.toBytes(“col1”),Bytes.toBytes(“val”+i))
puts.add(put);

if(i % 10000 == 0){
	table.put(puts);
	puts = new ArrayList<Put>();
}

}
table.put(puts);
table.close();
5.4. 获取数据
5.4.1. 获取数据
Configuration conf = HBaseConfiguration.create();
conf.set(“hbase.zookeeper.quorum”,“CentOS01:2181,CentOS02:2181,CentOS03:2181”);

HTable table = new HTable(conf,“tabe”);
Get get = new Get(Bytes.toBytes(“row1”));
Result result = table.get(get);
byte [] bs = result.getValue(Bytes.toBytes(“fam1”),Bytes.toBytes(“col1”));
String str = Bytes.toString(bs);
System.out.println(str);

table.close();
5.5. 获取数据集
5.5.1. 获取数据集
Configuration conf = HBaseConfiguration.create();
conf.set(“hbase.zookeeper.quorum”,“CentOS01:2181,CentOS02:2181,CentOS03:2181”);

HTable table = new HTable(conf,“tabe”);
Scan scan = new Scan(Bytes.toBytes(“row1”));
ResultScanner scanner = table.getScanner(scan);
Iterator it = scanner.iterator();
while(it.hasNext()){
Result result = (Result) it.next();
byte [] bs = result.getValue(Bytes.toBytes(“fam1”),Bytes.toBytes(“col1”));
String str = Bytes.toString(bs);
System.out.println(str);
}
table.close();
5.6. 删除数据
5.6.1. 删除数据
Configuration conf = HBaseConfiguration.create();
conf.set(“hbase.zookeeper.quorum”,“CentOS01:2181,CentOS02:2181,CentOS03:2181”);

HTable table = new HTable(conf,“tabe”);
Delete delete = new Delete(Bytes.toBytes(“row1”));
table.delete(delete);
table.close();
5.7. 删除表
5.7.1. 删除表
//1.创建配置对象
HBaseConfiguration conf = new HBaseConfiguration();
conf.set(“hbase.zookeeper.quorum”, “CentOS01”);
//2.创建HBaseAdmin对象
HBaseAdmin admin = new HBaseAdmin(conf);
//3.删除表
admin.disableTable(Bytes.toBytes(“tab1”));
admin.deleteTable(Bytes.toBytes(“tab1”));
//4.关闭连接
admin.close();
6. HBase的表设计
6.1. 表设计
6.1.1. 表设计
HBase是用来存放半结构化 非结构化数据的数据库。
6.2. 列族的设计
6.2.1. 列族的设计
在设计hbase表时候,列族不宜过多,尽量的要少使用列族。
经常要在一起查询的数据最好放在一个列族中,尽量的减少跨列族的数据访问。
6.3. 行键的设计
6.3.1. 行健的设计
hbase表中行键是唯一标识一个表的字段,首先要求唯一,另外最好是一些有意义的值,来帮助我们识别表中的数据。所以hbase中的行键是需要进行设计的。
hbase中的行键的设置至关重要,严重的影响hbase的执行效率和查询的便利性。
6.3.2. 行键设计的基本原则:
行键必须唯一
必须唯一才能唯一标识数据
行键最好是字符串类型
因为数值类型在不同的系统中处理的方式可能不同
行键必须有意义
这样才能方便数据的查询
行键最好具有固定的长度
不同长度的数据可能会造成自然排序时排序的结果和预期不一致
6.3.3. 行键的最佳实践
长度原则
行键最多可以达到64KB,但是最好是在10~100字节之间,最好不要超过16字节,越短越好,最好是8字节的整数倍。
散列原则
行键的设计将会影响数据在hbase表中的排序方式,这会影响region切分后的结果,要注意,在设计行键时应该让经常要查询的数据分散在不同的region中,防止某一个或某几个regionserver成为热点。
有序原则
行键的设计将会影响数据在hbase表中的排序方式,所以一种策略是将经常连续查询的条件作为行键最前面的数据,这样一来可以方便批量查询
7. hbase案例
7.1. 案例
7.1.1. 案例
用户表
id name age gender email
001 zhang 19 男 zhang@qq.com
002 wang 20 男 wang@qq.com
用户访问的网页
host viewtime content userid
www.baidu.com 2016-12-20 xxxx 001
www.sina.com 2016-11-10 xxxx 001
www.souhu.com 2016-11-09 xxxx 001
www.baidu.com 2016-12-20 xxxx 002
www.163.com 2016-12-20 xxxx 002
8. Phoenix概述
8.1. 概述
8.1.1. 概述
HBase基础上架构的SQL中间件,让我们可以通过SQL/JDBC来操作HBase
9. Phoenix安装配置
9.1. 安装配置
9.1.1. 安装配置
1.到apache下载Phoenix安装包,要注意版本和HBase匹配
Phoenix 2.x – HBase 0.94.x
Phoenix 3.x – HBase 0.94.x
Phoenix 4.x – HBase 0.98.1+
2.上传到linux进行解压

3.将如下两个jar包,传到hbase的lib目录下
phoenix-4.8.1-HBase-0.98-server.jar
phoenix-4.8.1-HBase-0.98-client.jar
4.配置环境变量
export HBASE_HOME=/root/work/hbase-0.98.17-hadoop2

5.测试
执行 ./sqlline.py hadoop01,hadoop02,hadoop03:2181
#如果进不去命令行,重启即可
#如果进入Phoenix命令行状态,则证明Phoenix安装完成
10. Phoenix使用
10.1. 在命令行客户端下使用
10.1.1. 创建表
create table tab1(
id integer primary key not null,
name varchar
);
create table tab2(
id varchar primary key not null,
“info”.“name” varchar
);
结论1:在phoenix中创建的表在hbase中会同时创建出表
结论2:在phoenix中创建的表在hbase中表名会变为大写,如果不想让他自动变化,则需要将表明用双引号引起来
结论3:phoenix表中的主键会成为hbase表的行键
结论4:如果不声明phoenix表中的普通列会成为hbase表中默认列族(名字叫0)中的普通列
结论5:也可以在建phoenix表时,来声明底层的列族的名称。
10.1.2. 插入数据
upsert into test values (1,‘Hello’);
upsert into test values (2,‘World!’);
10.1.3. 查询数据
select * from xxx where xxxx;
10.1.4. 删除数据
delete from test where xxxx;
10.1.5. 创建表来关联hbase中已经存在的hbase表
只要创建表和hbase表同名,列一定要声明完全即可。
10.1.6. 删除表
drop table tabx;#要注意,会同时删除hbase底层的表
10.1.7. 视图操作
创建视图:
create view tab3_view as select * from tab3;
查询视图:
select * from tab3_view where xxxx;
删除视图:
drop view tab3_view;
创建视图关联hbase中已经存在的表:
create view “tab4” (id varchar primary key,“cf1”.“c1” varchar,“cf2”.“c2” varchar);
##表关联管理hbase中的数据,删除表的时候,hbase表也被删除
##视图关联管理hbase中的数据,删除视图的时候,hbase表不会被删除
10.2. 在jdbc中使用
10.2.1. 在jdbc中的使用
1.创建java工程导入连接Phoenix的驱动
phoenix-4.8.1-HBase-0.98-client.jar
2.编写jdbc代码即可操作Phoenix中的数据
Connection conn = DriverManager.getConnection(“jdbc:phoenix:hadoop01,hadoop02,hadoop03:2181”);
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(“select * from TAB3”);
while(rs.next()){
String v = rs.getString(“c1”);
System.out.println(v);
}
stat.close();
conn.close();

10.3. 在图形化客户端工具中使用
10.3.1. 客户端工具使用
连接Phoenix的工具Squirrel

a) Squirrel是一个连接数据库的客户端工具,一般支持JDBC的数据库都可以用它来连接,如连接mysql
b) 下载Squirrel SQL Client,java –jar squirrel-sql-3.7.1-standard.jar即可
c) 连接Phoenix在Squirrel的安装目录的lib下添加phoenix-4.8.1-HBase-0.98-client.jar包
10.3.2. SQuirreL SQL客户端使用图解
打开SQuirreL SQL客户端,窗口=》查看驱动程序=》驱动程序=》新建驱动程序

新建别名

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker HBase 是 Docker 容器化技术与 Apache HBase 数据存储系统结合的一种应用。HBase 是一个分布式、列式、可伸缩的 NoSQL 数据库,主要用于大规模数据存储和实时查询。将 HBase 安装在 Docker 镜像中,可以简化部署流程,使得开发者可以在本地或生产环境中快速启动并管理 HBase 实例,特别是对于那些需要频繁迭代和测试的大数据场景非常有用。 具体来说,使用 Docker HBase 的好处包括: 1. **快速部署**:Docker 提供了一种轻量级的方式来打包软件及其依赖环境,这使得部署 HBase 变得更快且一致。 2. **资源隔离**:每个 HBase 容器都是独立运行的,这意味着它们之间不会相互影响,有助于更好地管理资源。 3. **易于扩展**:如果需要增加更多的处理能力,可以通过增加容器实例来水平扩展 HBase。 4. **一致性保证**:由于 Docker 的镜像模式,HBase 的环境配置保持一致,减少了配置问题。 5. **开发环境统一**:开发人员可以在本地开发环境中使用相同的 Docker 镜像构建和测试 HBase 应用。 要开始使用 Docker HBase,你需要做以下几步: 1. **安装 Docker**:确保你的机器上已经安装了 Docker 并运行正常。 2. **查找 Docker HBase 镜像**:在 Docker Hub 上搜索 "hbase" 或者 "apache/hbase",选择官方镜像或者适合你的版本。 3. **运行容器**:使用 `docker run` 命令启动 HBase 容器,并指定所需的参数,如端口映射、持久卷等。 4. **连接到 HBase**:通过 Docker 集成的工具(如 `docker exec`)或者专门的客户端工具(如 HBase shell)连接到容器内部的 HBase 服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值