总结
hbase是apache hadoop的数据库
分布式的
非关系型数据库( nosql )
面向列的存储
hbase 和 hdfs 和 mapreduce, 这3个组件,都是hadoop生态系统的重要组件,各自发挥自己的作用。
HBase是一个数据库管理系统(DBMS),但它与传统的关系型数据库管理系统(RDBMS)有很大的不同。
HBase是一个开源的、非关系型、分布式、可扩展的、基于列的数据库管理系统,它运行在Hadoop的HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库服务。
行锁和列锁,保证数据的一致性,在同一时间,保证只有一个hbase的客户端能访问和修改数据。
命名空间namespace(类似mysql的数据库,hbase中没有数据库这个概念,取而代之的是命令空间这个概念namespace)
hbase默认有一个命名空间,叫做default。(当你创建表的时候,如果你不指定在哪一个命名空间,那么默认就是default这个命名空间)
表(HBase中的数据以表的形式组织,每个表由多行数据组成。)
行键 row key, 唯一键,唯一的
列族(每一行数据,都至少包含1个列族,或者多个列族,每个列族中会有1个或者多个列修饰符)
列修饰符
在Hbase中一个`列族(Column Family)`和一个`列修饰符(Column Qualifier)`组合起来才叫一个`列(Column)`,使用冒号(`:`)连接,`列族:列修饰符`,如下图所示:
在HBase中,读数据时默认是读取时间戳【最新】的版本(当然你也可以是指定某个特定的版本)
HBase是一个分布式的、面向列的NoSQL数据库,它支持数据的版本控制。
在HBase中,每个单元格(Cell)可以包含多个版本的数据,并且每个版本都关联一个时间戳。
这个时间戳用于标识数据的不同版本,并允许用户根据时间戳来查询特定版本的数据。
比如姓名这个列,可能之前叫做张三,后来改名了,叫做张四,后来又改名了, 叫做张五。
版本控制:每一行数据,可能会有多个版本,根据时间戳的先后顺序。
我们在读数据的时候,可以指定我要读某个row key的某个时间戳的版本。
一个`行键`、`列族`、`列修饰符`、`数据`和`时间戳`组合起来叫做一个`单元格(Cell)`。
一个`行键`、`一到多列(包括数据)`组合起来叫做一`行(Row)`。
HBase使用行锁和列锁来保证数据的一致性,在读写数据时,会对相应的行或列进行加锁,确保同一时间只有一个客户端可以访问或修改数据。
在往hbase中写入数据的时候,如果某个row key的某个列族:列修饰符的值,我写错了,
那我不会把该数据删除,而是针对该row key的列族:列修饰符重新写入一条正确的数据,用ts时间戳来区分版本。
HBase本身并不直接支持像SQL这样的传统查询语言。
相反,HBase是一种NoSQL数据库,它采用了一种不同的数据模型和查询机制。
具体来说,HBase主要支持通过其提供的API(如get、put、scan等)来进行数据的增删改查操作。
命名空间
在HBase中,创建表时并不需要指定库名(database name)。
HBase的数据模型与传统的关系型数据库有所不同,它采用的是列式存储方式,并不直接使用数据库(database)的概念来组织数据。
相反,HBase使用命名空间(Namespace)和表(Table)来组织和管理数据。
命名空间(Namespace)
- 命名空间是HBase中的一个重要概念,类似于数据库中的Schema,用于组织和管理表。
- 通过为表指定命名空间,可以更好地组织和管理表,并提供更好的可读性和可维护性。
- 命名空间是全局唯一的,命名空间不能重复,但是不同的命名空间下可以存在同名的表。
- 创建命名空间通常使用HBase的Admin API进行,而不是在创建表时直接指定。
创建表
- 在HBase中创建表table时,需要指定表名和至少一个列族(ColumnFamily)。
- 列族是列的集合,HBase表中的每个列都属于某个列族。
- 创建表的命令通常是在HBase Shell中执行的,例如:
create '表名', '列族名'。
总结
-
因此,HBase在创建表的时候并不需要指定库名,而是使用命名空间来组织和管理不同的表。
-
如果需要更好地组织和管理表,可以在创建表之前先创建相应的命名空间,并在创建表时指定该命名空间。
-
但这一步是可选的,如果不需要使用命名空间,也可以直接创建表而不指定任何命名空间(HBase中默认有一个名为
default的命名空间)。 -
hbase中有一个默认的命名空间,叫做default。如果你在创建表的时候没有指定命名空间,则会默认创建在default下面。
1/什么是HBase
官方给的解释如下:
Apache HBase is the Hadoop database, a distributed, scalable, big data store.
HBase is a type of "NoSQL" database.
Apache HBase 是 Hadoop 数据库,一个分布式,基于列存储的,可伸缩的大数据存储。
HBase是依赖Hadoop的。为什么HBase能存储海量的数据?
因为HBase是在HDFS的基础之上构建的,HDFS是分布式文件系统。
这么说来,hbase和hdfs是不同的东西。
<1>HBase是一个分布式的、基于列存储(而不是基于行存储)的开源数据库,一个结构化数据的分布式存储系统”
<2>HBase在Hadoop之上提供了类似于Bigtable的能力。
<3>HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库
<4>HBase是Google Bigtable的开源实现,
Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统
Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用HadoopMapReduce来处理HBase中的海量数据;
Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应
<5>Hadoop HDFS 为 HBase提供了高可靠性的底层存储支持,
Hadoop MapReduce 为 HBase提供了高性能的计算能力,
Zookeeper 为 HBase提供了稳定服务和failover机制。
<6>Hbase全称为HadoopDatabase,即Hbase是Hadoop的数据库,是一个分布式的存储系统。
Hbase利用Hadoop的HDFS作为其文件存储系统,利用Hadoop的MapReduce来处理Hbase中的海量数据。
利用zookeeper作为其协调工具。
2/base中的数据是如何存储的
HBase中的数据存储方式具有高度的分布式、面向列和可扩展性等特点。
以下是关于HBase数据存储方式的详细解释:
1. 基本存储结构
- 表(Table) :HBase中的数据以表的形式组织,每个表由多行数据组成。
- 行(Row) :表中的每一行数据都有一个唯一的行键(Row Key)来标识,通过行键可以快速定位和访问整行数据。
- 列族(Column Family) :每一行数据可以包含多个列族,每个列族包含一组相关的列。列族是HBase中数据组织的基本单位,所有的列族共享相同的读/写属性和访问控制。
- 列标识符(Column Qualifier) :每个列族中可以包含多个列,列通过列标识符来区分。
2. 存储机制
- 分布式存储:HBase将数据存储在Hadoop的HDFS(Hadoop Distributed File System)中,采用分布式的方式将数据分布在多个节点上,从而实现了数据的高可用性和扩展性。
- HFile:HBase表的数据实际上是以HFile的形式存储在HDFS上的,每个HFile对应表中的一个区域(Region)。HFile是HBase中实际存储数据的文件格式,它包含了一系列的键值对(Key-Value Pairs)。
- Region:当表的大小超过预设阈值时,表会被水平分割成多个Regions,每个Region负责管理表的一段连续的行键范围。Regions是HBase负载均衡和服务本地化的基础单位,每个Region由一个RegionServer管理,RegionServer负责处理对这个Region的读/写请求。
3. 数据写入与读取
- 写入过程:写入HBase的数据首先会进入内存中的MemStore,然后根据配置的策略定期刷新到磁盘上的HFile中。在这个过程中,为了保证数据的持久性和可靠性,HBase还会将写入操作记录到预写式日志(Write-Ahead Log, WAL)中,这样即使在系统故障的情况下,也能够通过重播WAL来恢复数据。
- 读取过程:当读取数据时,HBase首先会查找内存中是否存在所需数据,如果不存在则会从HDFS中读取HFile中的数据。
4. 数据版本控制
- 时间戳(Timestamp) :HBase支持多版本的数据存储,每条数据可以有多个时间戳,可以查询指定时间范围内的数据版本。
5. 存储优化
- Compaction:为了提高读取效率和减少存储空间,HBase会定期进行Compaction操作,合并和压缩HFiles。
- 数据复制:HBase通过HDFS的数据复制机制来实现数据的高可用性,默认情况下,HDFS会将每个数据块(Block)复制三份存储在不同的节点上,这样即使某个节点发生故障,也能保证数据的完整性和可用性。
6. 数据一致性与可靠性
- 行锁与列锁:HBase使用行锁和列锁来保证数据的一致性,在读写数据时,会对相应的行或列进行加锁,确保同一时间只有一个客户端可以访问或修改数据。
- 预写式日志(WAL) :通过WAL机制,HBase保证了数据的持久性和可靠性,即使在系统故障的情况下也能恢复数据。
综上所述,HBase通过其独特的分布式存储方式、面向列的数据组织方式以及高效的读写机制和存储优化策略,为海量数据的存储和查询提供了强有力的支持。
3/hbase和hdfs的区别与联系
HDFS是文件系统,而HBase是数据库,其实也没啥可比性。
你可以把HBase当做是MySQL,把HDFS当做是硬盘。
HBase只是一个NoSQL数据库,把数据存在HDFS上。
HBase和HDFS在Hadoop生态系统中都扮演着重要的角色。
它们各自具有独特的特点和功能,同时也有紧密的联系。
以下是对它们之间区别和联系的详细阐述:
<1>区别
-
功能和定位:
- HBase:是一个分布式的、可扩展的、非关系型(NoSQL)数据库,被设计用来处理大规模的结构化数据。它提供了高性能、高可用性和高可扩展性的数据存储解决方案,特别适用于需要快速随机读写的场景,如日志分析、在线交易等。
- HDFS:是Hadoop分布式文件系统,被设计用来存储和管理大规模数据集。HDFS通过将文件分割成多个块,并在多个机器上进行分布式存储,以实现数据的高可靠性和高吞吐量。它主要用于大数据存储和批量处理的场景。
-
数据存储方式:
- HBase:数据按照行键(Row Key)进行排序,并以列族(Column Family)和列(Column)的形式存储。每个列族可以包含多个列,且每个列的值可以是多个版本。HBase的数据模型类似于关系数据库的表,但每个表可以有多个列族,且列族的结构可以动态修改。
- HDFS:数据存储的基本单位是数据块(Block),通常为64MB或128MB。HDFS将文件分割成多个块,并在多个数据节点(DataNode)上进行分布式存储。同时,每个数据块会有多个副本(Replica),以提高数据的可用性和容错性。
-
读写性能:
- HBase:支持快速随机读写,可以根据行键快速定位到具体的记录。因此,它适用于需要实时响应的应用。
- HDFS:适合批量读写和顺序读写。HDFS的写入性能比较高,但随机读取性能较低。因此,它更适用于大规模数据的存储和批量处理任务。
<2>联系
-
- 底层存储介质:HBase使用HDFS作为底层的存储介质。HBase通过HDFS的分布式存储和复制机制,实现了数据的高可靠性和高容错性。HBase的数据以行键进行排序,并通过HDFS将数据分布式存储在多台机器上。
-
- Hadoop生态系统中的组件:HBase和HDFS都是Apache Hadoop生态系统的重要组成部分。它们共享了很多相同的工具和框架,如Hadoop的分布式计算框架MapReduce。这种紧密的集成使得数据可以相对容易地在HBase和HDFS之间进行迁移和处理。
-
- 协同工作:在大数据处理中,HBase和HDFS的集成和协同非常重要。HBase提供了高性能的数据读写能力,而HDFS则提供了可靠的数据存储支持。两者共同协作,可以大幅提高大数据处理的效率和性能。
综上所述,HBase和HDFS在功能和定位、数据存储方式、读写性能等方面存在显著差异,但它们又是Hadoop生态系统中不可或缺的两个组件。通过紧密的集成和协同工作,它们共同为大数据处理提供了强大的支持。
3/hbase和其它数据库的区别
已经有了很多别的数据库了,为啥还要用hbase呢?
面对这个问题,我们就需要去分析别的数据库的特点了
<1>mysql
MySQL数据库算用得最多了的吧?但众所周知,MySQL是单机的(ks的kdb是mysql的集群)。
MySQL能存储多少数据,取决于那台服务器的硬盘大小。
以现在互联网的数据量,很多时候MySQL是没法存储那么多数据的。
比如我这边有个系统,一天就能产生1TB的数据,这数据是不可能存MySQL的。
如此大的量数据,我们现在的做法是先写到Kafka,然后落到Hive中。
<2>kafka
Kafka我们主要用来处理消息的(解耦异步削峰)。
数据到Kafka,Kafka会将数据持久化到硬盘中,并且Kafka是分布式的,方便扩展。
理论上Kafka可以存储很大的数据,但是Kafka的数据我们不会取出来。
持久化了的数据,最常见的用法就是重新设置offset,做「回溯」操作
<3>redis
Redis是缓存数据库,所有的读写都在内存中,速度贼快。
AOF/RDB存储的数据都会加载到内存中,Redis不适合存大量的数据,因为太贵了。
<4>Elasticsearch
Elasticsearch是一个分布式的搜索引擎,主要用于检索。
理论上Elasticsearch也是可以存储海量的数据(毕竟分布式),我们也可以将数据用『索引』来取出来,似乎已经是非常完美的中间件了。
但是如果我们的数据没有经常「检索」的需求,其实不必放到Elasticsearch,数据写入Elasticsearch需要分词,无疑会浪费资源。
<5>HDFS?
显然HDFS是可以存储海量的数据的,它就是为海量数据而生的。
它也有明显的缺点:不支持随机修改,查询效率低,对小文件支持不友好。
而hbase可以支持随机写,也支持实时查询。
4/为啥要用hbase
扯了这么多,那我们为啥要用HBase呢?
HBase在HDFS之上提供了高并发的随机写和支持实时查询,这是HDFS不具备的。
我一直都说在学习某一项技术之前首先要了解它能干什么。
我们可以发现HBase可以以低成本来存储海量的数据并且支持高并发随机写和实时查询。
但HBase还有一个特点就是:存储数据的”结构“可以地非常灵活。、
5/入门HBase
听过HBase的同学可能都听过「列式存储」这个词。
我最开始的时候觉得HBase很难理解,就因为它这个「列式存储」我一直理解不了它为什么是「列式」的。
在网上也有很多的博客去讲解什么是「列式」存储,它们会举我们现有的数据库,比如MySQL。
存储的结构我们很容易看懂,就是一行一行数据嘛,如下图所示:

把上图转换成所谓的列式存储是什么样的呢,如下图所示:

可以很简单的发现,无非就是把每列抽出来,然后关联上Id。这个叫列式存储吗?我在这打个问号。
转换后的数据从我的角度来看,数据还是一行一行的。
这样做有什么好处吗?很明显以前我们一行记录多个属性(列),有部分的列是空缺的,但是我们还是需要空间去存储。
现在把这些列全部拆开,有什么我们就存什么,没有的就不存储。这样空间就能被我们充分利用。
这种形式的数据更像什么?明显是Key-Value嘛。
那我们该怎么理解HBase所谓的列式存储和Key-Value结构呢?
6/HBase的数据模型
HBase里边也有表、行和列的概念。
表没什么好说的,就是一张表
一行数据由一个行键和一个或多个相关的列以及它的值所组成.
在HBase里边,定位一行数据会有一个唯一的值,这个叫做行键(RowKey)。
而在HBase的列不是我们在关系型数据库所想象中的列。
HBase的列(Column)都得归属到列族(Column Family)中。
在HBase中用列修饰符(Column Qualifier)来标识每个列。
在HBase里边,先有列族,后有列。
什么是列族?可以简单理解为:列的属性类别
什么是列修饰符?先有列族后有列,在列族下用列修饰符来标识一列。
还很抽象是不是?来画个图:


这张表我们有两个列族,分别是UserInfo和OrderInfo。
在UserInfo下有两个列,分别是UserInfo:name和UserInfo:age,
在OrderInfo下有两个列,分别是OrderInfo:orderId和OrderInfo:money。
UserInfo:name的值为:三歪。UserInfo:age的值为24。
OrderInfo:orderId的值为23333。OrderInfo:money的值为30。
这些数据的主键(RowKey)为1
上面的那个图看起来可能不太好懂,我们再画一个我们比较熟悉的:

7/HBase架构

<1>Client客户端,它提供了访问HBase的接口,并且维护了对应的cache来加速HBase的访问。
<2>Zookeeper存储HBase的元数据(meta表),无论是读还是写数据,都是去Zookeeper里边拿到meta元数据告诉给客户端去哪台机器读写数据
<3>HRegionServer它是处理客户端的读写请求,负责与HDFS底层交互,是真正干活的节点。
<4>总结大致的流程就是:client请求到Zookeeper,然后Zookeeper返回HRegionServer地址给client,client得到Zookeeper返回的地址去请求HRegionServer,HRegionServer读写数据后返回给client。

8/如何查询hbase中的数据
虽然HBase原生不支持SQL查询,但用户仍然可以通过多种方式来实现类似SQL的查询功能:
- 使用HBase Shell:HBase提供了一个命令行工具HBase Shell,允许用户通过shell命令与HBase进行交互,执行数据的增删改查等操作。虽然这不是传统意义上的SQL查询,但它是HBase提供的一种查询方式。
- 集成Hive或Spark SQL:HBase可以与Apache Hive或Apache Spark等大数据处理框架集成,通过Hive或Spark SQL的SQL接口来查询HBase中的数据。Hive提供了一个SQL-like的查询语言HiveQL,而Spark SQL则提供了完整的SQL支持。通过这种方式,用户可以使用SQL语言来查询HBase中的数据,而无需直接编写HBase的API调用。
- 使用Phoenix:Apache Phoenix是一个开源的SQL查询引擎,它允许用户直接使用SQL语言来查询HBase中的数据。Phoenix将SQL查询转换成HBase的API调用,并提供了丰富的SQL功能和优化机制,使得用户可以更加方便地查询HBase中的数据。
- 其他工具和接口:除了上述方式外,还有一些其他的工具和接口可以用来查询HBase中的数据,如HBase的RESTful接口、Thrift接口等。这些接口允许用户通过HTTP或Thrift协议与HBase进行通信,并执行数据的查询操作。不过,这些接口通常要求用户具备一定的编程能力,以便能够编写相应的客户端代码来发送查询请求。
综上所述,虽然HBase本身不支持SQL查询,但用户可以通过多种方式来实现类似SQL的查询功能。在选择适合的查询方式时,用户需要根据自己的具体需求和场景来进行权衡和选择。
HBase的get()命令是在HBase Shell中用来检索表中单条记录的方法。
这个命令允许你指定表名和行键(Row Key),然后HBase会返回该行键对应的整行数据。
如果行键不存在于表中,则不会返回任何数据。
使用get()命令的基本语法如下:
get '表名', '行键'
或者,如果你想要检索的列族和列限定符是特定的,你也可以在命令中指定它们,如下所示:
get '表名', '行键', {COLUMNS => ['列族:列限定符', '另一个列族:列限定符']}
如果未指定列族和列限定符,get()命令将返回指定行键的所有列族和列的数据。
示例
假设我们有一个名为myTable的表,它有两个列族:info和data。我们想要检索行键为row1的记录:
hbase(main):001:0> get 'myTable', 'row1'
这条命令将返回row1行键对应的所有列族和列的数据。
如果我们只对info列族中的name列感兴趣,我们可以这样指定:
hbase(main):002:0> get 'myTable', 'row1', {COLUMNS => ['info:name']}
这将仅返回row1行键中info列族的name列的数据。
注意事项
确保在执行get命令之前,你已经连接到了HBase Shell,并且HBase集群是可用的。
行键是区分大小写的,所以请确保在输入行键时大小写正确。
如果表或列族不存在,或者行键在表中找不到,HBase将返回一个错误或空的结果。
在处理大量数据时,使用get命令可能会比较慢,因为它每次只检索一行数据。如果你需要检索多行数据,考虑使用scan命令或其他更高效的查询方法。
9/总结
HBase是一个NoSQL数据库,列式存储。
一般我们用它来存储海量的数据(因为它基于HDFS分布式文件系统上构建的)
HBase的一行记录由一个RowKey和一个或多个的列以及它的值所组成。先有列族后有列,列可以随意添加。
具体你想添加到哪一个列族中,你自己说了算。
HBase的增删改记录都有「版本」,默认以时间戳的方式实现。
RowKey的设计如果没有特殊的业务性,最好设计为散列的,这样避免热点数据分布在同一个HRegionServer中。
HBase的读写都经过Zookeeper去拉取meta数据,定位到对应的HRegion,然后找到HRegionServer