HBase常用Shell命令

news2025/8/2 10:57:33

HBase提供了一个非常方便的命令行交互工具HBase Shell。通过HBase Shell,HBase可以与MySQL命令行一样创建表、索引,也可以增加、删除和修改数据,同时集群的管理、状态查看等也可以通过HBase Shell实现。

一、数据定义语言

数据定义语言(Data Definition Language,DDL),包括数据库表的创建、修改等语句。

1,创建表

创建表的语句如下:
create 's_behavior', {NAME => 'pc'} , {NAME => 'ph'}
该语句创建了一个s_behavior表,用来存储用户的行为数据,这个表有两个列族,列族pc用来存储用户PC端的用户行为数据,列族ph用来存储用户手机端的用户行为数据。

2,查看所有表

查看所有表的语句如下:
list
该语句会列出HBase数据库中所有已经创建的表。

3,查看已创建的表

查看已创建的表的语句如下:
describe 's_behavior'

在这里插入图片描述
虽然在创建表的时候没有指定任何属性,但是HBase默认会给表设置一些属性:
(1)BLOOMFILTER:布隆过滤器。做Scan操作时用来排除待扫描的存储文件,第9章会有详细描述。
(2)IN_MEMORY:数据是否常驻块缓存。一般只有HBase系统的元数据表才会设置为true。
(3)VERSIONS:对这个表HBase应该保留多少个数据版本。HBase对表的数据行可以保留多个数据版本,以时间戳来区分。
(4)KEEP_DELETED_CELLS:保留删除的数据。意味着可以通过Get或者Scan请求获取已经被删除的数据(如果数据删除后经过了一次大合并,那么这些删除的数据也会被清理),只要这行数据的时间戳在查询的时间范围即可。注意,如果需要开启集群间复制,则这个属性必须为true,否则可能导致数据复制失败。
(5)DATA_BLOCK_ENCODING:数据块编码。用类似于压缩算法的编码形式来节省存储空间,主要是针对行键,用时间换空间,默认情况下不启用数据块编码,第9章会有详细描述。
(6)COMPRESSION:压缩方式。HBase提供了多种压缩方式(如Snappy、LZO、gzip等)用来在数据存储到磁盘之前对数据进行压缩,以减少存储空间。第9章也会详细介绍并对比各种压缩方式。
(7)TTL:存活时间(Time To Live),数据的有效时长。超过有效时长的数据在大合并的时候会被删除。
(8)BLOCKSIZE:HBase读取数据的最小单元。设置过大会导致读取很多不需要的数据,过小则会产生更多的索引文件,默认大小为64 KB。
(9)REPLICATION_SCOPE:集群间数据复制的开关。当集群间数据复制配置好后,REPLICATION_SCOPE=1表示开启复制。默认值为0,表示不开启复制。

4,修改表

修改表的模式(schema)之前需要先将表下线,然后执行修改的命令,再上线。下面的代码将s_behavior表修改为开启集群间复制:
disable 's_behavior'
alter 's_behavior', 
{NAME=>"cf", REPLICATION_SCOPE=>"1", KEEP_DELETED_CELLS => 'TRUE'}enable 's_behavior'

二、数据操纵语言

数据操纵语言(Data Manipulation Language,DML)包括插入、获取、扫描数据的put命令、get命令、scan命令,以及删除数据的delete命令、deleteall命令和truncate命令。

1,put命令

put命令用来插入一行数据到HBase表。

格式:
put <table>,<rowkey>,<列族:列限定符>,<值>
示例:
hbase(main):004:0> put 's_behavior','12345_1516592489001_1','pc:v','1001'
0 row(s) in 0.2020 seconds

hbase(main):005:0> put 's_behavior','12345_1516592489001_1','ph:o','1001'
0 row(s) in 0.0050 second
第一条命令插入一条用户PC端行为数据,
第二条命令插入一条用户手机端行为数据。
注意,两条命令行键相同,只是指定了不同的列族,因此实际上两条数据在HBase中逻辑上是同一条数据。之后用该行键可以唯一地定位到这两个列族的数据。

2,get命令

get命令用来根据行键获取HBase表的一条记录。

格式:
get <table>,<rowkey>
示例:
使用get命令通过行键获取表s_behavior的一行数据,包括这行数据的所有列族:
hbase(main):006:0> get 's_behavior','12345_1516592489001_1'
COLUMN                             CELL 
pc:v                         timestamp=2022-01-24T19:33:18.352, value=1001 
ph:o                         timestamp=2022-01-24T19:33:35.071, value=1001
2 row(s) in 0.0330 seconds

通过给get命令指定时间戳来获取一行数据某个时刻的镜像:
hbase(main):007:0> get 's_behavior','12345_1516592489001_1' , {TIMESTAMP => '1643023998352'}
COLUMN                             CELL 
pc:v                         timestamp=2022-01-24T19:33:18.352, value=1001
1 row(s) in 0.0120 seconds

get命令也支持获取数据的多个版本,但是需要在创建表的语句中指定VERSIONS属性。先修改表支持多个版本,然后用get命令获取多个版本的数据:
hbase(main):008:0> alter 's_behavior',NAME=>'pc',VERSIONS =>3
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9370 seconds

hbase(main):009:0> put 's_behavior','12345_1516592489001_1','
pc:v','1002'
0 row(s) in 0.0100 seconds

hbase:010:0> get 's_behavior','12345_1516592489001_1',{COLUMN => 'pc:v',VERSIONS=>2}
COLUMN                        CELL 
pc:v                     timestamp=2022-01-24T19:49:20.398, value=1002 
pc:v                     timestamp=2022-01-24T19:33:18.352, value=1001
1 row(s)Took 0.0266 seconds

3,scan命令

scan命令用来扫描表的数据。scan命令是HBase数据查询命令中最复杂的命令,需要特别注意查询的数据量,以免由于扫描数据过大导致HBase集群出现响应延迟。

格式:
scan <table>
示例:
使用scan命令来查询表s_behavior中的所有记录:
hbase(main):012:0* scan 's_behavior'
ROW                            COLUMN+CELL 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:49:20.398, value=1002 12345_1516592489001_1  column=ph:o, timestamp=2022-01-24T19:33:35.071, value=1001
1 row(s) in 0.0120 seconds

(1)获取时间区间内数据

示例:
使用时间区间获取“1643021990187<=时间戳<1643023998353”的数据:
hbase(main):013:0> scan 's_behavior', {TIMERANGE => [1643021990187,1643023998353]}
ROW                               COLUMN+CELL 
12345_1516592489001_1     column=ph:o, timestamp=2022-01-24T19:33:18.352, value=1001
1 row(s) in 0.0190 seconds

(2)获取多个版本数据

示例:
使用VERSIONS参数获取表的两个版本数据:
hbase(main):003:0* scan 's_behavior', {VERSIONS=>2}
ROW                           COLUMN+CELL 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:49:20.398, value=1002 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:33:18.352, value=1001 
12345_1516592489001_1  column=ph:o, timestamp=2022-01-24T19:33:35.071, value=1001
1 row(s) in 0.1200 seconds

(3)获取用户前几行数据

示例:
获取ID为12345的用户的前5行数据:
hbase(main):013:0* scan 's_behavior', {FILTER => "PrefixFilter('12345_')" ,COLUM
NS => ['pc'],LIMIT=>5}ROW                               COLUMN+CELL 
12345_1516592489001_1     column=pc:v, timestamp=1521442781396, value=1002 
12345_1516592489001_2     column=pc:v, timestamp=1521442781447, value=1003 
12345_1516592489001_3     column=pc:v, timestamp=1521442781471, value=1004 
12345_1516592489001_4     column=pc:v, timestamp=1521442781492, value=1005 
12345_1516592489001_5     column=pc:v, timestamp=1521442781513, value=1006
5 row(s) in 0.0240 seconds

因为表s_behavior的行键都是以用户ID开头,所以可以使用一个前缀过滤器。注意,需要在用户ID(12345)后面带上下划线,否则会匹配到行键为123450_xxx等类似的数据。

(4)获取某个用户某个时间区间内产生的PC端行为数据

scan命令可以指定扫描开始和结束行键。

示例:
获取ID为12345的用户的某个时间区间内产生的PC端行为数据,使用STARTROW、STOPROW参数指定扫描一个前闭后开的区间,即“STARTROW<=行键<STOPROW”:
hbase(main):014:0> scan 's_behavior', {STARTROW =>
'12345_1516592489001' ,STOPROW=>'12345_15165924890
02' ,COLUMNS => ['pc']}ROW                           COLUMN+CELL 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:33:35.071, value=1002 
12345_1516592489001_2  column=pc:v, timestamp=2022-01-24T19:34:01.012, value=1003 
12345_1516592489001_3  column=pc:v, timestamp=2022-01-24T19:34:01.012, value=1004 
12345_1516592489001_4  column=pc:v, timestamp=2022-01-24T19:34:02.062, value=1005 
12345_1516592489001_5  column=pc:v, timestamp=2022-01-24T19:34:02.076, value=1006 
12345_1516592489001_6  column=pc:v, timestamp=2022-01-24T19:34:03.089, value=1007 
12345_1516592489001_7  column=pc:v, timestamp=2022-01-24T19:34:04.011, value=1008 
12345_1516592489001_8  column=pc:v, timestamp=2022-01-24T19:34:05.171, value=1009
8 row(s) in 0.0320 seconds

(5)获取用户对某种商品的行为数据

示例:
第一条命令查询表s_behavior中列值等于1001的数据,第二条命令查询表s_behavior中列值包含1002的数据:
hbase(main):015:0> scan 's_behavior', FILTER=>"ValueFilter(=,'binary:1001')"
ROW                              COLUMN+CELL 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:33:18.352, value=1001 
12345_1516592489001_1  column=ph:o, timestamp=2022-01-24T19:33:35.071, value=1001
1 row(s) in 0.0430 seconds

hbase(main):016:0> scan's_behavior',FILTER=>"ValueFilter(=,'substring:1002')"
ROW                                           COLUMN+CELL 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:33:18.352, value=1002
1 row(s) in 0.0200 seconds

(6)获取某个用户行为数据的行键

示例:
获取ID为12345的用户的行为数据行键:
hbase(main):012:0> scan 's_behavior', {FILTER => "PrefixFilter('12345') AND
KeyOnlyFilter()" , LIMIT=>3}ROW                              COLUMN+CELL 
12345_1516592489001_1   column=pc:v, timestamp=2022-01-24T19:49:20.398, value= 
12345_1516592489001_1   column=ph:o, timestamp=2022-01-24T19:33:35.071, value= 
12345_1516592489001_2   column=pc:v, timestamp=2022-01-24T19:35:32.011, value= 
12345_1516592489001_3   column=pc:v, timestamp=2022-01-24T19:35:33.169, value=
3 row(s) in 0.0470 seconds

4,delete命令、deleteall命令和truncate命令

HBase提供了delete、deleteall和truncate命令分别用来删除列、行和表的数据。

(1)delete命令删除某列数据。

格式:
delete '<table>', '<rowkey>, '<列族:列限定符>', '[<time stamp>]'
示例:
使用下面的命令可以删除行键为12345_1516592489001_1的数据行中列族为ph、列限定符为o的数据:
hbase(main):014:0> delete 's_behavior', '12345_1516592489001_1' ,'ph:o'
0 row(s) in 0.0470 seconds

(2)deleteall命令删除整行数据。

格式:
deleteall '<table>', '<rowkey>
示例:
使用下面的命令可以删除了行键为12345_1516592489001_1的数据行:
hbase(main):015:0> deleteall 's_behavior', '12345_1516592489001_1'
0 row(s) in 0.0090 seconds

(3)truncate命令删除整表数据。

格式:
truncate '<table>'

示例:
使用下面的命令可以删除用户行为表s_behavior中的所有数据:
hbase(main):016:0> truncate 's_behavior'
Truncating 's_behavior' table (it may take a while): 
- Disabling table... 
- Truncating table...
0 row(s) in 3.4640 seconds

三、其他常用的Shell命令

1,复制状态查看

当HBase开启了集群间复制时,使用status命令可以查看复制的状态,包括复制延迟、待复制日志文件队列大小等。

示例:
hbase(main):017:0> status 'replication'
version 2.4.93 live servers    
master1:       
	SOURCE: PeerID=1, AgeOfLastShippedOp=4773835960, SizeOfLogQueue=2677,      
	TimeStampsOfLastShippedOp=Thu Jan 01 08:00:00 CST 1970,       
	Replication Lag=1521448279318       
	SINK  :AgeOfLastAppliedOp=0,       
	TimeStampsOfLastAppliedOp=Mon Dec 25 17:23:16 CST 2017    
slave1:       
	SOURCE: PeerID=1, AgeOfLastShippedOp=5986238820, SizeOfLogQueue=1665,       
	TimeStampsOfLastShippedOp=Thu Jan 01 08:00:00 CST 1970,       
	Replication Lag=1521448277282       
	SINK  :AgeOfLastAppliedOp=0,       
	TimeStampsOfLastAppliedOp=Mon Dec 25 11:10:14 CST 2017    
master2:       
	SOURCE:PeerID=1, AgeOfLastShippedOp=24121908, SizeOfLogQueue=7,       
	TimeStampsOfLastShippedOp=Mon Mar 19 09:46:36 CST 2018,       
	Replication Lag=24281038       
	SINK  : AgeOfLastAppliedOp=0,      
	TimeStampsOfLastAppliedOp=Tue Mar 13 17:02:06 CST 2018

2,分区拆分

实时在线集群一般会禁用自动拆分以免影响性能,因此当存储文件大小达到某个值后需要手动或者使用自动化程序将分区做拆分。例如,下面的代码将用户行为表s_behavior拆分为两个分区,由于行键以用户ID开始,而用户ID的第一个字符取值范围为0~9,中值为5,因此可以使用5作为拆分后两个分区的分割字符:

hbase(main):018:0>  split 's_behavior','5'
0 row(s) in 0.1060 seconds

3,分区大合并

实时在线集群会禁止大合并,应等到请求的非高峰期来定时做大合并。

示例:
手动触发大合并来压缩表s_behavior的分区,分区名称可以在HBase Web UI找到:
hbase(main):040:0> major_compact's_behavior,,1511878479015.e933a5867bd5253211a4ef90e549192f.'
0 row(s) in 0.0200 seconds

4,负载均衡开关

要对集群进行滚动升级,或者想要关闭自动负载均衡而采用手动负载均衡模式,可以使用下面的命令来开启或者关闭自动负载均衡:

hbase(main):019:0> balance_switch true
true
0 row(s) in 0.0220 seconds

hbase(main):020:0> balance_switch false
true
0 row(s) in 0.0090 seconds

5,分区手动迁移

如果有几个比较大的或者负载高的分区被分配到同一个分区服务器,那么这台分区服务器可能会成为整个HBase集群的瓶颈,这时候可以手动将这些分区迁移到负载低的分区服务器。

分区迁移命令格式:
move' <EncodedRegionName>',’<destServerName>’
示例:
EncodedRegionName的值是RegionName值的后缀部分,destServerName是在HBase Web UI上的分区服务器的全名。
hbase(main):002:0> move 'e933a5867bd5253211a4ef90e549192f', 'master2,16020,1513049558323'
0 row(s) in 0.0790 seconds

6,HBase运行Ruby脚本

在$HBASE_HOME/bin目录中有几个扩展名为rb的文件,可以直接使用HBase来运行这些Ruby脚本。

格式:
./hbase org.jruby.Main PATH_TO_SCRIPT
示例:
[hadoop@master1 bin]$ ./hbase org.jruby.Main get-active-master.rb
SLF4J: Class path contains multiple 
SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hadoop/hadoop-2.10.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop/hbase-2.4.9/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
master1

文章来源:《HBase入门与实践(第2版)》 作者:彭旭

文章内容仅供学习交流,如有侵犯,联系删除哦!

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

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

相关文章

Acwing: 一道关于线段树的好题(有助于全面理解线段树)

题目链接&#x1f517;&#xff1a;2643. 序列操作 - AcWing题库 前驱知识&#xff1a;需要理解线段树的结构和程序基本框架、以及懒标记的操作。 题目描述 题目分析 对区间在线进行修改和查询&#xff0c;一般就是用线段树来解决&#xff0c;观察到题目一共有五个操作&…

查看python第三方库的依赖pkgs

课题组的服务器不给连外网&#xff0c;安装python第三方库就只能手动离线安装。但是python第三方库可能会迭代依赖&#xff0c;单纯的pip show [pkg]是看不出来的…… 参考链接&#xff1a;查看python第三方库的依赖 https://blog.csdn.net/qq_38316655/article/details/127943…

【多层交叉transformer:高光谱和多光谱图像融合】

MCT-Net: Multi-hierarchical cross transformer for hyperspectral and multispectral image fusion &#xff08;MCT-Net&#xff1a;用于高光谱和多光谱图像融合的多层交叉transformer&#xff09; 考虑到光学成像的局限性&#xff0c;图像采集设备通常在空间信息和光谱信…

04-SQL基础(表管理,约束,多表连接,子查询)

本文章主要内容 1、表的管理&#xff1a;创建表&#xff0c;修改表结构&#xff0c;删除字段&#xff0c;修改字段&#xff0c;添加字段&#xff0c;删除表&#xff0c;添加表约束&#xff1b; 2、数据管理&#xff1a;新增记录&#xff0c;修改记录&#xff0c;删除记录&…

分享10个不错的C语言开源项目

今天跟大家分享10个重量级的C语言开源项目&#xff0c;C语言确实经得住考验&#xff1a; Redis&#xff1a;Redis是一个开源的高性能的键值对数据库。它以C语言编写&#xff0c;具有极高的性能和可靠性。 Nginx&#xff1a;Nginx是一个高性能的HTTP和反向代理服务器&#xff0…

KPN对任意形状文本检测

文章目录一、研究背景二、方法流程1. 特征提取2. 核建议3. 实例无关特征图4. 轮廓生成5. 其余部分内容三、不足一、研究背景 相比起基于 FCN 网络的文本边缘检测网络&#xff0c;KPN网络可以更好地处理文本之间的间隔。 二、方法流程 1. 特征提取 FCN 和 FPN FCN(全卷积神经…

第十四届蓝桥杯第三期模拟赛原题与详解

​​​​​​​ 文章目录 一、填空题 1、1 找最小全字母十六进制数 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 给列命名 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 日期相等 1、3、1 题目描述 1、3、2 题解关键思路与解答 1、4 乘积方案数 1、4、1 题目描…

在IC行业,什么样的人才能拿到高薪资offer?

最近几年国家大战略发展半导体产业&#xff0c;薪资也水涨船高&#xff0c;IC设计类岗位应届生薪水甚至已经到30W的级别&#xff0c;越来越多的人想要从事IC行业。 在IC行业&#xff0c;什么样的人才能拿到高薪资offer&#xff1f;来听听资深工程师怎么说&#xff1f; 我参加…

【网络篇】----- 传输层协议 之 UDP(协议格式,协议特性和编程影响三方面详细分析)

文章目录 前言1、UDP协议2、协议格式 2.1、协议格式模型2.2、字段分析3.协议特性4.编程影响总结前言 1、UDP协议 UDP协议&#xff0c;又名数据报传输协议&#xff0c;是传输层协议之一&#xff01;&#xff01;&#xff01; 在TCP/IP五层模型中&#xff0c;在传输层中&#xff…

MATLAB | 如何绘制github同款日历热力图

应粉丝要求&#xff0c;出一个类似于github热图的日历热力图&#xff0c;大概长这样&#xff1a; 依旧工具函数放在文末&#xff0c;如有bug请反馈并去gitee下载更新版。 使用教程 使用方式有以下几种会慢慢讲到&#xff1a; heatmapDT(Year,T,V)heatmapDT(Year,T,V,MonLim)h…

数据结构|链表

概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。单链表的形式就像一条铁链环环相扣它与顺序表最大的不同是&#xff0c;单链表的数据存储是在不连续的空间&#xff0c;存储的数据里面含有…

Stable Diffusion WebUI本地部署中遇到的一些错误

进来AI绘画大火&#xff0c;我便尝试在本地部署一下&#xff0c;电脑是M1的MacBook&#xff0c;不过windows应该也差不多。 参考官网的方法一步步安装&#xff0c;虽然最后成功了&#xff0c;但中途还是有不少问题。 首先安装homebrew&#xff0c;由于我早就已经安装好了&#…

前端项目上线后,浏览器缓存未刷新问题

文章目录问题背景一、解决办法二、实现原理关于缓存强缓存协商缓存刷新页面对浏览器的影响总结问题背景 前端页面开发测试完&#xff0c;要进行上线&#xff0c;某些页面上传更新到服务器之后&#xff0c;浏览器并没有更新&#xff0c;渲染的还是老页面。这是因为浏览器读了缓存…

es6 new Promise

Promise 是一个构造函数&#xff0c;本身身上有 all、reject、resolve 这几个方法&#xff0c;原型上有 then、catch 等方法。所以 Promise new 出来的对象确定就有 then、catch 方法。Promise 的构造函数接收一个参数&#xff0c;是函数&#xff0c;而且传入两个参数&#xff…

基于神经网络的自监督学习方法音频分离器(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 神经网络的输入是混合&#xff08;男性女性&#xff09;音频的振幅谱。神经网络的输出目标是男性说话者理想的软掩模。损失函数…

七,iperf3源代码分析:状态机及状态转换过程--->运行正向TCP单向测试时的服务端代码

本文目录一、测试用命令二、iperf3状态机中各个状态解析三、iperf3状态机迁移分析K-初始化测试对象&#xff08;NA--->初始化状态&#xff09;:A-服务器端测试对象开始运行&#xff08;初始化状态--->IPERF_START状态&#xff09;:B-建立控制连接&#xff08;初始化状态-…

论文公式符号规范

参考自1&#xff0c;记录论文公式的符号规范&#xff1a; 1.变量和公式符号表达 物理量 物理量符号用英文斜体字母或希腊斜体字母&#xff0c;表示物理量大小用数字加单位&#xff0c;单位使用正体。 例如&#xff1a; m10.05gx10.12ζ35.36mVm10.05 \mathrm{~g} \quad x10…

elasticsearch高级篇:核心概念和实现原理

1.elasticsearch核心概念1.1 索引(index)一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&#xff0c;另一个产品目录的索引&#xff0c;还有一个订单数据的索引。一个索引由一个名字来标识&#xff08;必须全部是小写字母&#…

分布式数据库稳定性资料整理

这篇文章所讲的事情 初探分布式数据库这种有状态服务是如何保证系统的高可用的&#xff0c;可能会有勘误&#xff0c;欢迎指导。 正文 分布式数据库在说高可用的时候&#xff0c;主要是在讲宕机和网络分区时&#xff0c;系统的高可用如何保证&#xff0c;这点和我们在线上应…

【页面无响应】Web页面经常无响应前端如何定位与优化(已解決)

【写在前面】客户现场应用我们的系统时候&#xff0c;发现用着用着就出现1个页面无响应现象&#xff0c;给客户带来极其不好的体验&#xff0c;尤其是当重要工作汇报演示时&#xff0c;就给我看无响应&#xff0c;浏览器崩溃&#xff1f;这样对产品的发展无疑是致命的伤&#x…