Hbase基础概念

news2024/11/22 21:02:45

HBase

  • 一、HBase的数据模型
    • 1.HBase数据存储结构
    • 2.HBase存储概念
    • 3.HBase基本架构
  • 二、HBase Shell
    • 1.DDL(Data Definition Language)
    • 2.DML(Data Manipulation Language)
  • 三、HBase组成架构
    • 1. Master架构
    • 2. RegionServer架构
  • 四、HBase读写流程
    • 1.写流程
      • MemStore Flush
      • HFile(StoreFile)结构
    • 2.读流程
      • 1.合并读取数据优化
    • 2.StoreFile Compaction
    • 3.Region Split
  • 五、布隆过滤器

Apache HBase™ 是 以 hdfs为数据存储的 ,一种分布式、可扩展的 NoSQL数据库。

一、HBase的数据模型

HBase的设计理念依据 Google的 BigTable论文,论文中对于数据模型的首句介绍 。
Bigtable 是一个 稀疏的 、 分布式的 、 持久的 多维排序 map 。
之后对于映射的解释如下:
该映射由行 键、列键和 时间戳索引;映射中的每个值都是一个未解释的字节数组。

未解释:数据没有经过反序列化,不能被直接读取。

最终HBase关于 数据模型和 BigTable的对应关系如下:
HBase 使用与 Bigtable 非常相似的数据模型。用户将数据行存储在带标签的表中。数据行具有可排序的键和任意数量的列。该表存储稀疏,因此如果用户喜欢,同一表中的行可以具有疯狂变化的列。
最终理解HBase数据模型的关键在于 稀疏、分布式、多维、排序 的映射。其中映射 map指代非关系型数据库的 key-Value结构。

稀疏的:Hbase是一种NoSql数据库,不像Mysql这样的关系型数据库;Mysql在建表时就已经为数据预留好位置,即使该字段数值为空,这个位置也不能被占用;Hbase为<K,V>型数据库,不会存储空值。

1.HBase数据存储结构

HBase可以用于存储多种结构的数据,以 JSON为例,存储的数据原貌为:

{
	"row_key1":{
		"personal_info":{
			"name":"zhangshan",
			"city":"北京",
			"phone":"131******"
		},
		"office_info":{
			"tel":"010-111111",
			"address":"aimyon36"
		}
	},
	"row_key11":{
		"personal_info":{
			"name":"lisi",
			"city":"上海",
			"phone":"132******"
		},
		"office_info":{
			"tel":"010-111111",
			"address":"aimyon36"
		}
	},
	"row_key22"....
}

逻辑结构在这里插入图片描述
物理存储结构
物理存储结构即为数据映射关系,而在概念视图的空单元格,底层实际根本不存储。
在这里插入图片描述

HBase数据存储依靠HDFS,HDFS存储数据具有一次写入,多次读取的特点,其不支持对数据进行修改,但是HBase存储数据为KV型,通过对相同的K再次写入,根据TimeStamp不可逆的特点,每次写入的数据的时间戳都比上一个数据的时间戳大,从而完成版本号的维护和数据的更新。

HBase底层使用KV数据类型存储,但是用户无需关心底层的存储逻辑,只需要了解其表结构的存储即可 ,其存储Key为(Row Key,Column Family,ColumnQualifier,Timestamp,Type),因此在涉及表时RowKey的设定尤为重要

2.HBase存储概念

![在这里插入图片描述](https://img-blog.csdnimg.cn/1426d49ac57243248930b39fd3a8bc44.pn

1)Name Space
命名空间,类似于关系型数据库的database 概念,每个命名空间下有多个表。HBase 两个自带的命名空间,分别是hbase 和default,hbase 中存放的是HBase 内置的表,default表是用户默认使用的命名空间。

2)Table
类似于关系型数据库的表概念。不同的是,HBase 定义表时只需要声明列族即可,不需要声明具体的列。因为数据存储时稀疏的,所有往HBase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase 能够轻松应对字段变更的场景。

3)Row
HBase 表中的每行数据都由一个RowKey 和多个Column(列)组成,数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey 进行检索,所以RowKey 的设计十分重要。

4)Column
HBase 中的每个列都由Column Family(列族)和Column Qualifier(列值)进行限定,例如info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。

5)Time Stamp
用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上该字段,其值为写入HBase 的时间。

6)Cell
由{rowkey, column Family:column Qualifier, timestamp} 唯一确定的单元。cell 中的数据全部是字节码形式存贮。

7)Region
HBase按照Split策略将一张表横向切分成多个Region,每个Region实际上是一个文件夹,每个Region包含一定范围的Row Key,Region之间互不相交,从而实现表的分布式存储。

8)Store
HBase将每个Region按照列族进一步细分,分区Region中包含0或多个Store,一个Store包含一个列族。HBase中创建多个列族,则会形成多个Store,保存在Region中,如果Store数量大小过多,Region将会进行拆分,形成多个Region。

3.HBase基本架构

在这里插入图片描述
1)Master
实现类为HMaster,负责监控集群中所有的 RegionServer 实例。主要作用如下:
(1)管理元数据表格hbase:meta,接收用户对表格创建修改删除的命令并执行。
(2)监控region 是否需要进行负载均衡,故障转移和region 的拆分。
通过启动多个后台线程监控实现上述功能:

①LoadBalancer 负载均衡器
周期性监控region 分布在regionServer 上面是否均衡,由参数hbase.balancer.period 控制周期时间,默认5 分钟。

②CatalogJanitor 元数据管理器
定期检查和清理hbase:meta 中的数据。

③MasterProcWAL master 预写日志处理器
把master 需要执行的任务记录到预写日志WAL 中,如果master 宕机,让backupMaster读取日志继续干。

WAL预写日志技术,先将操作记录持久化,防止在操作过程中宕机,之后再进行实际操作。

2)Region Server
Region Server 实现类为HRegionServer,主要作用如下:
(1)负责数据cell 的处理,例如写入数据put,查询数据get 等
(2)拆分合并region 的实际执行者,有master 监控,有regionServer 执行。

RegionServer是HBase中的数据存储节点,它们负责处理客户端的读写请求。每个RegionServer通常包含多个Region,每个Region负责管理一张表的一部分数据。

3) Zookeeper
HBase通过 Zookeeper来做 master的高可用、 记录 RegionServer的 部署信息 、 并且存储
有 meta表的位置信息 。

HBase对于数据的读写操作时直接访问 Zookeeper的,在 2.3版本 推 出 Master Registry模式,客户端可以直接访问 master。 使用此功能,会加大对 master的压力,减轻对 Zookeeper的压力。

4) HDFS
HDFS为 Hbase提供最终的底层数据存储服务,同时为 HBase提供高 容错 的支持。

二、HBase Shell

1.DDL(Data Definition Language)

namespace
1)创建命名空间
使用特定的 help 语法能够查看命令如何使用。

hbase:002:0> help 'create_namespace'

2)创建命名空间 bigdata

hbase:003:0> create_namespace 'bigdata'

3)查看所有的命名空间

hbase:004:0> list_namespace

HBase中的namespace类似于mysql中的database

table
1)创建表
在 bigdata 命名空间中创建表格 student,两个列族。info 列族数据维护的版本数为 5 个,如果不写默认版本数为 1。

hbase:005:0> create 'bigdata:student', {NAME => 'info', VERSIONS => 5}, {NAME => 'msg'}

如果创建表格只有一个列族,没有列族属性,可以简写。
如果不写命名空间,使用默认的命名空间 default。

hbase:009:0> create 'student1','info'

HBase中建表需要指定列族,不需要具体指定列,列名和列值能够在添加数据时动态添加。

2)查看表
查看表有两个命令:list 和 describe
list:查看所有的表名

hbase:013:0> list

describe:查看一个表的详情

hbase:014:0> describe 'student1'

3)删除表
shell 中删除表格,需要先将表格状态设置为不可用。

hbase:017:0> disable 'student1'
hbase:018:0> drop 'student1'

在HBase中,执行drop命令后,表的数据会被移动到/hbase/archive目录下,并不会直接从HDFS删除。后台会有进程定期检查这些数据,如果这张表没有快照,则会删除数据。如果表有快照,则会保留数据。因此,在执行drop命令后,表数据不会立即删除,而是在后续进程中逐步删除。

2.DML(Data Manipulation Language)

1)写入数据

在 HBase 中如果想要写入数据,只能添加结构中最底层的 cell。可以手动写入时间戳指定 cell 的版本,推荐不写默认使用当前的系统时间。

hbase:019:0> put 'bigdata:student','1001','info:name','zhangsan'
hbase:020:0> put 'bigdata:student','1001','info:name','lisi'
hbase:021:0> put 'bigdata:student','1001','info:age','18'

如果重复写入相同 rowKey,相同列的数据,会写入多个版本进行覆盖。

HBase底层使用HDFS对数据进行存储,HDFS只支持一次写入,多次读取,HBasemore吧使用timestamp维护一条数据的版本号。

2)读取数据
读取数据的方法有两个:get 和 scan。
get 最大范围是一行数据,也可以进行列的过滤,读取数据的结果为多行 cell。

hbase:022:0> get 'bigdata:student','1001'
hbase:023:0> get 'bigdata:student','1001' , {COLUMN => 'info:name'}

也可以修改读取 cell 的版本数,默认读取一个。最多能够读取当前列族设置的维护版本数。

hbase:024:0>get 'bigdata:student','1001' , {COLUMN => 'info:name', VERSIONS => 6}

scan 是扫描数据,能够读取多行数据,不建议扫描过多的数据,推荐使用 startRow 和stopRow 来控制读取的数据,默认范围左闭右开。

hbase:025:0> scan 'bigdata:student',{STARTROW => '1001',STOPROW => '1002'}

row_key在Hbase中存储会按字典序进行排序

3)删除数据
删除数据的方法有两个:delete 和 deleteall。
delete 表示删除一个版本的数据,即为 1 个 cell,不填写版本默认删除最新的一个版本。

hbase:026:0> delete 'bigdata:student','1001','info:name'

deleteall 表示删除所有版本的数据,即为当前行当前列的多个 cell。(执行命令会标记数据为要删除,不会直接将数据彻底删除,删除数据只在特定时期清理磁盘时进行)

hbase:027:0> deleteall 'bigdata:student','1001','info:name'

在HBase中,delete操作并不会立即将数据从磁盘上删除,而是将数据标记为删除状态。直到发生Major_compaction操作时,数据才会被真正从磁盘上删除。因此,delete操作后,数据不会立即删除,而是在后续的Major_compaction进程中删除。

三、HBase组成架构

1. Master架构

在这里插入图片描述

HMaster通过zookeeper与regionServer进行交流,保证消息的一致性。

元数据表 Meta 表格介绍:

全称 hbase:meta,只是在 list 命令中被过滤掉了,本质上和 HBase 的其他表格一样。

RowKey:([table],[region start key],[region id])

RowKey:([表名],[region起始位置],[regionID])------meta表记录了每张表的Region分布
[表名]标识了该Region属于那张表。
[region起始位置]标识了该Region在表中的划分rowkey起始。
[regionID]标识了该表中Region标识

列族:列名
info:regioninfo 为 region 信息,存储一个 HRegionInfo 对象。
info:server 当前 region 所处的 RegionServer 信息,包含端口号。
info:serverstartcode 当前 region 被分到 RegionServer 的起始时间。

如果一个表处于切分的过程中,即 region 切分,还会多出两列 info:splitA 和 info:splitB,
存储值也是 HRegionInfo 对象,拆分结束后,删除这两列。

负载均衡器线程能够通过meta表中的列值info:server获取region的信息,能够通过修改meta表和修改数据完成负载均衡。

注意在客户端对元数据进行操作的时候才会连接 master,如果对数据进行读写,直接连接
zookeeper 读取目录/hbase/meta-region-server 节点信息
,该节点会记录 meta 表格的位置。直接读取即可,不需要访问 master,这样可以减轻 master 的压力,相当于 master 专注 meta 表的
写操作,客户端可直接读取 meta 表。

在 HBase 的 2.3 版本更新了一种新模式:Master Registry。客户端可以访问 master 来读取
meta 表信息。加大了 master 的压力,减轻了 zookeeper 的压力。

2. RegionServer架构

在这里插入图片描述

HBase中存储的最小单位是Region,一个Region由一个或多个Store组成。

MemStore写缓存
写缓存,由于 HFile 中的数据要求是有序的,所以在接收Put请求后,数据是先存储在 MemStore 中,排好序后,等到达刷写时机才会刷写到 HFile,每次刷写都会形成一个新的 HFile,写入到对应的文件夹 store 中。

每个Store都有对应的一个MemStore,方便对存储的RowKey进行排序。

WAL预写日志
由于数据要经 MemStore 排序后才能刷写到 HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入MemStore 中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

BlockCache读缓存
读缓存,每次查询出的数据会缓存在 BlockCache 中,方便下次查询。

四、HBase读写流程

1.写流程

在这里插入图片描述
(1)首先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server管理;

(2)访问对应的 Region Server,获取 hbase:meta 表,将其缓存到连接中,作为连接属
性 MetaCache,由于 Meta 表格具有一定的数据量,导致了创建连接比较慢; 之后使用创建的连接获取 Table,这是一个轻量级的连接,只有在第一次创建的时候会检查表格是否存在访问 RegionServer,之后在获取 Table 时不会访问 RegionServer;

由于meta表的数据只在创建连接时获取,如果在获取连接后的一段时间内没有进行操作,HBase中可能由于发生Region的拆分或合并导致meta表数据变更;当获取连接后的一段时间后在进行操作请求时,有可能发生找不到对应Region的情况。

(3)调用Table的put方法写入数据,此时还需要解析RowKey,对照缓存的MetaCache,
查看具体写入的位置有哪个 RegionServer;
(4)将数据顺序写入(追加)到 WAL,此处写入是直接落盘的,并设置专门的线程控
制 WAL 预写日志的滚动(类似 Flume);
(5)根据写入命令的 RowKey 和 ColumnFamily 查看具体写入到哪个 MemStore,并且
在 MemStory 中排序;
(6)向客户端发送 ack;
(7 )等达到 MemStore 的刷写时机后,将数据刷写到对应的 story 中。

MemStore Flush

当属于Region中的一个MemStore刷写时,属于该Region的MenStore都会进行刷写

MemStore 刷写由多个线程控制,条件互相独立:
主要的刷写规则是控制刷写文件的大小,在每一个刷写线程中都会进行监控:

(1)当某个 memstroe 的大小达到了 hbase.hregion.memstore.flush.size(默认值 128M),
其所在 region 的所有 memstore 都会刷写。
当 memstore 的大小达到了

hbase.hregion.memstore.flush.size(默认值 128M)
*hbase.hregion.memstore.block.multiplier(默认值 4)

时,会刷写同时阻止继续往该 memstore 写数据(由于线程监控是周期性的,所有有可能面
对数据洪峰,尽管可能性比较小)

因为线程的周期性监控,有可能上一次监控时大小达到120M,还没有进行刷写,导致OOM

(2)由 HRegionServer 中的属性 MemStoreFlusher 内部线程 FlushHandler 控制。标准为
LOWER_MARK(低水位线)和 HIGH_MARK(高水位线),意义在于避免写缓存使用过多的内
存造成 OOM
当 region server 中 memstore 的总大小达到低水位线

java_heapsize
*hbase.regionserver.global.memstore.size(默认值 0.4) memstore使用的JVM内存占比
*hbase.regionserver.global.memstore.size.lower.limit(默认值 0.95) memstore使用内存的0.95占比

region 会按照其所有 memstore 的大小顺序(由大到小)依次进行刷写。直到 region server
中所有 memstore 的总大小减小到上述值以下。

当 region server 中 memstore 的总大小达到高水位线

java_heapsize
*hbase.regionserver.global.memstore.size(默认值 0.4)

时,会同时阻止继续往所有的 memstore 写数据。

(3)为了避免数据过长时间处于内存之中,到达自动刷写的时间,也会触发 memstore
flush。由 HRegionServer 的属性 PeriodicMemStoreFlusher 控制进行,由于重要性比较低,5min才会执行一次。自动刷新的时间间隔由该属性进行配置 hbase.regionserver.optionalcacheflushinterval(默认1 小时)。

HFile(StoreFile)结构

HFile 是存储在 HDFS 上面每一个 store 文件夹下实际存储数据的文件。里面存储多种内容。包括数据本身(keyValue 键值对)元数据记录文件信息数据索引元数据索引一个固定长度的尾部信息(记录文件的修改情况)

键值对按照块大小(默认 64K)保存在文件中,数据索引按照块创建,块越多,索引越大。每一个 HFile 还会维护一个布隆过滤器(就像是一个很大的地图,文件中每有一种 key,就在对应的位置标记,读取时可以大致判断要 get 的 key 是否存在 HFile 中)。

KeyValue 内容如下:
rowlength -----------→ key 的长度
row -----------------→ key 的值
columnfamilylength --→ 列族长度
columnfamily --------→ 列族
columnqualifier -----→ 列名
timestamp -----------→ 时间戳(默认系统时间)
keytype -------------→ Put

可以通过 HBase 提供的命令来查看存储在 HDFS 上面的 HFile 元数据内容。

bin/hbase hfile -m -f /hbase/data/命名空间/表名/regionID/列族/HFile 名

2.读流程

在这里插入图片描述

创建连接同写流程。
(1)创建 Table 对象发送 get 请求。
(2)优先访问 Block Cache,查找是否之前读取过,并且可以读取 HFile 的索引信息和布隆过滤器。

读缓存中缓存了数据的元信息,如果缓存命中就能够直接找到数据。

(3)不管读缓存中是否已经有数据了(可能已经过期了),都需要再次读取写缓存和store 中的文件。

读取写缓存是为了查找对应rowkey的最新版本,读取store是为了查找出数据的所有版本。

(4)最终将所有读取到的数据合并版本,按照 get 的要求返回即可。

1.合并读取数据优化

每次读取数据都需要读取三个位置,最后进行版本的合并。效率会非常低,所有系统需要对此优化。

(1)HFile 带有索引文件,读取对应 RowKey 数据会比较快。
(2)Block Cache 会缓存之前读取的内容和元数据信息,如果 HFile 没有发生变化(记录在 HFile 尾信息中),则不需要再次读取。
(3)使用布隆过滤器能够快速过滤当前 HFile 不存在需要读取的 RowKey,从而避免读取文件。(布隆过滤器使用 HASH 算法,不是绝对准确的,出错会造成多扫描一个文件,对读取数据结果没有影响)

布隆过滤器有可能发生哈希冲突,不同的rowkey可能具有相同的Hash值,导致扫描文件的发生。

2.StoreFile Compaction

由于 memstore 每次刷写都会生成一个新的 HFile,文件过多读取不方便,所以会进行文件的合并,清理掉过期和删除的数据,会进行 StoreFile Compaction。

Compaction 分为两种,分别是 Minor CompactionMajor Compaction。Minor Compaction会将临近的若干个(默认3个)较小的 HFile 合并成一个较大的 HFile,并清理掉部分过期和删除的数据,有系统使用一组参数自动控制,Major Compaction 会将一个 Store 下的所有的 HFile 合并成一个大 HFile,并且会清理掉所有过期和删除的数据,由参数hbase.hregion.majorcompaction控制,默认 7 天。
在这里插入图片描述
Minor Compaction 控制机制:
参与到小合并的文件需要通过参数计算得到,有效的参数有 5 个
(1)hbase.hstore.compaction.ratio(默认 1.2F)合并文件选择算法中使用的比率。
(2)hbase.hstore.compaction.min(默认 3) 为 Minor Compaction 的最少文件个数。
(3)hbase.hstore.compaction.max(默认 10) 为 Minor Compaction 最大文件个数。
(4)hbase.hstore.compaction.min.size(默认 128M)为单个 Hfile 文件大小最小值,小于这
个数会被合并。
(5)hbase.hstore.compaction.max.size(默认 Long.MAX_VALUE)为单个 Hfile 文件大小最大
值,高于这个数不会被合并。

小合并机制为拉取整个 store 中的所有文件,做成一个集合。之后按照从旧到新的顺序遍历。
判断条件为:
① 过小合并,过大不合并
② 文件大小/ hbase.hstore.compaction.ratio < (剩余文件大小和) 则参与压缩。所有把比值设置过大,如 10 会最终合并为 1 个特别大的文件,相反设置为 0.4,会最终产生 4 个 storeFile。不建议修改默认值
③ 满足压缩条件的文件个数达不到个数要求(3 <= count <= 10)则不压缩。

3.Region Split

Region 切分分为两种,创建表格时候的预分区即自定义分区,同时系统默认还会启动一个切分规则,避免单个 Region 中的数据量太大。

预分区(自定义分区)
每一个 region 维护着 startRow 与 endRowKey,如果加入的数据符合某个 region 维护的rowKey 范围,则该数据交给这个 region 维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高 HBase 性能。
1)手动设定预分区

create 'staff1','info', SPLITS => ['1000','2000','3000','4000']

2)生成 16 进制序列预分区

create 'staff2','info',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

3)按照文件中设置的规则预分区
(1)创建 splits.txt 文件内容如下:

aaaa
bbbb
cccc
dddd

(2)然后执行:

create 'staff3', 'info',SPLITS_FILE => 'splits.txt'

系统拆分
Region 的拆分是由 HRegionServer 完成的,在操作之前需要通过 ZK 汇报 master,修改对应的 Meta 表信息添加两列 info:splitA 和 info:splitB 信息。之后需要操作 HDFS 上面对应的文件,按照拆分后的 Region 范围进行标记区分,实际操作为创建文件引用,不会挪动数据。刚完成拆分的时候,两个 Region 都由原先的 RegionServer 管理。之后汇报给 Master,由Master将修改后的信息写入到Meta表中。等待下一次触发负载均衡机制,才会修改Region的管理服务者,而数据要等到下一次压缩时,才会实际进行移动。

不管是否使用预分区,系统都会默认启动一套 Region 拆分规则。不同版本的拆分规则有差别。系统拆分策略的父类为 RegionSplitPolicy。

0.94 版本之前 => ConstantSizeRegionSplitPolicy
( 1 ) 当 1 个 region 中 的 某 个 Store 下 所 有 StoreFile 的 总 大 小 超 过hbase.hregion.max.filesize (10G),该 Region 就会进行拆分。0.94 版本之后,2.0 版本之前 => IncreasingToUpperBoundRegionSplitPolicy
( 2 ) 当 1 个 region 中 的 某 个 Store 下 所 有 StoreFile 的 总 大 小 超 过
Min(initialSizeR^3 ,hbase.hregion.max.filesize"),该 Region 就会进行拆分。其中 initialSize 的
默认值为 2
hbase.hregion.memstore.flush.size,R 为当前 Region Server 中属于该 Table 的
Region 个数(0.94 版本之后)。

具体的切分策略为:
第一次 split:1^3 * 256 = 256MB
第二次 split:2^3 * 256 = 2048MB
第三次 split:3^3 * 256 = 6912MB
第四次 split:4^3 * 256 = 16384MB > 10GB,因此取较小的值 10GB
后面每次 split 的 size 都是 10GB 了。

2.0 版本之后 => SteppingSplitPolicy
(3)Hbase 2.0 引入了新的 split 策略:如果当前 RegionServer 上该表只有一个 Region,
按照 2 * hbase.hregion.memstore.flush.size 分裂,否则按照 hbase.hregion.max.filesize 分裂。

五、布隆过滤器

布隆过滤器是一种用于快速查询集合中元素是否存在的数据结构。它可以被看作是由一个很长的二进制向量和一系列随机映射函数组成。这个向量被初始化为全0,然后使用一系列哈希函数把输入数据映射到向量中的某个位置,并将这个位置的元素置为1。

当要查询一个元素是否在集合中时,同样将这个元素输入到哈希函数中,然后检查对应的k个位置的元素。如果有任意一个位置的元素为0,则表明该元素一定不在集合中。如果所有位置的元素均为1,则表明该集合有较大的可能性在集合中。但需要注意的是,一个元素被置为1有可能会受到其他元素的影响,这就是误判。

布隆过滤器的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。因为布隆过滤器只能记录元素是否存在,不能准确地记录元素的值,因此存在一定的误识别率。同时,由于布隆过滤器中的元素不能被删除,因此当集合中的元素被删除后,布隆过滤器中的位向量将无法更新,导致查询结果不准确。

布隆过滤器主要适用于大量数据的去重和检验,而HashSet等数据结构适合中小量数据的去重和检验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/789807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI数字人:金融数字化转型的“关键先生”

今年年初ChatGPT的火热&#xff0c;在全球掀起一阵生成式AI&#xff08;AIGC&#xff09;热潮。国外的OpenAI、国内的百度等企业&#xff0c;都在AIGC上强力布局。 各种应用场景中&#xff0c;AIGC助力的数字人引起了市场注意。 事实上&#xff0c;数字人不是个新鲜事。早在1…

Linux 系统下 “Verilog” 编程配置

文章目录 简介Verilog HDLIverilogGtkwave 环境搭建软件的安装Vim 之 Verilog 语法高亮配置 简单的计数器示例计数器程序的编写仿真测试 简介 Verilog HDL Verilog HDL 是一种用于设计数字电路的硬件描述语言&#xff0c;它可以用来描述数字电路的功能和结构&#xff0c;并且可…

云服务器AccessKey执行命令

人之所以痛苦&#xff0c;在于追求错误的东西。如果你不给自己烦恼&#xff0c;别人也永远不可能给你烦恼。因为你自己的内心&#xff0c;你放不下。 好好的管教你自己&#xff0c;不要管别人。 漏洞实战 查看所有实例信息 A.exe -a xxx -s xxx ecs -list执行命令 A.exe -a…

新能源汽车充电桩最重要的模块设备是什么

你是否曾经遇到过充电桩无法给你电动汽车提供电源的问题?或者你曾经怀疑过为什么充电桩速度如此缓慢?其实&#xff0c;这一切都可能与充电桩最重要的模块设备——控制主板有关。 交流充电桩由充电桩外壳、控制主板、刷卡模块、计费控制、显示屏、通信模块、继电器、开关电源等…

JumpServer堡垒机

文章目录 JumpServer堡垒机堡垒机介绍堡垒机产生的原因堡垒机主要功能 Jumpserver安装与配置Jumpserver Web界面用户管理资产管理添加Linux主机 命令过来规则创建审计台操作说明会话审计日志审计 工作台操作说明邮箱配置 JumpServer堡垒机 堡垒机介绍 下图来自百度百科 堡垒机…

面试常问八股文之java篇

JAVA篇 1、为什么重写equals方法的时候要重写hashCode方法&#xff1f; 为了不违背“相同对象必须要有相同hash值"的约定&#xff0c;对于基本数据类型比较的是数值是否相等&#xff0c;对于引用类型数据比较的是对象地址是否同等&#xff0c;在object中equal方法也是默…

(学习笔记-IP)IP协议相关技术

DNS 我们在上网的时候&#xff0c;通常使用的方式是域名&#xff0c;而不是IP地址&#xff0c;因为域名方便人类记忆。 那么实现这一技术的就是DNS域名解析器&#xff0c;DNS可以将域名网址自动转换为具体的IP地址。 域名的层级关系 DNS中的域名都是用句点来分隔的&#xff0…

软件升级相关

文章目录 一、升级方案1、移动端升级2、window 升级SquirrelSparkle 一、升级方案 1、移动端升级 腾讯Bugly &#xff0c;支持Android 平台、iOS平台、Cocos2D、Unity3D。 2、window 升级 windows的exe的打包及升级工具 Squirrel Squirrel 是一款免费的开源exe升级工具&a…

NFT市场泡沫破裂了吗?投资NFT是否仍然安全?

近期&#xff0c;NFT市场的价格出现了明显的下跌趋势&#xff0c;许多人开始担心NFT市场是否已经进入了泡沫破裂的阶段。但是&#xff0c;我们需要认真分析这个问题&#xff0c;并且探讨投资NFT是否仍然安全。 NFT&#xff08;Non-Fungible Token&#xff09;是一种非同质化代币…

JMerter安装配置以及使用(笔记记录)

JMerter安装配置以及使用&#xff08;笔记记录&#xff09; 安装JDK安装JMeterJMeter使用元件执行的顺序参数详解参数配置之CSV数据文件设置断言响应断言JSON断言 数据提取XPath提取器JSON提取器 JMeter属性JMeter录制脚本JMeter直连数据库逻辑控制器如果&#xff08;IF&#x…

reference文献引用列表要求

目录 1、基本要求 2、文献格式 3、引用技巧 4、特殊情况&#xff1a; 有新闻和网络文章的引用&#xff1a; 1、基本要求 对于每一篇paper&#xff0c;我们需要按照文中出现的顺序&#xff0c;列出文中引用的所有文献。 对于文献的引用有如下要求&#xff1a; a】顺序要求…

【node.js】03-http模块

目录 一、什么是http模块 二、创建基本的WEB服务器 三、req请求对象 四、res响应对象 五、根据不同的url响应不同的JSON内容 一、什么是http模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer() 方法&#xff0c;…

回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-BiLSTM时间卷积…

MonsterInsights Pro 8.18.0 Google Analytics + All Addons Pack

MonsterInsights适用于 WordPress 的 Google Analytics&#xff08;分析&#xff09;插件&#xff0c;功能强大 MonsterInsights 是适用于 WordPress 的最佳 Google Analytics&#xff08;分析&#xff09;插件。这些功能使 MonsterInsights 成为市场上功能最强大且用户友好的 …

网络通信原理(第十八课)

网络通信原理(第十八课) 4.1 回顾 1.什么是TCP/IP 目前应用广泛的网络通信协议集 国际互联网上电脑相互通信的规则、约定。 2.主机通信的三要素 IP地址:用来标识一个节点的网络地址(区分网络中电脑身份的地址,如人有名字) 子网掩码:配合IP地址确定网络号 IP路由:网…

Linux笔记——磁盘进行分区与挂载介绍

系列文章目录 Linux笔记——管道相关命令以及shell编程 文章目录 系列文章目录 前言 分区与挂载 1 分区 1.1 分区示意图​编辑 1.2 分区介绍 2 硬盘的挂载 3 增加一块硬盘 3.1 增加一块硬盘 3.2 硬盘进行分区 3.3 格式化磁盘 4 卸载 5 查看磁盘使用情况 6 一些…

javascript 7种继承-- 原型链继承分析(1)

文章目录 概要继承的进化史技术名词解释原型链的作用原型链继承案列分析源代码解析效果图预留问题小结 概要 这阵子在整理JS的7种继承方式&#xff0c;发现很多文章跟视频&#xff0c;讲解后都不能让自己理解清晰&#xff0c;索性自己记录一下&#xff0c;希望个位发表需要修改…

10分钟实现任务调度平台搭建

日常项目中&#xff0c;会有很多需要定时执行的任务&#xff0c;而这些任务的变化比较多&#xff0c;可能随时都要调整&#xff0c;那么对调度的灵活性要求比较高。我们传统的Spring Task或者Quartz&#xff0c;可以实现定时任务调度&#xff0c;但是内置在代码里&#xff0c;修…

Matlab Kappa系数和总体精度OA计算

axlsread(D:\homework\精度验证产品.xlsx); Predicteda(:,1); vala(:,2); g0; for i1:size(a,1) %记录验证结果是否与实际值一致if(Predicted(i)val(i))gg1;end end OAg/(size(a,1));% 计算混淆矩阵 confusion_matrix confusionmat(val, Predicted);% 计算总样本数 total_sa…

全方位对比 Postgres 和 MongoDB (2023 版)

本文为「数据库全方位对比系列」第二篇&#xff0c;该系列的首部作品为「全方位对比 Postgres 和 MySQL (2023 版)」 为何对比 Postgres 和 MongoDB 根据 2023 年 Stack Overflow 调研&#xff0c;Postgres 已经成为最受欢迎和渴望的数据库了。 MongoDB 曾连续 4 年 (2017 - …