【Hive 01】简介、安装部署、高级函数使用

news2024/11/26 23:17:57

1 Hive简介

1.1 Hive系统架构

Hive系统架构

  • Hive是建立在 Hadoop上的数据仓库基础构架,它提供了一系列的工具,可以进行数据提取、转化、加载( ETL )
  • Hive定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户直接查询Hadoop中的数据
  • Hive包含SQL解析引擎,它会将SQL语句转译成MR Job,然后在Hadoop中执行
  • Hive的数据存储基于Hadoop的HDFS
  • Hive没有专门的数据存储格式,默认可以直接加载文本文件TextFile,还支持SequenceFile、RCFile等

1.2 Metastore

  • Metastore是Hive元数据的集中存放地
  • 元数据包括表的名字,表的列和分区及其属性,表的数据所在目录等
  • Metastore默认使用内嵌的Derby数据库作为存储引擎,推荐使用Mysql数据库作为外置存储引擎

1.3 Hive与MySQL对比

HiveMySQL
数据存储位置HDFS本地磁盘
数据格式用户决定系统决定
数据更新不支持支持
索引有,但较弱
执行MapReduceExecutor
执行延迟
可扩展性
数据规模

2 Hive安装部署

访问Hive官方网站,下载apache-hive-3.1.2-bin.tar.gz安装包,在/data/soft目录下解压文件。

2.1 配置hive-env.sh

cd apache-hive-3.1.2-bin/conf/
mv hive-env.sh.template hive-env.sh

在文件末尾添加以下内容:

export JAVA_HOME=/home/gdan/data/jdk-8u131-linux-x64/jdk1.8.0_131
export HIVE_HOME=/home/gdan/data/soft/apache-hive-3.1.2-bin
export HADOOP_HOME=/home/gdan/data/soft/hadoop-3.2.0

再/etc/profile也需要设置hive的环境变量

export HIVE_HOME=/home/gdan/data/soft/apache-hive-3.1.2-bin
export PATH=$HIVE_HOME/bin:$PATH

2.2 安装mysql数据库,并创建hive库

1.安装MySQL 在终端中输入以下命令来安装MySQL:

sudo apt-get update
sudo apt-get install mysql-server

        安装过程中会提示您设置MySQL的root用户密码,请根据提示进行设置。

安装时没有提示输入root账户密码,默认是空,可以执行以下命令设置密码为xxxx

sudo mysql -u root -p  #密码按Enter即可进入mysql shell,空格也可以,普通用户一定sudo

2. 创建hive元数据数据库

create database hive;

2.3 配置hive-site.xml

cd apache-hive-3.1.2-bin/conf/
mv hive-default.xml.template hive-site.xml

 在文件中添加以下内容:

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?serverTimezone=Asia/Shanghai</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>admin</value>
</property>
<property>
    <name>hive.querylog.location</name>
    <value>/data/hive_repo/querylog</value>
</property>
<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/data/hive_repo/scratchdir</value>
</property>
<property>
    <name>hive.downloaded.resources.dir</name>
    <value>/data/hive_repo/resources</value>
</property>

给定的代码片段是Hive的配置文件,用于配置连接到MySQL数据库的相关属性。具体解释如下:

  1. javax.jdo.option.ConnectionURL:指定连接到MySQL数据库的URL。在这个例子中,URL为jdbc:mysql://localhost:3306/hive?serverTimezone=Asia/Shanghai,表示连接到本地的MySQL数据库,端口为3306,数据库名为hive,使用Asia/Shanghai时区。

  2. javax.jdo.option.ConnectionDriverName:指定用于连接到Hive数据库的JDBC驱动程序的类名。在这个例子中,驱动程序的类名为com.mysql.cj.jdbc.Driver,表示使用MySQL的JDBC驱动程序。

  3. javax.jdo.option.ConnectionUserName:指定连接到Hive数据库时使用的用户名。在这个例子中,用户名为root

  4. javax.jdo.option.ConnectionPassword:指定连接到Hive数据库时使用的密码。在这个例子中,密码为admin

  5. hive.querylog.location:指定查询日志的存储位置。在这个例子中,查询日志存储在/data/hive_repo/querylog目录中。

  6. hive.exec.local.scratchdir:指定本地临时文件的存储位置。在这个例子中,临时文件存储在/data/hive_repo/scratchdir目录中。

  7. hive.downloaded.resources.dir:指定下载资源的存储位置。在这个例子中,下载的资源存储在/data/hive_repo/resources目录中。

这些属性用于配置连接到Hive数据库的相关参数,并定义了查询日志、临时文件和下载资源的存储位置。

 2.4 修改Hadoop的etc/hadoop/core-site.xml文件

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

给定的代码片段是Hadoop的配置文件,用于配置代理用户的相关属性。具体解释如下:

  1. hadoop.proxyuser.root.hosts:指定可以通过代理用户root进行访问的主机列表。在这个例子中,*表示允许所有主机通过root用户进行访问。

  2. hadoop.proxyuser.root.groups:指定可以通过代理用户root进行访问的用户组列表。在这个例子中,*表示允许所有用户组通过root用户进行访问。

这些属性用于配置Hadoop代理用户的访问权限,允许指定的主机和用户组通过指定的代理用户进行访问。

  2.5 初始化Hive的Metastore

cd /data/soft/apache-hive-3.1.2-bin
bin/schematool -dbType mysql -initSchema

 一直出现这种问题

后来发现是环境问题,回去更改 hive-env.sh 文件

再继续执行,又报错了

at [row,col,system-id]: [3215,96

需要删除3215行里面的description,把hive.txn.xlock.iow对应的description标签内容删掉。

又开始报错

 此外还需要下载mysql jdbc 的jar包

去官网下载,把jar包放进hive的lib文件夹下

 去mysql创建用户

 使用的是mysql8.0版本,所以正确代码是:

create user 'dw'@'localhost' identified by '123456'; -- 创建用户
grant all on *.* to 'dw'@'localhost'; -- 将所有数据库的所有表的所有权限赋给datawhale
flush privileges;  -- 刷新mysql系统权限关系表

 注意不要use hive

 检查hive是否成功部署

3 Hive使用

 创建数据库

hive
create database hive;

3.1 创建数据表

create table t3_new(
  id int comment 'ID',
  stu_name string comment 'name' ,
  stu_birthday date comment 'birthday',
  online boolean comment 'is onlone'
)row format delimited 
fields terminated by '\t' 
lines terminated by '\n';

 hdfs文件系统中的存储位置如下:

 

 "hadoop fs -ls /" 是一个 Hadoop 命令,用于列出 Hadoop 分布式文件系统(HDFS)根目录下的文件和目录。

具体解释如下:

  • "hadoop": 这是 Hadoop 命令行工具的名称。
  • "fs": 表示要执行与文件系统相关的操作。
  • "-ls": 是一个选项,表示要列出指定路径下的文件和目录。
  • "/": 这是 HDFS 的根目录路径。

因此,运行 "hadoop fs -ls /" 命令将返回 HDFS 根目录下的所有文件和目录的列表。

3.2 创建带Array的表

create table stu(
  id int,
  name string,
  favors array<string>
)row format delimited 
fields terminated by '\t'
collection items terminated by ','
lines terminated by '\n';

3.3 创建带Map的表

create table stu2(
  id int,
  name string,
  scores map<string,int>
)row format delimited 
fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n';

3.4 加载数据到表中

加载数据到表中属于DML操作,这里为了方便大家测试,先简单介绍一下加载本地数据到表中的命令,命令如下:

load data local inpath '/home/gdan/data/soft/hivedata/stu3.data' into table emp;

其中stu3.data的内容如下:

7369	SMITH	CLERK	7902	1980-12-17 00:00:00	800.00		20
7499	ALLEN	SALESMAN	7698	1981-02-20 00:00:00	1600.00	300.00	30
7521	WARD	SALESMAN	7698	1981-02-22 00:00:00	1250.00	500.00	30
7566	JONES	MANAGER	7839	1981-04-02 00:00:00	2975.00		20
7654	MARTIN	SALESMAN	7698	1981-09-28 00:00:00	1250.00	1400.00	30
7698	BLAKE	MANAGER	7839	1981-05-01 00:00:00	2850.00		30
7782	CLARK	MANAGER	7839	1981-06-09 00:00:00	2450.00		10
7788	SCOTT	ANALYST	7566	1987-04-19 00:00:00	1500.00		20
7839	KING	PRESIDENT		1981-11-17 00:00:00	5000.00		10
7844	TURNER	SALESMAN	7698	1981-09-08 00:00:00	1500.00	0.00	30
7876	ADAMS	CLERK	7788	1987-05-23 00:00:00	1100.00		20
7900	JAMES	CLERK	7698	1981-12-03 00:00:00	950.00		30
7902	FORD	ANALYST	7566	1981-12-03 00:00:00	3000.00		20
7934	MILLER	CLERK	7782	1982-01-23 00:00:00	1300.00		10

 

 

3.5 创建桶表

create table bucket_tb(
   id int
)clustered by (id) into 4 buckets;

 注意:需要从普通表中将数据插入到桶表中

3.6 创建视图

create view v1 as select id,stu_name from t3_new;

又开始报错

http://t.csdn.cn/TBkLa

网上的教程也是很多坑,之前说把Hadoop的一个jar包放进Hive里面,其实不需要这个操作。

改回来就可以了

3.7 综合案例

案例需求:通过Flume按天将日志数据采集到HDFS中对应目录,使用SQL按天统计每天的相关指标,数据样例如下:

{
	"uid": "861848974414839801",
	"nickname": "mick",
	"usign": "",
	"sex": 1,
	"birthday": "",
	"face": "",
	"big_face": "",
	"email": "abc@qq.com",
	"mobile": "",
	"reg_type": "102",
	"last_login_time": "1494344580",
	"reg_time": "1494344580",
	"last_update_time": "1494344580",
	"status": "5",
	"is_verified": "0",
	"verified_info": "",
	"is_seller": "0",
	"level": 1,
	"exp": 0,
	"anchor_level": 0,
	"anchor_exp": 0,
	"os": "android",
	"timestamp": 1494344580,
	"type": "user_info"
}

解决方法:

  1. 针对Flume的Source可以使用Exec Source,Channel可以使用基于文件的或者内存的,Sink使用HDFS Sink,在HDFS Sink的Path路径中需要使用%Y%m%d获取日期,将每天的日志数据采集到指定的HDFS目录中。
  2. 需要对按天采集的日志数据建表,由于这份数据可能会被多种计算引擎使用,所以建议使用外部 表。
  3. 在实际工作中,离线计算的需求大部分都是按天计算的,所以在这里最好在表中增加日期这个分区字段,最终决定使用外部分区表。
  4. 针对Json数据,先创建外部分区表,再创建视图,解析Json数据中的字段

如果你要重新启动hive的话,需要把hadoop重新启动一下:

1. 创建分区表

CREATE EXTERNAL TABLE ex_par_more_type (
  log STRING
)
PARTITIONED BY (dt STRING, d_type STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION '/moreType';

这是一个创建外部表的SQL语句,用于创建名为ex_par_more_type的外部表。该表包含一个名为log的列,并照dt和d_type两个分区进行分区。

以下是对每个部分的解释:

  • CREATE EXTERNAL TABLE ex_par_more_type: 创建一个名为ex_par_more_type的外部表。
  • (log string): 定义了一个名为log的列,其数据类型为string。
  • PARTITIONED (dt string, d_type string): 按dt和d_type两个列进行分区。
  • ROW FORMAT DELIMITED: 指定行格式为分隔符格式。
  • FIELDS TERMINATED '\t': 指定字段之间的隔符为制表符('\t')。
  • LOCATION '/moreType': 指定外部表存储位置为/mType。

通过执行这个SQL语句,你可以在指定的存储位置中创建一个外部表ex_par_more_type,该表含一个log列,并按照dt和d_type进行分区。

2. 添加分区

alter table ex_par_more_type add  partition(dt='20200504',d_type='giftRecord') location '/moreType/20200504/giftRecord';

这个命令是用于在表 ex_par_more_type 中添加一个分区。

分区的条件是 dt='20200504'd_type='giftRecord',并且该分区的数据将存储在路径 /moreType/20200504/giftRecord 中。

3. 创建视图

create view gift_record_view as 
select 
    get_json_object(log,'$.send_id') as send_id,
    get_json_object(log,'$.good_id') as good_id,
    get_json_object(log,'$.video_id') as video_id,
    get_json_object(log,'$.gold') as gold,
dt
from ex_par_more_type
where d_type='giftRecord';

4. 创建脚本

#!/bin/bash
# 每天凌晨1点定时添加当天日期的分区
if [ "a$1" = "a" ]
then
 dt=`date +%Y%m%d`
else
 dt=$1
fi
# 指定添加分区操作
hive -e "
alter table ex_par_more_type add if not exists  partition(dt='${dt}',d_type='giftRecord') location '/moreType/${dt}/giftRecord';
alter table ex_par_more_type add if not exists partition(dt='${dt}',d_type='userInfo') location '/moreType/${dt}/userInfo';
alter table ex_par_more_type add if not exists  partition(dt='${dt}',d_type='videoInfo') location '/moreType/${dt}/videoInfo';
"

这是一个Bash脚本,用于在每天凌晨1点定时添加当天日期的分区。

脚本首先检查是否提了命令行参数如果没有提供参数,则使用当前日期作为分区的日期。如果提供了参数,则使用该参数作为分区的日期。

接下来,脚本使用Hive命令执行三个ALTER TABLE语句,用于添加分区。这些语句将在名为"ex_par_more_type"表中添加三个分区,分别对应不同的"d_type"值giftRecord、userInfovideoInfo)。每个分区的位置(location)都基于日期动态生成。

 这些操作将在H中的"ex_par_more_type"表中添加当天日期的个分区,并指定相应的位置。

5. 配置crontab,每天执行一次

00 01 * * * root /bin/bash /data/soft/hivedata/addPartion.sh >> /data/soft/hivedata/addPartion.log

4 Hive高级函数应用

4.1 分组排序取TopN

使用row_number()(对数据编号,从1开始)和over()(把数据划分到一个窗口,加上partition by,按照字段对数据进行分组,使用order by按照字段进行排序)

SELECT *
FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY sub ORDER BY score DESC) AS num
  FROM student_score
) s
WHERE s.num <= 3;

这个查询语句的目的是从名为 "student_score" 的表中选择每个科目("")的前三名学生。使用窗口函数 ROW_NUMBER() 对每个科目的成绩进行降序排列,并为每个分组分配一个行号,外部查询选择行号小等于3的记录即每个科的前三名学生。

  • 可以使用rank()替代row_number(),表示上下两条记录的score相等时,记录的行号是一样的,但下一个score值的行号递增N
  • 可以使用dense_rank()替代row_number(),表示上下两条记录的score相等时,下一个score值的行号递增1

4.2 行转列

concat_ws()(根据指定的分隔符拼接多个字段的值)、
collect_set()(返回一个set集合,集合汇中的元素不重复) 、
collect_list()(返回一个list集合,集合中的元素会重复)

select name,collect_list(favor) as favor_list from student_favors group by name;

4.3 列转行

split()(接受一个字符串和切割规则,就类似于java中的split函数,使用切割规则对字符串中的数据进行切割,最终返回一个array数组)
explode()(表示把数组中的每个元素转成一行)
lateral view(可以对数据产生一个支持别名的虚拟表)

select name,favor_new from student_favors_2 lateral view explode(split(favorlist,',')) table1 as favor_new;

4.4 distribute by

  • ditribute by:只会根据指定的key对数据进行分区,但是不会排序。
  • 一般情况下可以和sort by结合使用,先对数据分区,再进行排序,两者结合使用的时候,distribute by必须要写在sort by之前。

4.5 cluster by

  • cluster by:是distribute bysort by的简写形式,即cluster by id等于distribute by id sort by id

5 应用示例

5.1 解决数据倾斜问题的SQL语句

数据倾斜的根本原因是数据的key分布不均,个别key数据很多,超出了计算节点的计算能力的结果

SELECT a.Key, SUM(a.Cnt) AS Cnt
FROM (
 SELECT Key, COUNT(*) AS Cnt
 FROM TableName GROUP BY Key,
 CASE
 WHEN Key = 'KEY001' THEN Hash(Random()) % 50
 ELSE 0
 END
) a GROUP BY a.Key;

其中CASE WHEN将数据打散,然后再进行GROUP BY

5.2 解决数据倾斜方案

  • 参数调节:hive.groupby.skewindata=true 有数据倾斜的时候进行负载均衡,当选项设定为true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果,按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。

  • SQL语句调节:

    1. 大小表Join:使用map join让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce。
    2. 大表Join大表:把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。
    3. count distinct大量相同特殊值:在count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。
    4. 去重求和:采用sum() group by的方式来替换count(distinct)完成计算。

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

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

相关文章

redux源码阅读总结(一)- createStore.js详细解析与思考

redux数据流分析 在阅读redux源码之前&#xff0c;先整理一下redux的数据流&#xff0c;官网的数据流程图如下所示。该图十分清晰明了的展示了redux的数据流&#xff1a; 点击UI&#xff0c;发起一个存钱的点击事件。在点击事件处理函数中&#xff0c;dispatch分发一个action…

AE 3D粒子插件trapcode particular 新版本

Trapcode Particular for Mac是目前AE系列的插件中最火爆最流行的一款三维粒子插件&#xff0c;是属于Red Giant Trapcode Suite&#xff08;红巨人粒子特效套装插件&#xff09;中的一款粒子插件。该软件提供了多达一百余种粒子效果供用户使用&#xff0c;可以产生各种各样的自…

【算法基础:搜索与图论】3.4 求最短路算法(Dijkstrabellman-fordspfaFloyd)

文章目录 求最短路算法总览Dijkstra朴素 Dijkstra 算法&#xff08;⭐原理讲解&#xff01;⭐重要&#xff01;&#xff09;&#xff08;用于稠密图&#xff09;例题&#xff1a;849. Dijkstra求最短路 I代码1——使用邻接表代码2——使用邻接矩阵 补充&#xff1a;稠密图和稀疏…

(Chrome Ext)谷歌扩展程序-谷歌插件渗透测试方法记录

文章目录 前言一、本地获取谷歌插件/扩展程序源码二、工具化信息收集总结 前言 在工作岗位变更之后&#xff0c;越来越多“奇奇怪怪”的东西要去渗透和测试&#xff0c;在我之前干安服的时候&#xff0c;最多的就是测一下web&#xff0c;极少情况下测测app&#xff0c;但是现在…

信息与通信工程学科面试准备——信息论与编码|保研推免面试题

目录 第一章 绪论 1 信息的概念 1.1 香农对信息的定义 1.2 信息与消息之间的关系&#xff1f; 2 信息的性质 3 信息的分类 4 信息论与编码研究的主要内容 (1)狭义信息论 (2)一般信息论 (3)广义信息论 5 信息论与编码的发展和应用 6 通信系统模型构成 (1)信源 (2)…

微信小程序-----input数据双向绑定

简介&#xff1a; 这里介绍两种获取的方式&#xff1a; 1、用户每输入一个字节就获取一个字节 2、用户全部输入结束了之后&#xff0c;再一起获取整个input输入框的值 注意&#xff1a;第二种方式会比较节省内存资源 第一种方式: 原理&#xff1a;我们使用bindinput事件来获取…

2023年Q2京东洗衣机行业品牌销售排行榜(京东销售数据分析)

鲸参谋电商大数据2023年Q2京东平台“洗衣机”品类完整销售数据榜单出炉&#xff01; 根据鲸参谋电商数据显示&#xff0c;今年Q2京东平台上洗衣机行业的销量超过380万&#xff0c;环比下降19%&#xff0c;同比上升约2%&#xff1b;行业销售额达63亿&#xff0c;环比下降约14%&a…

idea+springboot+jpa+maven+jquery+mysql进销存管理系统源码

ideaspringbootjpamavenjquerymysql进销存管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.首页3.采购订单4.收货入库5. 采购退货6. 商品入库7. 商品出库8. 库存查询9.商品移库10.库存盘点11.销售订单12.发货出库13.销售退货14.商品查询15. 供应商查询16.客户查询…

3.输出printf() 与 输入scanf()

输入 与 输出 1.printf()2.scanf() 1.printf() 1.1 引用条件 printf()函数使用之前必须要引入<stdio.h>这个头文件 1.2 关于换行 printf()在打印的时候不会自动换行&#xff0c;所以各位需要在输出文本的末尾添加转义字符\n&#xff0c;也就是换行符&#xff0c;不然调…

通过Docker启动DB2,并在Spring Boot整合DB2(Druid连接池)

1 简介 DB2是IBM的一款优秀的关系型数据库&#xff0c;简单学习一下。 2 Docker安装DB2 为了快速启动&#xff0c;直接使用Docker来安装DB2。先下载镜像如下&#xff1a; docker pull ibmcom/db2 # or docker pull ibmcom/db2:11.5.0.0 启动数据库如下&#xff1a; docker …

【树上操作】定长裁剪 CF1833 G

Problem - G - Codeforces 题意&#xff1a; 给定一棵n个节点的树&#xff0c;请你减掉一些边&#xff0c;使得剪掉后的每个树只有三个节点&#xff0c; 如果可以&#xff0c;第一行返回减掉边的数量&#xff0c;第二行返回减掉边的编号&#xff1b;如果无解&#xff0c;输出…

opencv 图像腐蚀膨胀 erode dilate

#include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, dst, dstbin, distancetransform,rel, rel2;img imread("m3.jpg");//转为灰度图cvtColor(img, dst, COLOR_BGR2GRAY);//二…

springcloudAlibaba之nacos集群部署和nginx负载均衡

1.环境准备 nacos server安装包&#xff1a;https://github.com/alibaba/nacos nginx安装包&#xff1a;https://nginx.org/en/download.html 2、nacos配置 将下载好的nacos-server的压缩包解压好以后&#xff0c;复制出N份&#xff08;这里取决于你集群的数量&#xff09;&…

AC自动机(java)

AC自动机 AC自动机介绍代码演示 indexTree AC自动机介绍 AC自动机算法是一种基于Trie树和有限状态机的字符串匹配算法。它在查找字符串时&#xff0c;利用额外的失配指针进行回退&#xff0c;转向其他分支&#xff0c;避免重复匹配前缀&#xff0c;从而提高算法效率。当一个字典…

编译内联导致内存泄漏的问题定位修复

作者&#xff1a;0x264 问题 线上长时间存在一个跟异步 inflate 相关的量级较大的内存泄漏&#xff0c;如下所示&#xff1a; 第一次分析 从内存泄漏粗略看有几个信息&#xff1a; 被泄漏的Activity有很多&#xff0c;所以可能跟某个具体业务的关系不大引用链特别短&#xf…

SkyWalking链路追踪中span全解

基本概念 在SkyWalking链路追踪中&#xff0c;Span&#xff08;跨度&#xff09;是Trace&#xff08;追踪&#xff09;的组成部分之一。Span代表一次调用或操作的单个组件&#xff0c;可以是一个方法调用、一个HTTP请求或者其他类型的操作。 每个Span都包含了一些关键的信息&am…

yaml语法详解

#kv #对空格的严格要求十分高 #注入到我们的配置类中 #普通的keyvalue name: qinjiang#对象 student:name: qingjiangage: 3#行内写法 student1: {name: qinjiang,age: 3}#数组 pets:- cat- dog- pigpet: [cat,dog,pig]yaml可以给实体类赋值 person:name: kuangshenage: 19happ…

css——box-sizing属性

含义 盒子模型由四部分构成&#xff0c;外边距(margin), 边框(border),内边距(padding), 内容content box-sizing 就是指定盒子的大小和结构的。 box-sizing: content-box; //默认值 内容真正宽度 设置的宽度box-sizing: border-box; // 内容真正宽度width 设置的width- 左右p…

LabVIEW可重入VI,VI模板和动态VI之间的差异

LabVIEW可重入VI&#xff0c;VI模板和动态VI之间的差异 应该在何时使用可重入VI、模板VI和动态调用VI&#xff1f;这三种类型之间有什么区别&#xff1f; 可重入VI 当想要同时运行同一VI的多个实例时&#xff0c;将使用可重入VI。当VI不可重入时&#xff0c;VI只有一个数据空…

浏览器对跨域请求携带Cookie的方法

文章目录 一、前后端协商配置1.1 前端页面搭建1.2后端服务器搭建 二、配置允许跨域浏览器三、Chrome浏览器安装ModHeader插件 企业开发时会分开发环境、测试环境以及生产环境&#xff0c;但是有的企业开发只有真正发布到线上的生产环境的流程才会严格配置&#xff0c;有的项目开…