什么是HBase
# HBase常用命令
https://learnhbase.wordpress.com/2013/03/02/hbase-shell-commands/
# 关系型数据库与Nosql数据库区别
- 关系型数据库需要预定义数据集(字段名、类型),Nosql可以动态灵活
- 关系型数据库对事务支持很好,Nosql一般不支持事务或者只支持简单事务
# 关于Hbase
为一种稀疏的、分布式的、持久化的、多维有序映射。它基于行键、列键和时间戳建立索引。
# 允许的操作
- 自如的存储结构化、半结构化,也支持非结构化数据(只要不是特大)
- 列字段类型允许动态,在某行某列值为字符串,另一行可以为数值型,行作为数据单元
- 无需预先定义数据类型和列
- 不允许跨行事务(每行的数据格式都是统一的)
- 不强调数据之间的关系,允许自由读取数据,和写入数据
- 不允许跨行事务,同一个字段在不同行中的数据类型可以不一样,对类型不敏感。
- 强一致性,客户端写入数据可以马上查看到数据
- 自动分库
- 高读写吞吐量和计数吞吐量
- 字节数组形式存储
# Docker
https://liudanking.com/arch/setup-hbase-local-env-for-mac-with-docker/
# 常用字典
# 指令
指令 | 说明 |
---|---|
hbase shell | 进入hbhase shell |
list | 表列表 |
create '表名','列族' | 创建表 |
put '表名', 'rowkey','列族:字段名','值' | 添加值 |
get '表名', 'rowkey' | 获取值 |
scan '表名' | 获取所有数据 |
delete '表名','rowkey','cf:column' | 删除数据 |
describe '表名' | 表信息 |
create_namespace '名称' | 创建namespace |
drop_namespace '名称' | 删除namespace |
describe_namespace '名称' | 查看namespace |
list_namespace | 列出所有namespace |
list_namespace_tables 'namespace' | 查看namespace下的表 |
drop '表名' | 删除表 |
truncate '表名' | 清空表 |
scan '表名',{COLUMNS=>['列族','列族'],LIMIT=>1} | 查询列族数据 |
# 强制删除表
kinit -kt /etc/security/keytabs/zk.service.keytab zookeeper/dev-dmp4.fengdai.org@DEVDIP.ORG
/usr/hdp/3.0.0.0-1634/zookeeper/bin/zkCli.sh -server dev-dmp4.fengdai.org:2181
addauth digest super:password
rmr /hbase-secure/table/gejx_test //删除会操作成功
// 删除hdfs
kinit -kt /etc/security/keytabs/hdfs.headless.keytab hdfs-dev_dmp@DEVDIP.ORG
//删除指定表
hadoop fs -rm -r -f /apps/hbase/data/data/default/gejx_test
// 删除meta
scan 'hbase:meta',{STARTROW=>'表名'}
scan 'hbase:meta',{FILTER=>"PrefixFilter('DOP_VISIT_INFO')"}
deleteall 'hbase:meta','gejx_test'
或使用 https://community.hortonworks.com/questions/242343/hbase-table-is-stuck-in-disabling-state-neither-en.html
重启hbasemaster
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 修复锁表
1.获取表的状态
get 'hbase:meta','DMP:DS_TRMALL_ORDER_GOOD','table:state'
2.disable
put 'hbase:meta','DMP:DS_TRMALL_ORDER_GOOD','table:state',"\b\1"
3.确保表锁了
is_disabled 'DMP:DS_TRMALL_ORDER_GOOD'
4.备份表
snapshot 'DMP:DS_TRMALL_ORDER_GOOD', 'cata_tableSnapshot'
5.查看快照,确保有快照内容
list_snapshots
6.还原表
restore_snapshot 'cata_tableSnapshot'
7.重启master
8.enbale 表
enable 'DMP:DS_TRMALL_ORDER_GOOD'
9.重启 HBase
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# hbase-site.xml配置
配置项 | 说明 |
---|---|
hbase.hregion.memstore.flush.size | 设定MemStore向Hfile刷新值 |
# 主要内容
# Hbase的创建、修改存储机制
在默认情况下,在执行写入操作时会将数据先入到预写入式日志(HLog)和MemStore中,当MemStore存满以后,会将数据存储到硬盘中,生成一个HFile文件。一个列族可以有多个HFile,但一个HFile文件只能对应一个列族。同一行数据可能存储在多个HFile中。
在实际场景中,必然存在服务宕机的风险,为了防止数据的丢失,在数据存储时,将数据写入HFile前先写入到WAL(HLog)中,服务发生宕机的时候,可以通过WAL来恢复数据。不需要手动去执行恢复操作,Hbase内部存在机制自动恢复处理。
HBase服务器有一个WAL,这台服务器上的所有表和套的列族共享这个WAL
# Hbase读取机制
如果要达到快速访问数据,需要数据有序且尽可能保存到内存里。Hbase是通过最近最少使用算法的缓存技术(BlockCache),将频繁访问的数据,放入内存中,避免硬盘读取。,每个列族都有自己的BlockCache。
BlockCache由Block组成。Block是建立索引的最小数据单位,也是是硬盘读取的最小数据单位,其大小是根据列族设定的,默认值是64KB
在Hbase中读取一行数据,首先会检查是否在MemStore中存在,然后检查BlockCache中是否存在,最后访问HFile。
# 删除数据
基于行键进行处理
Hbase在处理删除一条数据的时候,先会对该数据进行是个删除标记,导致用户无法再get和Scan操作的时候获取到该条数据,但不会马上将数据在数据库中删除掉,只有在大合并的时候才会进行数据的完整删除
小合并:把多个小的HFile合并生成一个大的HFile,因为读取一条数据可能涉及多个文件,限制HFile的数量对于读的性能很重要。其合并产生的的是一个新的文件,在合并完全之后,将新文件设置为激活状态,再将小文件删除。
大合并:是Hbase清理被删除记录的唯一机会。一个单元的版本超过最大数量,多出的记录在大合并时也会被扔掉
# 存储数据
Hbase每个数据单元(行)都存在多个时间版本,默认是3个,在get数据的时候,默认取最新时间戳的版本。进行新建、修改、删除都会留有时间戳,时间戳是对坐标值为单位的
Hbase中表必须存在一个列族,而列组成列族。行键作为行的唯一标识符,,每一行开始都要有行键。
Hbase使用坐标的方式定位表中数据,行键,列族,列限定符
# 关键
数据模式和数据存储的检索方式
# 问答
1)与关系型数据库有什么不同?
- Hbase可以支持上百亿行和百万列的海量数据的存储
- Hbase是面向列存储,其列可以动态添加,可以单独对列进行一些操作
- 多版本,每个列的数据可以有多个版本
- 稀疏性,没有值的列不占用空间
- 扩展性,底层依赖与HDFS
- 高可靠性,不会存在数据的丢失
- 高性能,查询可以带到毫秒级
2)其存在是为了解决什么问题?
3)与其他的数据库相比有什么优势?
4)什么场景下推荐使用?
- 数据量上亿
- 不依赖所有 RDBMS 的额外特性例如,列数据类型、 第二索引、事务、高级查询语言等)
- 确信你有足够的硬件。因为 HDFS 在小于5个数据节点时,基本上体现不出它的优势
5)Hbase 的优缺点
优点:
- 列的可以动态增加,并且列为空就不存储数据,节省存储空间
- Hbase 自动切分数据,使得数据存储自动具有水平扩展
- Hbase 可以提供高并发读写操作的支持
- 与 Hadoop MapReduce 相结合有利于数据分析
- 容错性
- 非常灵活的模式设计(或者说没有固定模式的限制)
- 可以跟 Hive 集成,使用类 SQL 查询
- 自动故障转移
- 客户端接口易于使用
- 行级别原子性,即,PUT 操作一定是完全成功或者完全失败
缺点:
- 不能支持条件查询,只支持按照 row key 来查询
- 容易产生单点故障(在只使用一个 HMaster 的时候)
- 不支持事务
- JOIN 不是数据库层支持的,而需要用 MapReduce
- 只能在逐渐上索引和排序
- 没有内置的身份和权限认证
6) 性能瓶颈是什么?
7) 如何拓展?
集群模式,存储空间和处理容量都同时根据集群服务数等比提升,hbase对硬件性能依赖不强。
8)HBase 与 Hadoop/HDFS 的差异 HDFS 是分布式文件系统,适合保存大文件。官方宣称它并非普通用途文件系统,不提供文件的个别记录的快速查询。另一方面,HBase 基于 HDFS,并能够提供大表的记录快速查找和更新。这有时会可能引起概念混乱。HBase 内部将数据放到索引好的“StoreFiles”存储文件中,以便提供高速查询,而存储文件位于 HDFS中
9)Row Key为什么要按字母排序?
将Row Key相似的数据集合存放在一起,可以提升查询的效率
10)Hadoop与Hbase的区别?
Hadoop的
优化大型文件的流式访问。 遵循一读写许多意识形态。 不支持随机读/写。
HBase的
以柱状方式存储键/值对(列作为列族组合在一起)。 提供对大数据集中的少量数据的低延迟访问。 提供灵活的数据模型。
Hadoop最适合离线批量处理的东西,而当您有实时需求时使用HBase。
11) Hive与Hbase的区别? Hive是一个构建在Hadoop基础设施之上的数据仓库。
- 提供类SQL的HSQL功能
- 负责将负责的将HSQL解析为HDFS能理解的Map Reduce命令
- 查询速度比较慢,不支持实时查询
- 不支持ACID
- 不支持更新操作
HBase是一种Key/Value系统
- 能够提供实时查询
- 主要支持增加或者更新行,查看一个范围内的cell,获取指定的行,删除指定的行、列或者是列的版本
- 类SQL的功能可以通过Apache Phonenix实现
Hive适合用来对一段时间内的数据进行分析查询,Hbase非常适合用来进行大数据的实时查询。两者可以同时使用,并支持相互数据传递保存。
# 源码任务
- WAL与MemStore如何保证数据不丢失,恢复数据的机制是怎样的?
- 数据读取的机制,Block是什么?
- 什么时候触发大合并和小合并
- HFile是横向拓展,还是纵向拓展,还是同一个列族是纵向拓展,不同列族是横向
https://zhuanlan.zhihu.com/p/27800787