Hbase的简单学习一

一 Hbase的搭建与安装

1.1 安装

1.准备好文件,上传到Linux上

2.解压文件  tar zxvf hbase-2.2.7-bin.tar.gz -C ../

../是解压到的路径

1.2 配置文件

1.配置环境变量 去etc/profile目录下

export HBASE_HOME=/usr/local/soft/hbase-2.2.7
export PATH=$PATH:$HBASE_HOME/bin

2.修改hbase-site.xml文件

<!--指定 zookeeper 服务器 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,node1,node2</value>
</property>

<!--指定 hbase 根路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>

<!--将 hbase 设置为分布式部署。 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>

<!-- 避免出现启动错误。 -->
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>

2.修改hbase-env.sh文件

export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/local/soft/jdk1.8.0_171

3.修改regionservers文件

node1
node2

4.同步一份给子节点

scp -r hbase-2.2.7 node2:`pwd`

1.3启动

1.hbase启动顺序:
zk-->hadoop-->hbase

2.命令

a、启动zk 三台机器都要输入

zkServer.sh start

b、启动Hadoop集群

start-all.sh

c、启动Hbase

start-hbase.sh

1.4 进入客户端

hbase xhell

1.5 进入网页端

http://master:16010/


1.6 退出进程的顺序

1.先退hbase

stop-hbase.sh

这里注意 关闭这个的时候最好 flush一下 将操作客户端的表都刷一下,最最好 每次操作一下表就flush ‘表名’ 一下

2. 再退Hadoop集群

stop-all.sh

3 关闭zk

三台机器都要关闭

zkServer.sh stop

二 Hbase的相关概念

2.1 hbase的概述

1.HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,用于存储海量的结构化或者半结构化,非结构化的数据(底层是字节数组做存储的)

2.HBase是Hadoop的生态系统之一,是建立在Hadoop文件系统(HDFS)之上的分布式、面向列的数据库,通过利用Hadoop的文件系统提供容错能力。如果需要进行实时读写或者随机访问大规模的数据集的时候,会考虑使用HBase。

2.2 HBase处理数据

1.虽然Hadoop是一个高容错、高延时的分布式文件系统和高并发的批处理系统,但是它不适用于提供实时计算;

HBase是可以提供实时计算的分布式数据库,数据被保存在HDFS分布式文件系统上,由HDFS保证期高容错性;

但是再生产环境中,HBase是如何基于hadoop提供实时性呢?

HBase上的数据是以StoreFile(HFile)二进制流的形式存储在HDFS上block块儿中

但是HDFS并不知道的HBase用于存储什么,它只把存储文件认为是二进制文件,也就是说,HBase的存储数据对于HDFS文件系统是透明的。

2.3 hbase与hadoop

2.4 数据模型

1.列簇:一个HBase表被分组成许多“列族”的集合,它是基本的访问控制单元。

2.行:每个表由若干行组成,每个行有一个行键作为这一行的唯一标识。访问表中的行只有三种方式:通过单个行键进行查询、通过一个行键的区间来访问、全表扫描。

3.列修饰符(列限定符):列族里的数据通过列限定符(或列)来定位

4.单元格:在HBase表中,通过行、列族和列限定符确定一个“单元格”(cell),单元格中存储的数据没有数据类型,总被视为字节数组byte[]

5.时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引

2.5 数据坐标

2.6 区域

1.HBase自动把表水平划分为区域(Region),每个区域都是有若干连续行构成的,一个区域由所属的表、起始行、终止行(不包括这行)三个要素来表示。

2.一开始,一个表只有一个区域,但是随着数据的增加,区域逐渐变大,等到它超出设定的阈值(128M)大小,就会在某行的边界上进行拆分,分成两个大小基本相同的区域。然后随着数据的再增加,区域就不断的增加,如果超出了单台服务器的容量,就可以把一些区域放到其他节点上去,构成一个集群。也就是说:集群中的每个节点(Region Server)管理整个表的若干个区域。所以,我们说:区域是HBase集群上分布数据的最小单位

三 Hbase的架构

3.1 组件

1.HBase由三种类型的服务器以主从模式构成:

  • Region Server:负责数据的读写服务,用户通过与Region server交互来实现对数据的访问。

  • HBase HMaster:负责Region的分配及数据库的创建和删除等操作。

  • ZooKeeper:负责维护集群的状态(某台服务器是否在线,服务器之间数据的同步操作及master的选举等)。

HDFS的DataNode负责存储所有Region Server所管理的数据,即HBase中的所有数据都是以HDFS文件的形式存储的。出于使Region server所管理的数据更加本地化的考虑,Region server是根据DataNode分布的。HBase的数据在写入的时候都存储在本地。但当某一个region被移除或被重新分配的时候,就可能产生数据不在本地的情况。这种情况只有在所谓的compaction之后才能解决。

2.Zookeeper

保证任何时候,集群中只有一个master

存贮所有Region的寻址入口。

实时监控Region server的上线和下线信息。并实时通知Master

存储HBase的schema和table元数据的meta信息

3.Master

为Region server分配region

负责Region server的负载均衡

发现失效的Region server并重新分配其上的region

管理用户对table的增删改操作

4.RegionServer

Region server维护region,处理对这些region的IO请求

Region server负责切分在运行过程中变得过大的region 

5.HLog(WAL log):

HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是 HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和 region名字外,同时还包括sequence number和timestamp,timestamp是” 写入时间”,sequence number的起始值为0,或者是最近一次存入文件系 统sequence number。

HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的 KeyValue

 6.Region

HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据;每个表一开始只有一个region,随着数据不断插 入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region(裂变);

当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Regionserver上。

 7.Memstore 与 storefile

  1. 一个region由多个store组成,一个store对应一个CF(列簇)

  2. store包括位于内存中的memstore和位于磁盘的storefile写操作先写入 memstore,当memstore中的数据达到某个阈值,hregionserver会启动 flashcache进程写入storefile,每次写入形成单独的一个storefile

  3. 当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、 major compaction),在合并过程中会进行版本合并和删除工作 (majar),形成更大的storefile。

  4. 当一个region所有storefile的大小和超过一定阈值后,会把当前的region 分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡。

  5. 客户端检索数据,先在memstore找,找不到再找storefile

  6. HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表 示不同的HRegion可以分布在不同的HRegion server上。

  7. HRegion由一个或者多个Store组成,每个store保存一个columns family。

  8. 每个Strore又由一个memStore和0至多个StoreFile组成。

如图:StoreFile 以HFile格式保存在HDFS上。

 3.2 理解

  1、flush刷新在HDFS上呈现究竟是怎么刷新的呢??
    我们目前刚刚学习的时候,添加数据,都是一条一条的put进去,而我们在put的数据比较少(小于128M)的时候,我们put完去HDFS上并未查看到我们put的文件,这是因为数据还在内存中,也就是还在memStore中,所以要想在HDFS中查看到,我们必须手动刷新到磁盘中,这是将memStore的数据刷新到StoreFile中去,这样我们在HDFS中就可以查看到了。  

  2、为什么Hbase不可以使用像Mysql那样进行查询??
    首先,我们应该可以感受到,我们在插入的时候,每行数据,有多少列,列名叫什么完全是我们自己定义的,之所以不支持像MySql那样对列进行查询和操作,因为不确定列的个数和名称。

  3、数据最后存在HDFS上的,HDFS不支持删改,为什么Hbase就可以呢??
    这里有个思想误区,的确,数据是以HFile形式存在HDFS上的,而且HDFS的确是不支持删改的,但是为什么Hbase就支持呢?首先,这里的删除并不是真正意义上的对数据进行删除,而是对数据进行打上标记,我们再去查的时,就不会查到这个打过标记的数据,这个数据Hmaster会每隔1小时清理。修改是put两次,Hbase会取最新的数据,过期数据也是这个方式被清理。

 四 hbase shell

4.1 help

1.可以通过 help '命名名称'来查看命令行的具体使用,包括命令的作用和用法。 通过help ‘hbase’ 命名来查看hbase shell 支持的所有命令,hbase将命令进行分组,其中ddl、dml使用较多。

4.2 general 类

4.2.1 显示集群状态status

4.2.2 查询数据库版本version

4.2.3 显示当前用户与组 whoami

 4.2.4 查看操作表的命令table_help

 4.2.5  退出HBase Shell exit

4.3 DDL

4.3.1. 创建表create

1.创建表时只需要指定列族名称,不需要指定列名。

2.语法

create '表名', {NAME => '列族名1'}, {NAME => '列族名2'}, {NAME => '列族名3'}
# 此种方式是上上面的简写方式,使用上面方式可以为列族指定更多的属性,如VERSIONS、TTL、BLOCKCACHE、CONFIGURATION等属性
create '表名', '列族名1', '列族名2', '列族名3'

create '表名', {NAME => '列族名1', VERSIONS => 版本号, TTL => 过期时间, BLOCKCACHE => true}

3.示例

create 'tbl_user', 'info', 'detail'
create 't1', {NAME => 'cf1', VERSIONS => 2}

4.3.2 修改(添加、删除)表结构Schema alter

1 添加一个列簇

语法 alter '表名', '列族名'

 2.删除一个列簇

语法:alter '表名', {NAME=> '列族名', METHOD=> 'delete'}

示例:alter 't1',{NAME => 'cf2', METHOD => 'delete'}

3. 修改列簇属性

可以修改列族的VERSIONS、IN_MEMORY

alter 't1', NAME => 'f1', VERSIONS => 5

4.3.3 获取表的描述describe

1.语法

describe '表名'

4.3.4 列举所有表list

1.查看的是所有命名空间的表

4.3.5 表是否存在exists

语法:exists '表名'

4.3.6 启用表enable和禁用表disable

1.通过enable和disable来启用/禁用这个表,相应的可以通过is_enabled和is_disabled来检查表是否被禁用。

2.语法:

enable '表名'
is_enabled '表名'

disable '表名'
is_disabled '表名'

4.3.7 启用 禁用满足正则表达式的所有表enable_all

1.相关概念

  • .匹配除“\n”和"\r"之外的任何单个字符

  • *匹配前面的子表达式任意次

2.语法

# 匹配以t开头的表名
disable_all 't.*'
# 匹配指定命名空间ns下的以t开头的所有表
disable_all 'ns:t.*'
# 匹配ns命名空间下的所有表
disable_all 'ns:.*'

4.3.8删除表drop

1.需要先禁用表,然后再删除表,启用的表是不允许删除的

2.语法:

disable '表名'
drop '表名'

4.3.9 获取某个表赋值给一个变量 get_table

1.通过 var = get_table ‘表名’ 赋值给一个变量对象,然后对象.来调用,就像面向对象编程一样,通过对象.方法来调用,这种方式在操作某个表时就不必每次列举表名了。

4.3.10 获取rowKey所在的区 locate_region

4.3.11 显示hbase所支持的所有过滤器show_filters

1.过滤器用于get和scan命令中作为筛选数据的条件,类型关系型数据库中的where的作用

4.4 namespace

hbase中没有数据库的概念 , 可以使用namespace来达到数据库分类别管理表的作用

4.4.1 列举命名空间 list_namespace

4.4.2 获取命名空间描述 describe_namespace

1.语法 describe_namespace '命名空间'

  

4.4.3 查看命名空间下的所有表 list_namespace_tables

4.4.4 创建命名空间create_namespace

4.4.5 删除命名空间drop_namespace

4.5 DML

4.5.1 插入或者修改数据put

1.语法:

当列族中只有一个列时'列族名:列名'使用'列族名'
put '表名', '行键', '列族名', '列值'
put '表名', '行键', '列族名:列名', '列值'

2.他写入是一行写入的

 

# 第一行数据
put 'users', 'rk1001', 'info:id', '1'
put 'users', 'rk1001', 'info:name', '张三'
put 'users', 'rk1001', 'info:age', '28'
put 'users', 'rk1001', 'detail:birthday', '1990-06-26'
put 'users', 'rk1001', 'detail:email', 'abc@163.com'
put 'users', 'rk1001', 'detail:create_time', '2019-03-04 14:26:10'
put 'users', 'rk1001', 'address', '上海市'

# 第二行数据
put 'users', 'rk1002', 'info:id', '2'
put 'users', 'rk1002', 'info:name', '李四'
put 'users', 'rk1002', 'info:age', '27'
put 'users', 'rk1002', 'detail:birthday', '1990-06-27'
put 'users', 'rk1002', 'detail:email', 'xxx@gmail.com'
put 'users', 'rk1002', 'detail:create_time', '2019-03-05 14:26:10'
put 'users', 'rk1002', 'address', '北京市'

# 第三行数据
put 'users', 'rk1003', 'info:id', '3'
put 'users', 'rk1003', 'info:name', '王五'
put 'users', 'rk1003', 'info:age', '26'
put 'users', 'rk1003', 'detail:birthday', '1990-06-28'
put 'users', 'rk1003', 'detail:email', 'xyz@qq.com'
put 'users', 'rk1003', 'detail:create_time', '2019-03-06 14:26:10'
put 'users', 'rk1003', 'address', '杭州市'

4.5.2 全表扫描scan

1.语法

scan '表名'

 2.扫描整个列簇

# 语法
scan '表名', {COLUMN=>'列族名'}

# 示例
scan 'users', {COLUMN=>'info'}

3.扫描整个列簇的某个列

# 语法
scan '表名', {COLUMN=>'列族名:列名'}

# 示例
scan 'users', {COLUMN=>'info:age'}

4.限制查几行

语法

scan '表名',{LIMIT=>1}

意思是查一行

4.5.3 获取数据get

1.可以获取某一行,也可以获取应该单元格

# 语法
get '表名', '行键'

# 示例
get 'users', 'xiaoming'

2.建表的时候确定了几个版本的值,那么获取的时候页可以获取几个版本的值

例如 create 'test1', {NAME => 'cf1', VERSIONS => 4} 建表语句

get '表名','行名',{COLUMN=>'列簇',VERSIONS=>4}

4.5.4 删除某个列族中的某个列delete

1.语法 delete '表名', '行键', '列族名:列名'

2.删除的是最新的那一列

4.5.5 删除某行数据deleteall

1.语法 deleteall '表名', '行键'

 

4.5.6 清空整个表的数据truncate

1.语法 truncate '表名'

4.5.7 自增incr

1.语法 incr '表名', '行键', '列族:列名', 步长值

2.
# 示例 
# 注意:incr 可以对不存的行键操作,如果行键已经存在会报错,如果使用put修改了incr的值再使用incr也会报错
# ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Field is not a long, it's 2 bytes wide
incr 'tbl_user', 'xiaohong', 'info:age', 1

 

4.5.8 计数器get_counter

create 'counters', 'daily', 'weekly', 'monthly'
incr 'counters', '20240415', 'daily:hits', 1
get_counter 'counters', '20240415', 'daily:hits'  获取计数器的值

4.5.9 修饰词

1.修饰词

# 语法
scan '表名', {COLUMNS => [ '列族名1:列名1', '列族名1:列名2', ...]}

# 示例
scan 'tbl_user', {COLUMNS => [ 'info:id', 'info:age']}

2.TIMESTAMP 指定时间戳

scan '表名',{TIMERANGE=>[timestamp1, timestamp2]}

# 示例
scan 'tbl_user',{TIMERANGE=>[1551938004321, 1551938036450]}

区间是左闭右开的

3.VERSIONS

默认情况下一个列只能存储一个数据,后面如果修改数据就会将原来的覆盖掉,可以通过指定VERSIONS时HBase一列能存储多个值。

create 'tbl_test', 'columnFamily1'
describe 'tbl_test'

# 修改列族版本号
alter 'tbl_test', { NAME=>'columnFamily1', VERSIONS=>3 }

put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value2'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value3'

# 默认返回最新的一条数据
get 'tbl_test','rowKey1','columnFamily1:column1'

# 返回3个
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>3}
# 返回2个
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>2}

4、STARTROW

ROWKEY起始行。会先根据这个key定位到region,再向后扫描

 

scan '表名', { STARTROW => '行键名'}

# 示例
scan 'users', { STARTROW => 'rk1002'}

5、STOPROW :截止到STOPROW行,STOPROW行之前的数据,不包括STOPROW这行数据

# 语法
scan '表名', { STOPROW => '行键名'}

5.ENDROW :截止到ENDROW 行,ENDROW 行之前的数据,不包括ENDROW 这行数据

scan '表名', {ENDROW => '行键名'}

 

6、LIMIT 返回的行数

# 语法
scan '表名', { LIMIT => 行数}

# 示例
scan 'tbl_user', { LIMIT => 2 }

4.5.10 FILTER条件过滤器

过滤器之间可以使用AND、OR连接多个过滤器。

1、ValueFilter 值过滤器

# 语法:binary 等于某个值
scan '表名', FILTER=>"ValueFilter(=,'binary:列值')"

scan 'users',FILTER=>"ValueFilter(=,'binary:张三')"

取出张三的所有信息

# 语法 substring:包含某个值
scan '表名', FILTER=>"ValueFilter(=,'substring:列值')"

scan 'users',FILTER=>"ValueFilter(=,'substring:2019')"

取里面包含2019的所有列

 

2、ColumnPrefixFilter 列名前缀过滤器

# 语法 substring:包含某个值
scan '表名', FILTER=>"ColumnPrefixFilter('列名前缀')"

scan 'users', FILTER=>"ColumnPrefixFilter('a')"

取出所有包含a的列的所有信息

 

3、rowKey字典排序

Table中的所有行都是按照row key的字典排序的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Midjourney 实现角色一致性的新方法

AI 绘画的奇妙之处&#xff0c;实乃令人叹为观止&#xff01;就像大千世界中&#xff0c;寻不见两片完全相同的树叶一般&#xff0c;AI 绘画亦复如是。同一提示之词&#xff0c;竟能催生出千变万化的图像&#xff0c;使得AI所绘之作&#xff0c;宛如自然之物般独特&#xff0c;…

在报表控件 FastReport .NET 中使用 PageCreate 事件

FastReport Business Graphics .NET&#xff0c;是一款基于fastreport报表开发控件的商业图形库&#xff0c;借助 FastReport 商业图形库&#xff0c;您可以可视化不同的分层数据&#xff0c;构建业务图表以进行进一步分析和决策。利用数据呈现领域专家针对 .NET 7、.NET Core、…

使用Android studio,安卓手机编译安装yolov8部署ncnn,频繁出现编译错误

从编译开始就开始出现错误&#xff0c;解决步骤&#xff1a; 1.降低graddle版本&#xff0c;7.2-bin --->>> 降低为 6.1.1-all #distributionUrlhttps\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionUrlhttps\://services.gradle.org/di…

【论文阅读】RS-Mamba for Large Remote Sensing Image Dense Prediction(附Code)

论文作者提出了RS-Mamba(RSM)用于高分辨率遥感图像遥感的密集预测任务。RSM设计用于模拟具有线性复杂性的遥感图像的全局特征&#xff0c;使其能够有效地处理大型VHR图像。它采用全向选择性扫描模块&#xff0c;从多个方向对图像进行全局建模&#xff0c;从多个方向捕捉大的空间…

Vue的生命周期的详解

Vue的生命周期是每个使用Vue框架的前端人员都需要掌握的知识&#xff0c;以此作为记录。 Vue的生命周期就是vue实例从创建到销毁的全过程&#xff0c;也就是new Vue() 开始就是vue生命周期的开始。Vue 实例有⼀个完整的⽣命周期&#xff0c;也就是从开始创建、初始化数据、编译…

基于51单片机点滴输液控制系统LCD显示( proteus仿真+程序+设计报告+讲解视频)

基于51单片机点滴输液控制系统LCD显示 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接 基于51单片机点滴输液控制系统LCD显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus7.8及以上…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.5版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、小程序、Uniapp、标准Java平台&#xff0c;服务端基于Netty编写。 工…

09 SQL进阶 -- SQL高级处理 -- 窗口函数等

1. 窗口函数 1.1 窗口函数概念及基本的使用方法 窗口函数也称为 OLAP 函数。OLAP 是 OnLine AnalyticalProcessing 的简称,意思是对数据库数据进行实时分析处理。 为了便于理解,称之为窗口函数。常规的 SELECT 语句都是对整张表进行查询,而窗口函数可以让我们有选择的去某…

创建一个javascript公共方法的npm包,js-tool-big-box,发布到npm上,一劳永逸

前端javascript的公共方法太多了&#xff0c;时间日期的&#xff0c;数值的&#xff0c;字符串的&#xff0c;搞复制的&#xff0c;搞网络请求的&#xff0c;搞数据转换的&#xff0c;几乎就是每个新项目&#xff0c;有的拷一拷&#xff0c;没有的继续写&#xff0c;放个utils目…

每日一题---OJ题: 用队列实现栈

片头 嗨! 小伙伴们,大家好! 今天我们一起来看看这道OJ题---用队列实现栈,话不多说,我们马上开始~ emmm,题目看似有点长,我们一起来分析分析! 我们都知道,栈的特点是后进先出(Last In First Out,简称 LIFO ),队列的特点是先进先出(First In First Out 简称 FIFO),明明两者的性…

【记录】Python|Selenium 下载 PDF 不预览不弹窗(2024年)

版本&#xff1a; Chrome 124Python 12Selenium 4.19.0 版本与我有差异不要紧&#xff0c;只要别差异太大比如 Chrome 用 57 之前的版本了&#xff0c;就可以看本文。 如果你从前完全没使用过、没安装过Selenium&#xff0c;可以参考这篇博客《【记录】Python3&#xff5c;Sele…

求π的近似值(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;int symbol 1;double denominator 1.0, sum 0, term 1.0;//循…

Excel文件解析(Java)

一、概述 在应用程序的开发过程中&#xff0c;经常需要使用 Excel文件来进行数据的导入或导出。所以&#xff0c;在通过Java语言实现此类需求的时候&#xff0c;往往会面临着Excel文件的解析(导入&#xff09;或生成&#xff08;导出)。 在Java技术生态圈中&#xff0c…

JVM运行时内存溢出以及解决办法

JVM有哪些运行时数据区 JVM运行时数据区有程序计数器、本地方法栈虚拟机栈、堆、元数据区、直接内存。 其中只有程序计数器不是内存溢出&#xff0c;其他的都有可能会产生内存溢出。 栈内存溢出 当方法的调用深度过深&#xff0c;可能会导致栈内存溢出。 一般是发生在递归调…

Elasticsearch:如何将 MongoDB 数据引入 Elastic Cloud

作者&#xff1a;Hemendra Singh Lodhi Elastic Cloud 是由 Elastic 提供的基于云的托管服务。Elastic Cloud 允许客户在亚马逊网络服务 (AWS)、谷歌云平台 (GCP) 和微软 Azure 上部署、管理和扩展他们的 Elasticsearch 集群。 MongoDB 是一种流行的 NoSQL 文档导向数据库&am…

IDEA最好用插件推荐

1 背景 俗话说&#xff1a;“工欲善其事必先利其器”&#xff0c;本问介绍几款强大实用的 IDEA 插件&#xff0c;助力大家开发。 希望大家做一个聪明又努力的人&#xff0c;而不只是一个努力的人。 以下插件大都可以通过 IDEA 自带的插件管理中心安装&#xff0c;如果搜不到可以…

算法|最大堆、最小堆和堆排序的实现(JavaScript)

一些概念 堆&#xff1a;特殊的完全二叉树&#xff0c;具有特定性质的完全二叉树。大根堆&#xff1a;父节点 > 子节点小根堆&#xff1a;父节点 < 子节点 二叉堆也属于完全二叉树&#xff0c;所以可以用数组表示。 若下标从1开始&#xff0c;左节点为 2*i &#xff0…

类和对象-封装-设计案例1-立方体类

#include<bits/stdc.h> using namespace std; class Cube{public://设置长void setL(int l){m_Ll;} //获取长int getL(){return m_L;}//设置宽 void setW(int w){m_Ww;}//获取宽 int getW(){return m_W;}//设置高 void setH(int h){m_Hh;}//获取高int getH(){return m_H;…

【机器学习300问】72、神经网络的隐藏层数量和各层神经元节点数如何影响模型的表现?

评估深度学习的模型的性能依旧可以用偏差和方差来衡量。它们反映了模型在预测过程中与理想情况的偏离程度&#xff0c;以及模型对数据扰动的敏感性。我们简单回顾一下什么是模型的偏差和方差&#xff1f; 一、深度学习模型的偏差和方差 偏差&#xff1a;衡量模型预测结果的期望…

JAVAEE—UDP协议TCP协议/三次握手四次挥手

文章目录 UDP协议UDP协议的段格式UDP的传输过程校验和无连接 TCP协议TCP报文的格式段有连接可靠性确认应答超时重传如果ACK丢了呢&#xff1f; 序号和确认序号 连接的构建和断开连接的构建&#xff08;三次握手&#xff09;三次握手的作用为什么握手是三次&#xff0c;而不是四…