IT评测·应用市场-qidao123.com

标题: HBase [打印本页]

作者: 圆咕噜咕噜    时间: 2024-7-23 10:32
标题: HBase
1.hbase的先容

hbase的基本简介:hbase依赖于hdfs,hbase是一个nosql数据库,是一个非关系型数据库,支持读写查询操作
hbase当中所有的数据都是byte[]
HBase中的表有如许的特点:

2.hbase与hadoop的关系

1、HDFS

* 为分布式存储提供文件系统

* 针对存储大尺寸的文件进行优化,不需要对HDFS上的文件进行随机读写

* 直接使用文件

* 数据模型不灵活

* 使用文件系统和处理框架

* 优化一次写入,多次读取的方式

2、HBase

* 提供表状的面向列的数据存储

* 针对表状数据的随机读写进行优化

* 使用key-value操作数据

* 提供灵活的数据模型

* 使用表状存储,支持MapReduce,依赖HDFS

* 优化了多次读,以及多次写

hbase是基于hdfs的,hbase的数据都是存储在hdfs上的,hbase是一个数据库,支持随机读写

3.Hbase数据存储架构

主节点:HMaster

从节点:HRegionServer

一个HRegionServer=1个HLog+很多个region
一个region=很多个store模块
一个store模块=1个memoryStore+很多个storeFile
组件:
Write-Ahead logs:Hbase读写数据的时间数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时间,数据可以通过这个日志文件重修。
HFile:这是在磁盘中生存原始数据的古迹物理文件,是实际的存储文件
Store:HFile存储在Store中,一个Store对应Hbase表中的一个列族
MemStore:内存存储,位于内存中,用来生存当前数据操作,所有当数据生存在WAL中后,RegionServer会在内存中存储键值对
Region:Hbase表的分片,HBase表会根据RowKey值被切分成差别的region存储在RegionServer中,在一高RegionServer中可以有多个差别的region
4.Hbase的集群环境搭建

注意事项:Hbase强依赖于HDFS以及zookeeper,所以安装Hbase之前一定要保证Hadoop和zookeeper正常启动
第一步:下载对应的HBase的安装包

下载Hbase的安装包,下载地址如下:
http://archive.apache.org/dist/hbase/2.0.0/hbase-2.0.0-bin.tar.gz

第二步:HBASE集群部署


  1. node01
  2. node02
  3. node03
复制代码
创建back-masters配置文件,实现HMaster的高可用

node01机器进行修改配置文件
cd /export/servers/hbase-2.0.0/conf
vim backup-masters
  1. node02
复制代码
第四步:安装包分发到其他机器

将我们node01服务器的hbase的安装包拷贝到其他机器上面去
cd /export/servers/
scp -r hbase-2.0.0/ node02PWD
scp -r hbase-2.0.0/ node03PWD
第五步:三台机器创建软连接

因为hbase需要读取hadoop的core-site.xml以及hdfs-site.xml当中的配置文件信息,所以我们三台机器都要执行以下下令创建软连接
ln -s /export/servers/hadoop-2.7.5/etc/hadoop/core-site.xml /export/servers/hbase-2.0.0/conf/core-site.xml
ln -s /export/servers/hadoop-2.7.5/etc/hadoop/hdfs-site.xml /export/servers/hbase-2.0.0/conf/hdfs-site.xml

第六步:三台机器添加HBASE_HOME的环境变量

三台机器执行以下下令,添加HBASE_HOME环境变量
vim /etc/profile
export HBASE_HOME=/export/servers/hbase-2.0.0
export PATH=HBASE_HOME/binPATH
第七步:HBase集群启动

第一台机器执行以下下令进行启动
cd /export/servers/hbase-2.0.0
bin/start-hbase.sh

警告提示:HBase启动的时间会产生一个警告,这是因为jdk7与jdk8的问题导致的,假如linux服务器安装jdk8就会产生如许的一个警告
我们可以只是掉所有机器的hbase-env.sh当中的
“HBASE_MASTER_OPTS”和“HBASE_REGIONSERVER_OPTS”配置 来解决这个问题。不外警告不影响我们正常运行,可以不用解决

另外一种启动方式:
我们也可以执行以下下令单节点进行启动
启动HMaster下令
bin/hbase-daemon.sh start master
启动HRegionServer下令
bin/hbase-daemon.sh start regionserver
第八步:页面访问

欣赏器页面访问
http://node01:16010/master-status
5.Hbase的表模型

rowkey:行键,每一条数据都是使用行键来进行唯一标识的
columnFamily:列族,列族下面可以有很多列
column:列,每一个列都必须归属于某一个列族
timestamp:时间戳,每条数据都会有时间戳的概念
versionNum:版本号,每条数据都有版本号,当数据更新时,版本号也改变
创建一张HBase表最少需要两个条件:表名+列族名
注意:rowkey是我们在插入数据的时间本身指定的,列名也是插入数据的时间动态指定的
时间戳是自动天生的,versionNum也是本身维护的
6、HBase常用shell操作

1、进入HBase客户端下令操作界面

node01服务器执行以下下令进入hbase的shell客户端
cd /export/servers/hbase-2.0.0
bin/hbase shell
2、检察资助下令

hbase(main):001:0> help
3、检察当前数据库中有哪些表

hbase(main):002:0> list
4、创建一张表

创建user表,包含info、data两个列族
hbase(main):010:0> create 'user', 'info', 'data'
或者
hbase(main):010:0> create 'user', {NAME => 'info', VERSIONS => '3'},{NAME => 'data'}
5、添加数据操作

向user表中插入信息,row key为rk0001,列族info中添加name列标示符,值为zhangsan
hbase(main):011:0> put 'user', 'rk0001', 'info:name', 'zhangsan'
向user表中插入信息,row key为rk0001,列族info中添加gender列标示符,值为female
hbase(main):012:0> put 'user', 'rk0001', 'info:gender', 'female
向user表中插入信息,row key为rk0001,列族info中添加age列标示符,值为20
hbase(main):013:0> put 'user', 'rk0001', 'info:age', 20
向user表中插入信息,row key为rk0001,列族data中添加pic列标示符,值为picture
hbase(main):014:0> put 'user', 'rk0001', 'data:pic', 'picture'
6、查询数据操作

1、通过rowkey进行查询

获取user表中row key为rk0001的所有信息
hbase(main):015:0> get 'user', 'rk0001'
2、检察rowkey下面的某个列族的信息

获取user表中row key为rk0001,info列族的所有信息
hbase(main):016:0> get 'user', 'rk0001', 'info'
3、检察rowkey指定列族指定字段的值

获取user表中row key为rk0001,info列族的name、age列标示符的信息
hbase(main):017:0> get 'user', 'rk0001', 'info:name', 'info:age'
4、检察rowkey指定多个列族的信息

获取user表中row key为rk0001,info、data列族的信息
hbase(main):018:0> get 'user', 'rk0001', 'info', 'data'
或者你也可以如许写
hbase(main):019:0> get 'user', 'rk0001', {COLUMN => ['info', 'data']}
或者你也可以如许写,也行
hbase(main):020:0> get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}
4、指定rowkey与列值查询

获取user表中row key为rk0001,cell的值为zhangsan的信息
hbase(main):030:0> get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"}
5、指定rowkey与值模糊查询

获取user表中row key为rk0001,列标示符中含有a的信息
hbase(main):031:0> get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
继续插入一批数据
hbase(main):032:0> put 'user', 'rk0002', 'info:name', 'fanbingbing'
hbase(main):033:0> put 'user', 'rk0002', 'info:gender', 'female'
hbase(main):034:0> put 'user', 'rk0002', 'info:nationality', '中国'
hbase(main):035:0> get 'user', 'rk0002', {FILTER => "ValueFilter(=, 'binary:中国')"}
6、查询所有数据

查询user表中的所有信息
scan 'user'
7、列族查询

查询user表中列族为info的信息
scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}
8、多列查询

查询user表中列族为info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}
9、指定列族与某个列名查询

查询user表中列族为info、列标示符为name的信息
scan 'user', {COLUMNS => 'info:name'}
10、指定列族与列名以及限定版本查询

查询user表中列族为info、列标示符为name的信息,并且版本最新的5个
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}
11、指定多个列族与按照数据值模糊查询

 查询user表中列族为info和data且列标示符中含有a字符的信息
scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}
12、rowkey的范围值查询

查询user表中列族为info,rk范围是[rk0001, rk0003)的数据
scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}
13、指定rowkey模糊查询

查询user表中row key以rk字符开头的
scan 'user',{FILTER=>"refixFilter('rk')"}
14、指定数据范围值查询

查询user表中指定范围的数据
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
7.Hbase 总结一:

8.JavaAPI

DML:Table

使用Hbase API实现Table的实例开发
DML的所有操作都必须构建Hbase表的对象进行操作
代码:
  1. public Table getHbaseTable() throws IOException {
  2.         TableName tbname = TableName.valueOf("itcast:t1");
  3.         Table table = conn.getTable(tbname);
  4.         return table;
  5.     }
复制代码
DML:Put

实现Put插入或者更新数据
代码:
  1. @Test
  2.     public void testPut() throws IOException {
  3.         Table table = getHbaseTable();
  4.         //构建Put对象,一个Put对象表示写入一个Rowkey的数据
  5.         Put put = new Put(Bytes.toBytes("20210101_001"));
  6.         //添加列的信息
  7.         put.addColumn(Bytes.toBytes("basic"),Bytes.toBytes("name"),Bytes.toBytes("laoda"));
  8.         put.addColumn(Bytes.toBytes("basic"),Bytes.toBytes("age"),Bytes.toBytes("18"));
  9.         put.addColumn(Bytes.toBytes("other"),Bytes.toBytes("phone"),Bytes.toBytes("110"));
  10.         //执行Put
  11.         table.put(put);
  12.         table.close();
  13.     }
复制代码
小结:

DML:Get

实现Get读取数据
先用下令行插入数据,便于测试:
  1. put 'itcast:t1','20210201_000','basic:name','laoda'
  2. put 'itcast:t1','20210201_000','basic:age',18
  3. put 'itcast:t1','20210101_001','basic:name','laoer'
  4. put 'itcast:t1','20210101_001','basic:age',20
  5. put 'itcast:t1','20210101_001','basic:sex','male'
  6. put 'itcast:t1','20210228_002','basic:name','laosan'
  7. put 'itcast:t1','20210228_002','basic:age',22
  8. put 'itcast:t1','20210228_002','other:phone','110'
  9. put 'itcast:t1','20210301_003','basic:name','laosi'
  10. put 'itcast:t1','20210301_003','basic:age',20
  11. put 'itcast:t1','20210301_003','other:phone','120'
  12. put 'itcast:t1','20210301_003','other:addr','shanghai'
复制代码
代码: 
  1. @Test
  2.     public void testGet() throws IOException {
  3.         Table table = getHbaseTable();
  4.         //构建Get:get tbname,rowkey,[cf:col]
  5.         Get get = new Get(Bytes.toBytes("20210301_003"));
  6.         //配置Get
  7.         get.addFamily(Bytes.toBytes("basic"));//指定列族读取
  8. //        get.addColumn()//指定列读取
  9.         //执行:一个Result代表一个Rowkey的数据
  10.         Result result = table.get(get);
  11.         //打印这个rowkey每一列的结果:一个Cell对象就是一列的对象:20210301_003 column=other:phone, timestamp=1624590747738, value=120
  12.         for(Cell cell : result.rawCells()){
  13.             System.out.println(
  14.                     Bytes.toString(CellUtil.cloneRow(cell)) + "\t" +
  15.                     Bytes.toString(CellUtil.cloneFamily(cell)) + "\t" +
  16.                     Bytes.toString(CellUtil.cloneQualifier(cell)) + "\t" +
  17.                     Bytes.toString(CellUtil.cloneValue(cell)) + "\t" +
  18.                     cell.getTimestamp()
  19.             );
  20.         }
  21.         table.close();
  22.     }
复制代码
小结:

DML:Delete

实现Delete删除数据
代码:
  1. @Test
  2.     public void testDel() throws IOException {
  3.         Table table = getHbaseTable();
  4.         //构建Delete
  5.         Delete del = new Delete(Bytes.toBytes("20210301_003"));
  6.         //删除列族
  7. //        del.addFamily()
  8.         //删除列
  9.         del.addColumn(Bytes.toBytes("other"),Bytes.toBytes("phone"));
  10. //        del.addColumns(Bytes.toBytes("other"),Bytes.toBytes("phone"));//删除所有版本
  11.         //执行删除
  12.         table.delete(del);
  13.         table.close();
  14.     }
复制代码
小结:

DML:Scan

实现Scan读取数据
代码:
  1.   @Test
  2.     public void testScan () throws IOException {
  3.         Table table = getHbaseTable();
  4.         //构建Scan对象
  5.         Scan scan = new Scan();
  6.         //执行scan:ResultScanner用于存储多个Rowkey的数据,是Result的集合
  7.         ResultScanner scanner = table.getScanner(scan);
  8.         //取出每个Rowkey的数据
  9.         for (Result result : scanner) {
  10.             //先打印当前这个rowkey的内容
  11.             System.out.println(Bytes.toString(result.getRow()));
  12.             for(Cell cell : result.rawCells()){
  13.                 System.out.println(
  14.                         Bytes.toString(CellUtil.cloneRow(cell)) + "\t" +
  15.                                 Bytes.toString(CellUtil.cloneFamily(cell)) + "\t" +
  16.                                 Bytes.toString(CellUtil.cloneQualifier(cell)) + "\t" +
  17.                                 Bytes.toString(CellUtil.cloneValue(cell)) + "\t" +
  18.                                 cell.getTimestamp()
  19.                 );
  20.             }
  21.             System.out.println("------------------------------------------------------------");
  22.         }
  23.         table.close();
  24.     }
复制代码
存储设计:Table,Region,RS的关系


存储设计:Region及数据的划分规则



存储设计:Region的内部结构




Hbase读写流程:基本流程





Hbase读写流程:meta表


Hbase读写流程:写入流程


Hbase读写流程:读取流程


LSM模型:Flush


LSM模型:Compaction


Region分裂Split设计及规则


热门问题:现象及缘故原由


分布式设计:预分区


Hbase表设计:Rowkey设计

设计规则

小结:
rowkey的设计要符合以下原则:

Hbase表设计:其他设计


BulkLoad的先容


BulkLoad的实现





 运行找不到Hbase的jar包,手动申明HADOOP的环境变量即可,只在当前窗口有用
   export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/export/server/hbase-2.1.0/lib/shaded-clients/hbase-shaded-mapreduce-2.1.0.jar:/export/server/hbase-2.1.0/lib/client-facing-thirdparty/audience-annotations-0.5.0.jar:/export/server/hbase-2.1.0/lib/client-facing-thirdparty/commons-logging-1.2.jar:/export/server/hbase-2.1.0/lib/client-facing-thirdparty/findbugs-annotations-1.3.9-1.jar:/export/server/hbase-2.1.0/lib/client-facing-thirdparty/htrace-core4-4.2.0-incubating.jar:/export/server/hbase-2.1.0/lib/client-facing-thirdparty/log4j-1.2.17.jar:/export/server/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-api-1.7.25.jar
   重新运行
  检察结果

 step2:加载到Hbase表中
 
  1.   hbase org.apache.hadoop.hbase.tool.LoadIncrementalHFiles /bulkload/output TRANSFER_RECORD
复制代码
检察数据
  1. get 'TRANSFER_RECORD','ffff98c5-0ca0-490a-85f4-acd4ef873362',{FORMATTER=> 'toString'}
复制代码
协处理器的先容


协处理器的实现

路径

​​​​
需求:当往第一张表写入数据时,自动往第二张表写入一条数据,并且将rowkey中的字段换位


Hbase优化:压缩机制

实施

Hbase优化:布隆过滤:


小结

9.Hbase 总结二:

1、Hbase如何使用JavaAPI实现DML

2、Hbase的存储结构是什么

3、Hbase的读写流程是什么

4、Hbase怎么保证数据的安全性

5、Hbase的热门问题是什么,怎么解决

 6、Hbase的分区规则是什么

10.SQL On Hbase

11.Hive On Hbase 

先容:

配置: 

测试:

二级索引的设计及问题

二级索引设计

12.Phoenix

Phoenix的先容


Phoenix的安装配置


Phoenix的DDL语法:NS


Phoenix的DDL语法:Table


小结 :

Phoenix的DML语法:upsert

基于order_info订单数据实现DML插入数据

Phoenix的DML语法:delete


总结:与MySQL是一致的 
Phoenix的DQL语法:select

基于order_info订单数据实现DQL查询数据

Phoenix的使用:预分区

创建表的时间,需要根据Rowkey来设计多个分区

Phoenix的使用:加盐salt

Rowkey设计的时间为了避免连续,构建Rowkey的散列,假如rowkey设计是连续的,怎么解决?
正常表:tb1:3个分区:
       r1:-oo ~ 3
       r2: 3 ~ 6
       r3: 6 ~ +oo
       rowkey:数值开头
盐表:
        t2:3个分区
        每个分区的前缀是16进制的值
        rowkey:数值开头,但是Phoenix会自动为每个rowkey前面加上一个16进制的值
  Phoenix的使用:视图

直接关联Hbase中的表,会导致误删除,对数据的权限会有影响,容易出现问题,如何避免?
答:Phoenix中发起使用视图的方式来关联Hbase中已有的表,通过构建关联视图,可以解决大部门数据查询的数据,不影响数据,视图:可以理解为只读的表

Phoenix的使用:JDBC

工作中实际使用SQL,会基于程序中使用JDBC的方式来提交SQL语句,在Phoenix中如何实现?

二级索引:全局索引设计

功能:当为某一列创建全局索引时,Phoenix自动创建一张索引表,将创建索引这一列加上原表rowkey作为新的rowkey

二级索引:覆盖索引设计


小结

二级索引:本地索引设计

功能:将索引数据与对应的原始数据放在同一台机器,避免跨网络传输,进步写的性能


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4