文章目录
- 分布式NoSQL列存储数据库HBASE(一)
- 知识点01:
- 知识点02:
- 知识点03:数据存储需求及HBASE诞生
- 知识点04:Hbase介绍
- 知识点05:HBASE设计思想
- 知识点06:HBASE中的对象概念
- 知识点07:HBASE中的存储概念
- 知识点08:HBASE中的按列存储
- 知识点09:HBASE集群架构
- 知识点10:HBASE集群部署
- 知识点11:HBASE开发场景
- 知识点12:HBASE命令行:DDL:NS
- 知识点13:HBASE命令行:DDL:Table
- 知识点14:HBASE命令行:Put
- 知识点15:HBASE命令行:Get
- 知识点16:HBASE命令行:Delete
- 知识点17:HBASE命令行:Scan
- 知识点18:HBASE命令行:incr & count
- 附录一:Maven依赖
- 附录一:Maven依赖
分布式NoSQL列存储数据库HBASE(一)
知识点01:
-
Redis如何保证数据的安全性?
- 持久化机制:persist
- RDB:默认机制
- 思想:在一定时间周期内发生一定次数数据更新【插入、删除、修改】操作,就对整个内存中所有数据拍摄全量数据快照存储在磁盘上
- 实现
- 手动:save/bgsave
- 自动:save 时间 次数
- 优点:全量、二进制文件、更快、更小、性能更好
- 缺点:有一定概率出现数据丢失
- 应用:缓存场景,数据备份和恢复
- AOF:灵活性更好:安全和性能可以自由选择
- 思想:按照一定规则,将内存数据变化的日志追加记录在文件中
- 实现
- always:每写一条内存就追加一条到磁盘
- 安全性最高,性能最低
- everysec:每1s追加一次磁盘
- 安全和性能权衡
- no:不用
- always:每写一条内存就追加一条到磁盘
- 优点:灵活性更高,可以自由选择安全性和性能
- 缺点:加载恢复数据比较慢,文件过大并且包含很多无用操作【定期构建一次快照】
- 应用:永久性的数据存储:数据库
- 同时启用:AOF
-
Redis的事务有什么特点?
- Redis本身是单线程
- Redis的事务是命令的集合,将多条命令放入队列中,按照顺序依次串行执行
- 一般不用,不满足原子性
- multi、exec、discard
-
Redis的数据过期机制和内存淘汰机制是什么?
- 过期机制:定时过期、惰性过期、定期过期
- 内存淘汰
- 过期Key:随机、LRU、TTL
- 所有Key:随机、LRU
- 直接报错
- 缓存:所有Key-LRU
- 持久化:过期Key-LRU
-
Redis的主从复制集群、哨兵集群、分片集群各自有什么特点?
- 主从复制
- 主:Master:提供读写
- 从:Slave:提供读,与Master同步数据
- 问题:Master存在单点故障问题
- 哨兵集群
- 基于主从复制 + 引入了哨兵进程
- 哨兵进程:监听所有节点,实现故障恢复,配置同步
- 功能:允许Slave选举成为新的Master
- 过程
- step1:某个哨兵发现master故障,主观性故障
- step2:等到一定个数的哨兵认为master故障,客观性故障
- step3:从slave选举新的Master
- step4:修改其他slave配置与新的master同步数据
- 问题:资源不足
- 分片集群:分布式内存
- 思想:将多个小的Redis集群从逻辑上合并为一个大的redis集群,每个小的集群就是一个分片
- 分片的规则:槽位计算来进行分片,每个分片对应一定范围的槽位
- 读写数据时:CRC16【K】 & 16383 = 0 ~ 16383
- 每个小的redis集群有master和slave
- 只读写master
- 思想:将多个小的Redis集群从逻辑上合并为一个大的redis集群,每个小的集群就是一个分片
- 主从复制
知识点02:
- 列存储与列式存储不是一个概念
- 列式存储:相同列的数据存储在一起
- 列存储:最小操作单元是列
- MySQL:最小操作单元是行
- 插入/删除/更新
- Hbase:最小操作单元是列
- 每一行可以拥有不同的列
- MySQL:最小操作单元是行
- 1-Hbase背景介绍和设计思想
- 功能、特点、应用场景
- 基本原理和设计思想
- 2-Hbase的基本概念
- MySQL:数据库、表、行、列
- 对象概念:NameSpace、Table
- 存储概念:Rowkey、ColumnFamily、Qualifiler、Versions、Timestamp、Region
- 3-Hbase安装部署分布式集群
- 集群架构和组件:Hbase + ZK + HDFS
- 安装配置:按照笔记一步步实现即可
- 4-Hbase使用
- 命令的使用
- 目标
- Hbase是个什么东西?
- Hbase与HDFS、Redis的区别是什么?
- Hbase的整体的存储概念有哪些?
- Hbase的命令有哪些?
- put/get/delete/scan
知识点03:数据存储需求及HBASE诞生
-
目标:了解大数据存储业务需求及Hbase的诞生背景
-
路径
- step1:存储需求
- step2:Hbase诞生
-
实施
- 存储需求
- 早期需求:能实现大量数据的存储和计算
- Hadoop:HDFS + MapReduce
- 现在需求:大数据要达到一个实时应用的效果
- 推荐系统、实时监控、机器学习
- 实时应用:实时采集、实时存储、实时计算、实时应用
- Flume
- 需要有一个工具能解决实时存储的问题:读写的速度非常快
- HDFS:离线,性能比较差
- Reids:实时,容量太小
- Storm
- Redis
- 早期需求:能实现大量数据的存储和计算
- Hbase诞生
- Google:前三篇论文
- GFS
- MapReduce
- BigTable【Chubby】
- 开源实现:Hbase【Zookeeper】
- Google:前三篇论文
- 存储需求
-
小结
- 了解大数据存储业务需求及Hbase的诞生背景
知识点04:Hbase介绍
-
目标:掌握Hbase的设计、功能及应用场景
-
实施
-
官方定义:http://hbase.apache.org/
-
Hbase是一个基于Hadoop的分布式的可扩展的大数据存储的基于内存列存储NoSQL数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oBaXgO0g-1624621070109)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210524100004431.png)]
Apache HBase™ is the Hadoop database, a distributed, scalable, big data store. Use Apache HBase™ when you need random, realtime read/write access to your Big Data. This project's goal is the hosting of very large tables -- billions of rows X millions of columns -- atop clusters of commodity hardware. Apache HBase is an open-source, distributed, versioned, non-relational database modeled after Google's Bigtable: A Distributed Storage System for Structured Data by Chang et al. Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS.
-
可扩展的大数据存储:分布式
-
随机实时的访问大数据:基于内存存储
-
-
功能:提供分布式的实时随机的大数据持久性存储
-
应用
- 大数据量、高并发、高性能的结构化数据存储【读写】
- 电商:订单
- 交通:实时监控、实时车辆轨迹
- 金融:交易信息
-
-
小结
- Hbase的功能与应用场景是什么?
- 功能:实现高并发和高性能的实时随机的大数据存储
- 应用:大数据、高并发和高性能的持久化的结构化和半结构化数据存储
- Hbase的功能与应用场景是什么?
知识点05:HBASE设计思想
- 目标:掌握Hbase的设计思想
- 实施
- 为什么Hbase读写速度比较快?
- 基于内存:达到实时性的效果
- Redis:分布式内存
- 为什么Hbase可以支持大数据量?
- 基于分布式磁盘
- HDFS:分布式磁盘
- 核心思想:冷热数据分离
- 热数据:常用的,会经常读取的数据,大概率会被读取的数据
- 冷数据:不常用,不会经常被读取的数据
- 应用场景:实时
- 热数据:刚产生的数据
- 冷数据:已经产生很久的数据
- 思想:将刚产生的数据写入分布式内存 ,内存存储达到一定阈值,将内存中的数据写入分布式磁盘【HDFS】
- 实时小数据量场景下:大概率情况下,数据直接从内存中就直接被读取了
- 问题:很多场景下,Hbase的大量数据都存储在HDFS中,读取比较慢,怎么解决?
- 实时大数据量场景下:需要从HDFS中读取
- 离线数据存储场景下:大量的数据都从HDFS中读取
- 解决:通过存储设计角度来解决这些问题
- 索引 + 二进制 + 有序 + 缓存
- Hbase与HDFS、Redis有什么区别?
- Hbase:分布式NoSQL数据库、实时、分布式内存+分布式磁盘、大数据量永久性存储或者临时存储
- HDFS:分布式文件系统、离线、分布式磁盘、大数据量永久性存储
- Redis:分布式NoSQL数据库、实时、分布式内存、大数据量缓存或者小数量永久性存储
- 为什么Hbase读写速度比较快?
- 小结
- 掌握Hbase的设计思想
知识点06:HBASE中的对象概念
-
目标:掌握Hbase中的对象的概念
-
路径
- step1:MySQL中的对象
- step2:Hbase中的数据库概念
- step3:Hbase中的表概念
-
实施
-
MySQL中的对象
-
数据库:DataBase
-
表:Table
方式一:dbname.tbname; 方式二:user dbname;select * from tbname;
- 行:Row
- 列:Column
- 行:Row
-
-
-
Hbase中的数据库概念NameSpace
-
概念:命名空间,等同于数据库中的**Database的概念**
- Hbase中的任何一张表都必须属于某个NameSpace
-
使用
- Hbase中没有切换NameSpace的命令,访问所有表只能使用Namespace:TableName方式来访问表
-
理解:把Namespace当做表名的前缀来看,只要访问表名必须加ns
-
-
Hbase中的表概念Table
-
概念:表的概念,等同于数据中的表的概念
-
使用
-
Hbase中的表是分布式的:表的数据分布式存储在不同的机器上
-
Hbase是分布式存储【读写】,读写是操作表
-
所有的表在访问时,都必须加上ns的名称,除非表在default默认ns下,可以不加ns名称来进行访问
-
有一个ns叫做itcast,这个ns中有一张表叫做heima
itcast:heima
-
Hbase中自带了一个ns叫做default,这个ns中有一张表叫t1
default:t1 或者 t1
-
-
-
-
-
小结
- 什么是NameSpace?
- 就是数据库概念,Hbase中的表要存储ns下面
- 注意:ns没有切换的操作
- Hbase的表与MySQL的表有什么区别?
- Hbase的表是分布式的,写入Hbase表中的数据是分布式存储
- 所有表的访问必须加上ns的名称:ns:tbname,除非表在default的ns下面
- 什么是NameSpace?
知识点07:HBASE中的存储概念
-
目标:掌握Hbase中的存储的概念
-
实施
-
数据行设计Rowkey
-
Rowkey:行健,这个概念是整个Hbase的核心,类似于MySQL主键的概念
-
MySQL主键:可以没有,唯一标记一行、作为主键索引
-
如果有,从数据中选择一列来自己指定,可以有可以没有
sid name age gender phone add id
-
-
Hbase行健
- 所有Hbase的表不用定义,所有Hbase的表自带行健这一列【行健这一列的值由用户自己设计】
rowkey sid name age gender phone add id 可以使用sid作为rowkey sid查询走索引查询 可以使用name+id作为rowkey:rowkey索引查询是前缀匹配 name查询走索引 name+id查询走索引
-
唯一标识一行
-
作为Hbase表中的唯一索引
-
Hbase不能创建索引
-
问题:查询数据走索引查询和全表扫描,只有按照rowkey查询才走索引查询
- 原因:Hbase整个数据存储都是按照Rowkey实现数据存储的
- Rowkey的值是什么,决定了按照什么查询就是走索引的
- 原因:Hbase整个数据存储都是按照Rowkey实现数据存储的
-
-
列族设计ColumnFamily
-
cf:列族,对除了Rowkey以外的列进行分组,将列划分不同的组中
- 注意:任何一张Hbase的表,都至少要有一个列族,除了Rowkey以外的任何一列,都必须属于某个列族,Rowkey不属于任何一个列族
-
分组:将拥有相似IO属性的列放入同一个列族【要读一起读,要写一起写】
-
设计原因:划分列族,读取数据时可以加快读取的性能
- 如果没有列族,没有划分班级教室:找一个人,告诉你这个人就在这栋楼
-
如果有了列族,划分了教室:找一个人,告诉你这个人在这栋楼某个房间
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6cH4qUbB-1624621070111)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210523125756429.png)]
-
-
-
数据列设计Qualifier
-
Qualifier/Column:列,与MySQL中的列是一样
-
注意
-
Hbase除了rowkey以外的任何一列都必须属于某个列族,引用列的时候,必须加上列族的名称
-
如果有一个列族:basic
- 如果basic列族中有两列:name,age
basic:name
basic:age -
-
Hbase是列存储,Hbase中每一行拥有的列是可以不一样的
- 每个Rowkey可以拥有不同的列
-
-
-
-
多版本设计VERSIONS
-
功能:某一行的任何一列存储时,只能存储一个值**,Hbase可以允许某一行的某一列存储多个版本的值的**
- 默认每一列都只能存储1个版本
-
级别:列族级别,指定列族中的每一列最多存储几个版本的值,来记录值的变化的
-
区分:每一列的每个值都会自带一个时间戳,用于区分不同的版本
- 默认情况下查询,根据时间戳返回最新版本的值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lFGWBS5c-1624621070112)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210523130100567.png)]
-
分布式设计
-
HDFS设计
-
文件夹
-
文件:划分Block:根据每128M划分一个块,每个Block存储在不同的机器上
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iLet5Gpo-1624621070112)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210523130214227.png)]
-
-
Hbase的表如何实现分布式存储的?
-
Namespace
-
Table:Region:分区,Hbase中任何一张都可以有多个分区,数据存储在表的分区中,每个分区存储在不同的机器上
- 非常类似于HDFS中Block的概念
-
-
划分规则:范围分区
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K1hxscM8-1624621070113)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210523130311316.png)]
-
设计对比
| 分布式概念 | HDFS | Redis | Hbase |
| :--------: | :----------------: | :------: | :---------------: |
| 对象 | 目录 + 文件 | DB0 | Namespace + Table |
| 分布式 | Block | 分片集群 | Region |
| 划分规则 | 按照大小划分:128M | 槽位划分 | 按照范围划分 |
-
-
-
整体概念对比
概念 MySQL Hbase 数据库 DataBase NameSpace 数据表 Table Table【分布式的】 数据分区 - Region 数据行 数据【主键+其他列】 Rowkey+数据【其他列】 列族 - ColumnFamily 数据列 普通列与对应的值 列【timestamp】与对应的值【支持多版本】 -
小结
- 什么是行健Rowkey?
- 类似于主键的概念
- 功能:唯一标识一行,作为唯一索引
- 使用:所有Hbase的表自带这一列,值由自己设计,只有按照rowkey的查询才走索引,根据rowkey属于哪个region的范围进行分区
- 什么是列族ColumnFamily?
- 本质就是对列的分组
- 设计:提高查询的性能
- 使用:任何一张表至少有一个列族
- 什么是多版本?
- 某一行的某一列可以存储多个版本的值
- 级别:列族
- 区分:timestamp
- 什么是Region?
- Hbase中表的分区,一张表可以有多个分区,用于实现构建分布式表,不同Region存储在不同Hbase节点上
- 如果决定写入一条数据到表中,会写入哪个分区?分区规则:范围分区
- 什么是行健Rowkey?
知识点08:HBASE中的按列存储
-
目标:了解Hbase中的按列存储的设计
-
实施
-
本质:KV结构存储
-
底层:将每一列的数据变成一个KV对来进行存储
-
结构
- K:Rowkey + CF + column + TS
- V:value
-
业务数据
rowkey cf:id cf:age cf:name 20200101_001 001 18 zhangsan
-
底层存储
K V
20200101_001+cf+age+ts 18
20200101_001+cf+id+ts 001
20200101_001+cf+name+ts zhangsan -
-
功能
- Hbase的最小操作单元是列,不是行,可以实现对每一行的每一列进行读写
-
设计
- MySQL:按行存储,最小的操作单元是行
- insert:插入一行
- delete:删除一行
- ……
- Hbase:按列存储,最小操作单元是列
- 插入:为某一行插入一列
- 读取:只读某一行的某一列的
- 删除:只删除这一行的某一列
- MySQL:按行存储,最小的操作单元是行
-
举例
- MySQL中读取数据
- 查询【id,name,age,addr,phone……100列,每一列10M】:select id from table ;
- 先找到所有符合条件的行,将整行的数据所有列全部读取:1000M数据
- 再过滤id这一列:10M
- 查询【id,name,age,addr,phone……100列,每一列10M】:select id from table ;
- Hbase中读取数据
- 查询【id,name,age,addr,phone……100列,每一列10M】:select id from table ;
- 直接对每一行读取这一列的数据:10M
- MySQL中读取数据
-
总结
-
思想:通过细化了操作的颗粒度,来提高读的性能
-
如果按行存储:找一个人,告诉你这个人就在这栋楼某个房间的某一排
-
如果按列存储:找一个人,告诉你这个人在这栋楼某个房间的某一排的某一列
-
-
-
小结
- 了解Hbase中的按列存储的设计
知识点09:HBASE集群架构
-
目标:掌握Hbase集群的集群架构
-
实施
-
架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R4fwX6pR-1624621070114)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210523131109291.png)]
-
Hbase集群:分布式架构集群,主从架构
-
HMaster:主节点:管理节点
- 负责所有从节点的管理
- 负责元数据的管理
-
HRegionServer:从节点:存储节点
-
负责管理每张表的分区数据:Region
-
对外提供Region的读写请求
-
用于构建分布式内存
-
-
-
-
角色
- Hbase:通过RegionServer构建分布式内存
- HDFS:构建分布式磁盘
- Zookeeper
- 辅助选举:多个Master的Active选举
- 存储元数据:Hbase的管理元数据
-
-
小结
- 掌握Hbase集群的集群架构
知识点10:HBASE集群部署
-
目标:实现Hbase分布式集群部署
-
实施
-
解压安装
-
上传HBASE安装包到第一台机器的/export/software目录下
cd /export/software/ rz
-
解压安装
tar -zxvf hbase-2.1.0.tar.gz -C /export/server/ cd /export/server/hbase-2.1.0/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iH8Q17X1-1624621070115)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210524114532990.png)]
-
-
修改配置
-
切换到配置文件目录下
cd /export/server/hbase-2.1.0/conf/
-
修改hbase-env.sh
#28行 export JAVA_HOME=/export/server/jdk1.8.0_241 #125行 export HBASE_MANAGES_ZK=false
-
修改hbase-site.xml
cd /export/server/hbase-2.1.0/ mkdir datas vim conf/hbase-site.xml
<property > <name>hbase.tmp.dir</name> <value>/export/server/hbase-2.1.0/datas</value> </property> <property > <name>hbase.rootdir</name> <value>hdfs://node1:8020/hbase</value> </property> <property > <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property>
-
修改regionservers
vim conf/regionservers
node1 node2 node3
-
配置环境变量
vim /etc/profile
#HBASE_HOME export HBASE_HOME=/export/server/hbase-2.1.0 export PATH=:$PATH:$HBASE_HOME/bin
source /etc/profile
-
-
分发
cd /export/server/ scp -r hbase-2.1.0 node2:$PWD scp -r hbase-2.1.0 node3:$PWD
-
服务端启动与关闭
-
step1:启动HDFS
start-dfs.sh
-
step2:启动ZK
/export/server/zookeeper-3.4.6/bin/start-zk-all.sh
-
step3:启动Hbase
start-hbase.sh
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IL5HBCRs-1624621070115)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210524115912008.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D3WWAVud-1624621070116)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210524120039069.png)]
-
关闭:先关闭Hbase再关闭zk
stop-hbase.sh stop-zk-all.sh
stop-dfs.sh
-
-
测试
-
访问Hbase Web UI
node1:16010 Apache Hbase 1.x之前是60010,1.x开始更改为16010 CDH版本:一直使用60010
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DZaL9csL-1624621070116)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210524120224751.png)]
-
-
搭建Hbase HA
-
关闭Hbase所有节点
stop-hbase.sh
-
创建并编辑配置文件
vim conf/backup-masters
node2
-
启动Hbase集群
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cWJPH7TY-1624621070117)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210524120715725.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-meFnfYMM-1624621070118)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210524120833546.png)]
-
-
测试HA
-
启动两个Master,强制关闭Active Master,观察StandBy的Master是否切换为Active状态
hbase-daemon.sh stop master
- **【测试完成以后,删除配置,只保留单个Master模式】**
-
-
-
小结
- 实现Hbase分布式集群部署
知识点11:HBASE开发场景
-
目标:了解Hbase使用过程中的不同开发场景
-
实施
-
场景1:集群管理
-
应用场景:运维做运维集群管理,我们开发用的不多
-
需求:封装Hbase集群管理命令脚本,自动化执行
-
类似于hive -f xxx.sql
-
举个栗子:每天Hbase集群能定时的自动创建一张表
-
分析
-
要实现运行Hbase脚本:创建表:/export/data/hbase_create_day.sh
#!/bin/bash create 'tbname','cf1'
- 问题是:怎么能通过Linux命令行运行Hbase的命令呢?
-
要实现定时调度:Linux Crontab、Oozie、Azkaban
00 00 * * * sh /export/data/hbase_create_day.sh
-
-
-
实现:通过Hbase的客户端运行命令文件,通过调度工具进行调度实现定时运行
-
用法:hbase shell 文件路径
-
step1:将Hbase的命令封装在一个文件中:vim /export/data/hbase.txt
list exit
-
step2:运行Hbase命令文件
hbase shell /export/data/hbase.txt
-
step3:封装到脚本
#!/bin/bash hbase shell /export/data/hbase.txt
-
-
注意:所有的Hbase命令文件,最后一行命令必须为exit
-
导入测试数据
-
数据中的字段信息
-
step1:先上传文件
-
step2:运行文件
hbase shell /export/data/ORDER_INFO.txt
-
step3:查看表中数据
scan 'ORDER_INFO',{FORMATTER=>'toString'}
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RBiDNEh-1624621070118)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210524144418176.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tc93VDdC-1624621070118)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210623151750271.png)]
-
-
场景2:测试开发
-
需求:一般用于测试开发,执行DDL操作,类似于SQL之类的命令
-
实现:Hbase shell命令行
-
用法:hbase shell
-
命令
- 查看帮助:help
- 查看命令的用法:help ‘command’
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZuAZd6w8-1624621070119)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210623152015317.png)]
-
-
场景3:生产开发
-
需求:一般用于生产开发,通过MapReduce或者Spark等程序读写Hbase,类似于JDBC
- 举个栗子:读取Hbase中的数据,进行分析处理,统计UV、PV
- 分析
- step1:通过分布式计算程序Spark、Flink读取Hbase数据
- step2:对读取到的数据进行统计分析
- step3:保存结果
-
实现:分布式计算程序通过Java API读写Hbase,实现数据处理
-
用法:在MapReduce或者Spark中集成API
-
-
-
小结
- 了解Hbase使用过程中的不同开发场景
知识点12:HBASE命令行:DDL:NS
-
目标:掌握Hbase中的常用DDL的NameSpace管理命令
-
实施
-
NameSpace管理
Group name: namespace
Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables- **列举所有Namespace** - 命令:list_namespace - SQL:show databases - 语法 ``` list_namespace ``` - 示例 ``` list_namespace ``` - **列举某个NameSpace中的表** - 命令:list_namespace_tables - SQL:show tables in dbname - 语法 ```shell list_namespace_tables 'Namespace的名称' ``` - 示例 ```shell list_namespace_tables 'hbase' ``` - **创建** - 命令:create_namespace - SQL:create database dbname - 语法 ``` create_namespace 'Namespace的名称' ``` - 示例 ```shell create_namespace 'heima' create_namespace 'itcast' ``` - **删除** - 命令:drop_namespace - 只能删除空数据库,如果数据库中存在表,不允许删除 - 语法 ``` drop_namespace 'Namespace的名称' ``` - 示例 ``` drop_namespace 'itcast' drop_namespace 'heima' ```
-
-
小结
- 掌握Hbase中的常用DDL的NameSpace管理命令
知识点13:HBASE命令行:DDL:Table
-
目标:掌握Hbase中的常用DDL表的命令
-
实施
-
Table的管理命令
Group name: ddl Commands: alter, alter_async, alter_status, clone_table_schema, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, list_regions, locate_region, show_filters
-
列举
-
命令:list
- SQL:show tables
-
语法: list
-
示例
list
-
-
创建
-
命令:create
-
SQL:表名 + 列的信息【名称和类型】
create table if not exists tbname(
col1 type1 ,
col2 type2,
……
);- Hbase:必须指定表名 + 至少一个列族 - 表名 - 至少一个列族
-
-
语法
#表示在ns1的namespace中创建一张表t1,这张表有一个列族叫f1,这个列族中的所有列可以存储5个版本的值 create 'ns1:t1', {NAME => 'f1', VERSIONS => 5} #在default的namespace中创建一张表t1,这张表有三个列族,f1,f2,f3,每个列族的属性都是默认的 create 't1', 'f1', 'f2', 'f3'
-
示例
#如果需要更改列族的属性,使用这种写法
create ‘t1’,{NAME=>‘cf1’},{NAME=>‘cf2’,VERSIONS => 3}
#如果不需要更改列族属性
create ‘itcast:t2’,‘cf1’,‘cf2’,‘cf3’ = create ‘t1’,{NAME=>‘cf1’},{NAME=>‘cf2’},{NAME=>‘cf3’} -
-
查看
-
命令:desc
- SQL :desc tbname
-
语法
desc '表名'
-
示例
desc 't1'
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kdjMGCI7-1624621070119)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210623155832880.png)]
-
-
删除
-
命令:drop
- SQL:drop table tbname
-
语法
drop '表名'
-
示例
drop 't1'
-
注意:如果要对表进行删除,必须先禁用表,再删除表
-
-
禁用/启用
-
命令:disable / enable
-
功能
- Hbase为了避免修改或者删除表,影响这张表正在对外提供读写服务
- 规则:修改或者删除表时,必须先禁用表,表示这张表暂时不能对外提供服务
- 如果是删除:禁用以后删除
- 如果是修改:先禁用,然后修改,修改完成以后启用
-
语法
disable '表名' enable '表名'
-
示例
disable 't1' enable 't1'
-
-
判断存在
-
命令:exists
-
语法
exists '表名'
-
示例
exists 't1'
-
-
-
小结
- 掌握Hbase中的常用DDL表管理命令
知识点14:HBASE命令行:Put
-
目标:掌握Hbase插入更新的数据命令put的使用
-
实施
-
功能:插入 / 更新数据【某一行的某一列】
-
语法
#表名+rowkey+列族+列+值 put 'ns:tbname','rowkey','cf:col','value'
-
示例
create 'itcast:t2','cf1',{NAME=>'cf3',VERSIONS => 3}
put 'itcast:t2','20210201_001','cf1:name','laoda' put 'itcast:t2','20210201_001','cf1:age',18 put 'itcast:t2','20210201_001','cf3:phone','110' put 'itcast:t2','20210201_001','cf3:addr','shanghai' put 'itcast:t2','20210101_000','cf1:name','laoer' put 'itcast:t2','20210101_000','cf3:addr','bejing'
-
注意
-
put:如果不存在,就插入,如果存在就更新
put 'itcast:t2','20210101_000','cf1:name','laosan'
put ‘itcast:t2’,‘20210101_000’,‘cf3:addr’,‘guangzhou’
scan ‘itcast:t2’,{VERSIONS=>10} -
-
-
观察结果
- Hbase表会自动按照Rowkey构建字典有序:逐位比较
- 没有更新和删除:通过插入来代替的,做了标记不再显示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MbRuifXG-1624621070119)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210524154733066.png)]
-
小结
- put的功能及语法是什么?
- 功能:插入或者更新
- 语法:put 表名,行健,列族:列,值
- put的功能及语法是什么?
知识点15:HBASE命令行:Get
-
目标:掌握Hbase查询的数据命令get的使用
-
实施
-
功能:读取某个Rowkey的数据
- 缺点:get命令最多只能返回一个rowkey的数据,根据Rowkey进行检索数据
- 优点:Get是Hbase中查询数据最快的方式,并不是最常用的方式
- Rowkey作为唯一索引
-
语法
get 表名 rowkey [列族,列] get 'ns:tbname','rowkey' get 'ns:tbname','rowkey',[cf] get 'ns:tbname','rowkey',[cf:col]
-
示例
get 'ORDER_INFO','f8f3ca6f-2f5c-44fd-9755-1792de183845' get 'ORDER_INFO','f8f3ca6f-2f5c-44fd-9755-1792de183845','C1' get 'ORDER_INFO','f8f3ca6f-2f5c-44fd-9755-1792de183845','C1:USER_ID'
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ej74HguA-1624621070120)(Day26_分布式NoSQL列存储数据库HBASE(一).assets/image-20210524155451906.png)]
-
-
小结
-
get的功能及语法是什么?
- 功能:读取某个Rowkey数据
- 语法:get 表名,rowkey,【cf:col】
-
知识点16:HBASE命令行:Delete
-
目标:掌握Hbase的删除数据命令delete的使用
-
实施
-
功能:删除Hbase中的数据
-
语法
#删除某列的数据 delete tbname,rowkey,cf:col #删除某个rowkey数据 deleteall tbname,rowkey #清空所有数据 truncate tbname
-
示例
delete 'itcast:t2','20210101_000','cf3:addr' deleteall 'itcast:t2','20210101_000' truncate 'itcast:t2'
-
-
小结
- Hbase中的数据如何删除?
- 删除列:delete 表名,Rowkey,列族+列
- 删除行:deleteall 表名,Rowkey
- 清空表:truncate 表名
- Hbase中的数据如何删除?
知识点17:HBASE命令行:Scan
-
目标:掌握Hbase的查询数据命令scan的使用
-
实施
-
功能:根据条件匹配读取多个Rowkey的数据
-
语法
#读取整张表的所有数据 scan 'tbname'//一般不用 #根据条件查询:工作中主要使用的场景 scan 'tbname',{Filter} //用到最多
-
示例
-
插入模拟数据
put 'itcast:t2','20210201_001','cf1:name','laoda' put 'itcast:t2','20210201_001','cf1:age',18 put 'itcast:t2','20210201_001','cf3:phone','110'
put ‘itcast:t2’,‘20210201_001’,‘cf3:addr’,‘shanghai’
put ‘itcast:t2’,‘20210201_001’,‘cf1:id’,‘001’put ‘itcast:t2’,‘20210101_000’,‘cf1:name’,‘laoer’
put ‘itcast:t2’,‘20210101_000’,‘cf3:addr’,‘bejing’put ‘itcast:t2’,‘20210901_007’,‘cf1:name’,‘laosan’
put ‘itcast:t2’,‘20210901_007’,‘cf3:addr’,‘bejing’put ‘itcast:t2’,‘20200101_004’,‘cf1:name’,‘laosi’
put ‘itcast:t2’,‘20200101_004’,‘cf3:addr’,‘bejing’put ‘itcast:t2’,‘20201201_005’,‘cf1:name’,‘laowu’
put ‘itcast:t2’,‘20201201_005’,‘cf3:addr’,‘bejing’ -
-
查看Scan用法
scan 't1', {ROWPREFIXFILTER => 'row2', FILTER => " (QualifierFilter (>=, 'binary:xyz')) AND (TimestampsFilter ( 123, 456))"}
-
测试Scan的使用
scan 'itcast:t2' #rowkey前缀过滤器 scan 'itcast:t2', {ROWPREFIXFILTER => '2021'} scan 'itcast:t2', {ROWPREFIXFILTER => '202101'} #rowkey范围过滤器 #STARTROW:从某个rowkey开始,包含,闭区间 #STOPROW:到某个rowkey结束,不包含,开区间 scan 'itcast:t2',{STARTROW=>'20210101_000'} scan 'itcast:t2',{STARTROW=>'20210201_001'} scan 'itcast:t2',{STARTROW=>'20210101_000',STOPROW=>'20210201_001'} scan 'itcast:t2',{STARTROW=>'20210201_001',STOPROW=>'20210301_007'}
-
注意
-
在Hbase数据检索,尽量走索引查询:按照Rowkey条件查询
- 尽量避免走全表扫描
- Hbase所有Rowkey的查询都是前缀匹配,只有按照前缀匹配才走索引
-
rowkey:日期+用户id
- 走索引:日期、日期+用户id- 如果想查询用户id为001的数据
- 不走索引,用户id不是rowkey的前缀
- 如果想查询用户id为001的数据
-
-
-
小结
- scan的功能及语法是什么?
- 功能:查询表中的所有数据
- get区别:scan可以返回多条Rowkey的数据
- 语法
- scan + 表名
- scan + 表名 + 过滤器
- 功能:查询表中的所有数据
- scan的功能及语法是什么?
知识点18:HBASE命令行:incr & count
-
目标:了解Hbase的incr和count命令的使用
-
实施
-
incr:自动计数命令
-
功能:一般用于自动计数的,不用记住上一次的值,直接做自增
-
需求:一般用于做数据的计数
-
与Put区别
-
put:需要记住上一次的值是什么
-
incr:不需要知道上一次的值是什么,自动计数
-
-
-
语法
incr '表名','rowkey','列族:列' get_counter '表名','rowkey','列族:列'
-
示例
create 'NEWS_VISIT_CNT', 'C1' incr 'NEWS_VISIT_CNT','0000000001_00:00-01:00','C1:CNT',12 get_counter 'NEWS_VISIT_CNT','0000000001_00:00-01:00','C1:CNT' incr 'NEWS_VISIT_CNT','0000000001_00:00-01:00','C1:CNT'
-
-
count:统计命令
-
功能:统计某张表的行数【rowkey的个数】
-
语法
count '表名'
-
示例
count 'ORDER_INFO'
-
面试题:Hbase中如何统计一张表的行数最快
-
方案一:分布式计算程序,读取Hbase数据,统计rowkey的个数
#在第三台机器启动 start-yarn.sh #在第一台机器运行 hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'ORDER_INFO'
-
方案二:count命令,相对比较常用,速度中等
count ‘ORDER_INFO’
- 方案三:协处理器,最快的方式 - 类似于Hive中的UDF,自己开发一个协处理器,监听表,表中多一条数据,就加1 - 直接读取这个值就可以得到行数了
-
-
-
-
小结
- 了解Hbase的incr和count命令的使用
附录一:Maven依赖
<repositories>
<repository>
<id>aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<properties>
<hbase.version>2.1.2</hbase.version>
</properties>
<dependencies>
<!-- Hbase Client依赖 -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
- 示例
```
count 'ORDER_INFO'
```
- **==面试题:Hbase中如何统计一张表的行数最快==**
- 方案一:分布式计算程序,读取Hbase数据,统计rowkey的个数
```
#在第三台机器启动
start-yarn.sh
#在第一台机器运行
hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'ORDER_INFO'
```
- 方案二:count命令,相对比较常用,速度中等
```
count 'ORDER_INFO'
```
- 方案三:协处理器,最快的方式
- 类似于Hive中的UDF,自己开发一个协处理器,监听表,表中多一条数据,就加1
- 直接读取这个值就可以得到行数了
-
小结
- 了解Hbase的incr和count命令的使用
附录一:Maven依赖
<repositories>
<repository>
<id>aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<properties>
<hbase.version>2.1.2</hbase.version>
</properties>
<dependencies>
<!-- Hbase Client依赖 -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>