hbase存储的数据类型
1. hbase采用了什么样的数据结构
HBase采用了类似Google Bigtable的数据模型,即一个稀疏的、分布式的、持久化的多维映射表,每个表都由行键、列族、列限定符和时间戳组成。
在底层实现上,HBase使用了基于Hadoop的分布式文件系统HDFS来存储数据,并且使用了一搏皮搜种称为LSM-Tree(Log-Structured Merge-Tree)的数据结构来管理数据。LSM-Tree是一种支持高写入吞吐量的数据结构,它把数据分成多个层,每层采用不同的策略来管理数据,包括内存中的缓存、写入磁盘的SSTable、和合并SSTable的操作。通过这种方式,HBase能够支持高并发、高吞吐量的数据写入,同时保证数据的一致性和可靠性。
另外,HBase还采用了Bloom Filter、MemStore和Compaction等技术来提高数据查询效率和存储效率。Bloom Filter是一种快速的数据过滤技术,可以帮助HBase快速地过滤掉无效的查询请求,提高查询效率。MemStore是一种缓存机制,可以帮助基历HBase加速数据写入,提高数据握中写入效率。Compaction则是一种数据压缩和合并技术,可以帮助HBase节省存储空间,提高存储效率。
综上所述,HBase采用了LSM-Tree、Bloom Filter、MemStore和Compaction等多种数据结构和技术,以实现高并发、高吞吐量的分布式存储和查询功能。
2. HBase是什么呢,都有哪些特点呢
Hbase是一种Nosql数据库,这意味着它不像传统的RDBMS数据库那样支持SQL作为查询语言。Hbase是一种分布式存储的数据库,技术上来讲,它更像是分布式存储而不是分布式数据库,它缺少很多RDBMS系统的特性,比如列类型,辅助索引,触发器,和高级查询语言等待
那Hbase有什么特性呢?如下:
强读写一致,但是不是“最终一致性”的数据存储,这使得它非常适合高速的计算聚合
自动分片,通过Region分散在集群中,当行数增长的时候,Region也会自动的切分和再分配
自动的故障转移
Hadoop/HDFS集成,和HDFS开箱即用,不用太麻烦的衔接
丰富的“简洁,高效”API,Thrift/REST API,Java API
块缓存,布隆过滤器,可以高效的列查询优化
操作管理,Hbase提供了内置的web界面来操作,还可以监控JMX指标
首先数据库量要足够多,如果有十亿及百亿行数据,那么Hbase是一个很好的选项,如果只有几百万行甚至不到的数据量,RDBMS是一个很好的选择。因为数据量小的话,真正能工作的机器量少,剩余的机器都处于空闲的状态
其次,如果你不需要辅助索引,静态类型的列,事务等特性,一个已经用RDBMS的系统想要切换到Hbase,则需要重新设计系统。
最后,保证硬件资源足够,每个HDFS集群在少于5个节点的时候,都不能表现的很好。因为HDFS默认的复制数量是3,再加上一个NameNode。
存储业务数据:车辆GPS信息,司机点位信息,用户操作信息,设备访问信息。。。
存储日志数据:架构监控数据(登录日志,中间件访问日志,推送日志,短信邮件发送记录。。。),业务操作日志信息
存储业务附件:UDFS系统存储图像,视频,文档等附件信息
什么时候用Hbase?
Hbase不适合解决所有的问题:
Hbase在单机环境也能运行,但是请在开发环境的时候使用。
内部应用
不过在公司使用的时候,一般不使用原生的Hbase API,使用原生的API会导致访问不可监控,影响系统稳定性,以致于版本升级的不可控。
HFile
HFile是Hbase在HDFS中存储数据的格式,它包含多层的索引,这样在Hbase检索数据的时候就不用完全的加载整个文件。索引的大小(keys的大小,数据量的大小)影响block的大小,在大数据集的情况下,block的大小设置为每个RegionServer 1GB也是常见的。
探讨数据库的数据存储方式,其实就是探讨数据如何在磁盘上进行有效的组织。因为我们通常以如何高效读取和消费数据为目的,而不是数据存储本身。
Hfile生成方式
起初,HFile中并没有任何Block,数据还存在于MemStore中。
Flush发生时,创建HFile Writer,第一个空的Data Block出现,初始化后的Data Block中为Header部分预留了空间,Header部分用来存放一个Data Block的元数据信息。
而后,位于MemStore中的KeyValues被一个个append到位于内存中的第一个Data Block中:
注:如果配置了Data Block Encoding,则会在Append KeyValue的时候进行同步编码,编码后的数据不再是单纯的KeyValue模式。Data Block Encoding是HBase为了降低KeyValue结构性膨胀而提供的内部编码机制。
3. hbase的核心数据结构是什么
hbase的核心数据结构为LSM树。
LSM树分为内存部分和磁盘部分。
内存部分是一个维护有序数据集合的数据结构。一般来讲,内存数据结构可以选择平衡二叉树、红黑树、跳跃表(SkipList)等维护有序集的数据结构,由于考虑并发性能,HBase选择了表现更优秀的跳跃表。
磁盘部渣扒分是由一个个独立的文件组成败梁困,每一个文件又是由一个个数据块组成。对于数据存储在磁盘上的数据库系统来说,磁盘寻道以及数据读取都是非常耗时的操作(简称IO耗时)。为了避免不必要的IO耗时,可以在磁盘中存储一些额外的二进制数据,这些数据用来判断对于给定的key是否有可能存储在这个数据块中,这个数据结构称为布隆过滤器(察念BloomFilter)。
LSM树介绍:
LSM树是一种磁盘数据的索引结构。LSM树的索引对写入请求更友好。因为无论是何种写入请求,LSM树都会将写入操作处理为一次顺序写,而HDFS擅长的正是顺序写(且HDFS不支持随机写)。
一个LSM树的索引内存部分是一个ConcurrentSkipListMap,Key是rowkey、column family、qualifier、type以及timestamp, Value是字节数组。随着数据不断写入MemStore,一旦内存超过阈值会将数据flush到磁盘,生产HFile;多个小HFile文件会compact成一个大HFile。
4. HBase int类型字段存储乱码
用MR往HBase里写Int类型遇到了乱码问题,总结一下。
直接往HBase表里写int,通过shell查询
可以看到是一堆字节数组,hbase存储所有数据都是用过Byte数组的形式,但是裤亮里面除了String以外,其他类型通早缓过shell查询,无法正常显示的,但是String类型的数据,shell则可以正常显示,这里我插入的是int自然无法正常显示。
这是在idea上写的查询hbase的方法,分别用Bytes.toInt和Byts.toString尝试读取hbase上的数据。
这是一部分结果,可以看到通过Bytes.toInt读取的int类型Byte数组,是可以正确显示,而通过Bytes.toString方式尝陆纯模试读取则乱码。
看到这里其实大概已经了解了,但是我遇到了一点小问题,所以继续测试。
新建一张表,通过shell,往里面插入两个int类型的数据,但是通过shell查询,查询结果并非Byte数组,难道HBase将他们转换成了String?
通过idea上方法测试,可以看到Bytes.toString方法将结果转化正确,而Bytes.toInt则错误。所以可以认为通过shell可以读取到的数据类型,只有String。通过shell插入的int类型只不过是与int类型值相同的String类型。
5. hbase列式数据库四维坐标是什么
实际上,HBase是一个列族数据库,而不是真正的列式数据库。
因为允许存放非结构化数据,所以HBase的数据类型只有简单的字符串类型,如果需要细分类型,需要用户自己处理。
HBase的四维模型中每个元素:
(1)行键(Row Key):最大长度为64KB的任意字符串。与关系型数据库一样,行键是行的唯一标志。
(2)列族(Column Family):这是理解列族数据库的关键概念。将数据行中的字段按照某种要求分成数个小组,每个小组包含若干个字段,每个小组就是列族。列族需要预先定义,并且不能随意修改。每行具有相同的列族,但不要求每个列族都存储数据。
(3)列限定符(Qualifier):每个列族包含多个字段,限定符用于区分不同的字段。列限定符不需要预先定义,因此每行可以有不同数量的列限定符,也可以认为列限定符就是字段。
(4)单元(Cell):存储数据的最小单元。单元中存储的是未经解释的字符串,需要通过行键、列族、列限定符、时间戳进行定位。
(5)版本(Version):这是HBase与其他数据库的不同之处。版本是一个64位整型数,可以由系统自动生成,也可以由用户自定义。引入版本后,存储在单元中的值不再只有一个,可以通过不同的时间戳(Timestamp)在同一单元中存入多个版本。
6. HBase数据结构是什么
RowKey
与nosql数据库们一样,RowKey是用来检索记录的主键。访问HBASE table中的行,只有三种方式:
通过单个RowKey访问(get)
通过RowKey的range(正则)(like)
全表扫描(scan)
RowKey行键 (RowKey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10-100bytes),在HBASE内部,RowKey保存为字节数组。存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中。
RegionServer group:一个命名空间包含了默认的RegionServer Group。
Permission:权限,命名空间能够让我们来定义访问控制列表ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。
Quota:限额,可以强制一个命名空间可包含的region的数量。
Column Family
列族:HBASE表中的每个列,都归属于某个列族。列族是表的schema的一部 分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如 courses:history,courses:math都属于courses 这个列族。
Cell
由{rowkey, column Family:columu, version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。
关键字:无类型、字节码
Time Stamp
HBASE 中通过rowkey和columns确定的为一个存贮单元称为cell。每个 cell都保存 着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由HBASE(在数据写入时自动 )赋值,此时时间戳是精确到毫秒 的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版 本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBASE提供 了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段 时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
命名空间
命名空间的结构:
7. hbase与关系型数据库的存储方式有哪些不同
HBase与传统关系数据库的区别主要体现在以下几个方面:1.数据类型。关系数据库采用关系模型,具有丰富的数据类型和储存方式。HBase则采用了更加简单的数据模型,它把数据储存为未经解释的字符串,用户可以把不同格式的结构化数据和非结构化数据都序列化成字符串保存到HBase中,用户需要自己编写程序把字符串解析成不同的数据类型。 2.数据操作。关系数据库中包含了丰富的操作,如插入、删除、更新、查询等,其中会涉及复杂的多表连接,通常是借助多个表之间的主外键关联来实现的。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表与表之。
列存储不同于传统的关系型数据库,其数据在表中是按行存储的,列方式所带来的重要好处之一就是,由于查询中的选择规则是通过列来定义的,因此整个数据库是自动索引化的。
按列存储每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量,一个字段的数据聚集存储,那就更容易为这种聚集存储设计更好的压缩/解压算法。
传统的(Oracle)行存储和(Hbase)列存储的区别。
主要体现在以下几个方面:1.数据类型。关系数据库采用关系模型,具有丰富的数据类型和储存方式。HBase则采用了更加简单的数据模型,它把数据储存为未经解释的字符串,用户可以把不同格式的结构化数据和非结构化数据都序列化成字符串保存到HBase中,用户需要自己编写程序把字符串解析成不同的数据类型。 2.数据操作。关系数据库中包含了丰富的操作,如插入、删除、更新、查询等,其中会涉及复杂的多表连接,通常是借助多个表之间的主外键关联来实现的。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表与表之间的关系,通常只采用单表的主键查询。
8. hbase数据库存储的特点有哪些
特点:(1)大:一个表可以有数十亿行,上百万列;
(2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
(3)面向列:面向列(族)的存储和权限控制,列(族)独立检索;?
(4)稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;
(5)数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;
(6)数据类型单一:Hbase中的数据都是字符串,没有类型。
9. Hbase知识点总结
hbase概念:
非结构化的分布式的面向列存储非关系型的开源的数据库,根据谷歌的三大论文之一的bigtable
高宽厚表
作用:
为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
能干什么:
存储大量结果集数据,低延迟的随机查询。
sql:
结构化查询语言
nosql:
非关系型数据库,列存储和文档存储(查询低延迟),hbase是nosql的一个种类,其特点是列式存储。
灶如敏非关系型数据库--列存储(hbase)
非关系型数据库--文档存储(MongoDB)
非关系型数据库隐枝--内存式存储(redis)
非关系型数据库--图形模型(graph)
hive和hbase区别?
Hive的定位是数据仓库,虽然也有增删改查,但其删改查对应的是整张表而不是单行数据,查询的延迟较高。其本质是更加方便的使用mr的威力来进行离线分析的一个数据分析工具。
HBase的定位是hadoop的数据库,电脑培训发现是一个典型的Nosql,所以HBase是用来在大量数据中进行低延迟的随机查询的。
hbase运行方式:
standalonedistrubited
单节点和伪分布式橡枣?
单节点:单独的进程运行在同一台机器上
hbase应用场景:
存储海量数据低延迟查询数据
hbase表由多行组成
hbase行一行在hbase中由行健和一个或多个列的值组成,按行健字母顺序排序的存储。
10. HBASE 1.0
前身:BigTable
网页搜索:
google分布式存储系统BigTable依赖GFS
Hbase(bigtable的开源实现): 高可靠、高性能、面向列、可伸缩
存储结构化和半结构化的数据
优点:
水平可扩展性特别好:
依赖:
文件存储系统:HDFS
海量数据处理:MapRece
协同管理服务:Zookeeper
满足了:大数据量的实时计算
数据类型:
RDBMS:关系数据模型、多种数据类型
Hbase:
数据操作:
存储模式:
索引:
数据维护:
可伸缩性:
纵向扩展:
水平扩展:
Hbase的访问接口:
拆局 JAVA API
shell
thrift Gateway
restful Gateway
SQL接口:pig编写类sql hive用hivesql访问Hbase
Hbase的数据类型:
列限定符
每个值都是未解释的bytes
一个行可以有一个行键和多列
表由列族组成
Hbase数据模型:
列族支持动态扩展、保留旧版本(HDFS只能追加数据)
基础元素:
行键 : rowkey
列族
列限定败燃符
单元格 (时间戳概念、对应数据版本)
坐标概念:
四维定位:行键、列族、列限定符、时间戳
稀疏表旅枯让
HBASE:面向列的存储:高数据压缩率、分析便捷
RDBMS :面向行存储,事务性操作(记录完整)、不便于分析(需要全表扫描)
4.3 HBASE 的实现原理
4.3.1 库函数 、master服务器、region服务器
Master服务器:
分区信息进行维护和管理
维护region服务器列表
确认当前工作的region服务器
负责对region进行分配和负载平衡
对表的增删改查
region服务器:
客户端不依赖于Master获取位置信息
用户数据的存储和管理
Region服务器--10-1000个region -----Store是一个列族----每个列族就是一个Hfile----所有region公用1个Hlog
写数据流程:Region服务器---写缓存Memstore---写日志(Hlog)
读数据流程:Region服务器-读缓存Memstore(最新数据)----StoreFile
缓存刷新:周期性将缓存内容刷写到Storefile 清空缓存---Hlog写入标记
每次刷写会生成新的StoreFile 每个Store包含多个StoreFile
每个Region服务器都有一个自己的Hlog,将启动检查确认缓存刷新是否有新的内容需要刷写,发现则刷写新的storefile,完成后删除Hlog,开始对外提供服务
Storefile的合并,storefile 的数量达到阈值后,会进行合并。当Storefile超过大小阈值则会触发Region的分裂
4.4 Hlog的工作原理
Zookeeper负责监听region服务器,由master处理故障,通过故障服务器的Hlog恢复,按region切分Hlog,将region和对应的Hlog分配到新的region服务器上
一个HBASE表会被划分成多个Region(1G-2G 取决于服务器性能)
同一个region不会被拆分到不同服务器上
Region的寻找:
Meta表:regionID 服务器ID 存储元数据
Root表:只有一个region
三级寻址:
zookeeper文件---root表-多个meta表--多个用户数据表
客户端会有Hbase三层寻址的缓存,调用访问Hbase的接口,缓存失效后,再次寻址
zookeeper决定master服务器,确保只有一个master
4.5 Hbase的应用方案
性能优化:
1)时间靠近存放----将时间戳引入行键,使用Long.max-时间戳进行排序
2)提升读写性能,创建表时设置HcloumnDescriptor.setMemory=true,会将表放入内存的缓存中
3)节省存储·空间----设置最大版本数、保存最新版的数据,将最大版本参数设置为1
4)timetolive参数,会将过期数据自动清空
检测Hbase性能:
Maste-status(web浏览器查询)
ganglia
OpenTSDB
Armbari
sql 查询HBASE
1)hive整合hbase
2)Phoenix
Hbase 二级索引 (辅助索引)
默认只支持对rowkey进行索引
Hbase行访问:
1)单行键访问
2)确定起点和终点访问区间数据
3)全表扫描
二级索引样例:
Hindex Hbase+redis Solr+ Hbase
二级索引的机制:
Hbase Coprocessor
endpoint ---存储过程
observer----触发器
通过Observer监测数据插入动作,同步写入索引表,完成对表和列的索引
Hbase 主表 索引表
4.6 HBASE的shell命令
三种部署模式:单机 伪分布式 分布式
HDFS
创建表
create table, F1, F2, F3
list table
每次只能为1行的1列添加数据
put table R1,R1:C1 ,“1,2,3”
scan table R1,{column='R1:C1'}
get table
删除表:
disable table +drop table
4.7 JAVA API +HBASE