【Apache Doris 深度实战:从 MPP 架构到实时分析,解锁三大数据模型的性能优化秘籍】

一、安装部署

安装教程:GitHub地址
Doc文档:Apache Doris 简介 - Apache Doris

二、功能及作用

  • Apache Doris 是一款基于MPP 架构的高性能、实时分析型数据库。它以高效、简单和统一的特性著称,能够在亚秒级的时间内返回海量数据的查询结果。Doris 既能支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。
  • 基于这些优势,Apache Doris 非常适合用于报表分析、即席查询、统一数仓构建、数据湖联邦查询加速等场景。用户可以基于 Doris 构建大屏看板、用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用,适合处理结构化数据
    三、整体架构
    Apache Doris 使用 MySQL 协议,与 MySQL 语法高度兼容,并支持标准 SQL。用户可以通过各种客户端工具访问 Apache Doris,它与BI工具无缝集成
  • Frontend(FE):主要负责用户请求的接入、查询解析规划、元数据的管理、节点管理相关工作
    • Master节点:负责元数据的读写。当 Master 节点的元数据发生变更后,会通过 BDB JE 协议同步给 Follower 或 Observer 节点
    • Follower节点:负责读取元数据。当 Master 节点发生故障时,可以选取一个 Follower 节点作为新的 Master 节点
    • Observer节点:负责读取元数据,主要目的是增加集群的查询并发能力。Observer 节点不参与集群的选主过程
  • Backend(BE):主要负责数据存储、查询计划的执行
    [图片]

四、数据表设计

1. 数据模型

Doris 中建表时需要指定表模型,以定义数据存储与管理方式。在 Doris 中提供了明细模型聚合模型以及主键模型三种表模型,可以应对不同的应用场景需求。

  • 明细模型(Duplicate Key Model)(默认):允许指定的 Key 列重复,Doirs 存储层保留所有写入的数据,适用于必须保留所有原始数据记录的情况
  • 主键模型(Unique Key Model):每一行的 Key 值唯一,可确保给定的 Key 列不会存在重复行,Doris 存储层对每个 key 只保留最新写入的数据,适用于数据更新的情况;
  • 聚合模型(Aggregate Key Model):可根据 Key 列聚合数据,Doris 存储层保留聚合后的数据,从而可以减少存储空间和提升查询性能;通常用于需要汇总或聚合信息(如总数或平均值)的情况。

1.1 明细模型(Duplicate Key Model)

一般明细模型中的数据只进行追加,旧数据不会更新。明细模型适用于需要存储全量原始数据的场景:如日志存储、用户行为数据、交易数据。

1.1.1 建表

在建表时,可以通过 DUPLICATE KEY 关键字指定明细模型。明细表必须指定数据的 Key 列,用于在存储时对数据进行排序。下例的明细表中存储了日志信息,并针对于 log_time、log_type 及 error_code 三列进行了排序:

CREATE TABLE IF NOT EXISTS example_tbl_duplicate
(log_time    DATETIME  NOT NULL,log_type    INT       NOT NULL,error_code  INT,error_msg   VARCHAR(1024),op_id       BIGINT,op_time     DATETIME
)
ENGINE = OLAP --指定使用 Doris 的 OLAP 引擎,支持高效数据分析
==DUPLICATE KEY(log_time, log_type, error_code) --log_time, log_type, error_code作为排序键,优化按时间和类型的查询
DISTRIBUTED BY HASH(log_type) BUCKETS 10 --按log_type字段进行哈希分桶、创建 10 个数据桶
PROPERTIES ("replication_num" = "1" -- 将副本数设置为1,与可用后端节点数匹配
);

1.1.2 数据插入与存储

-- 4 rows raw data
INSERT INTO example_tbl_duplicate VALUES
('2024-11-01 00:00:00', 2, 2, 'timeout', 12, '2024-11-01 01:00:00'),
('2024-11-02 00:00:00', 1, 2, 'success', 13, '2024-11-02 01:00:00'),
('2024-11-03 00:00:00', 2, 2, 'unknown', 13, '2024-11-03 01:00:00'),
('2024-11-04 00:00:00', 2, 2, 'unknown', 12, '2024-11-04 01:00:00');-- insert into 2 rows
INSERT INTO example_tbl_duplicate VALUES
('2024-11-01 00:00:00', 2, 2, 'timeout', 12, '2024-11-01 01:00:00'),
('2024-11-01 00:00:00', 2, 2, 'unknown', 13, '2024-11-01 01:00:00');-- check the rows of table
SELECT * FROM example_tbl_duplicate;
  • 结果如下:

明细模型默认存储排序
[图片]

ORDER BY 显式排序
[图片]

  • 不同于直接SELECT * FROM example_tbl_duplicate ORDER BY log_time, log_type, error_code;默认查询是 “底层存储顺序的直接呈现”(受分桶、写入等影响),ORDER BY 是 “结果集的强制重排” 。

1.2 主键模型(Unique Key Model)

需要更新数据时,可以选择主键模型(Unique Key Model)。该模型保证 Key 列的唯一性,插入或更新数据时,新数据会覆盖具有相同 Key 的旧数据,确保数据记录为最新。与其他数据模型相比,主键模型适用于数据的更新场景,在插入过程中进行主键级别的更新覆盖。如高频数据更新、数据高效去重以及需要部分列更新的场景。

1.3 实现方式

1.3.1 写时合并(默认)

数据在写入时立即合并相同 Key 的记录,确保存储的始终是最新数据。写时合并兼顾查询和写入性能,避免多个版本的数据合并,并支持谓词下推到存储层。大多数场景推荐使用此模式;

CREATE TABLE IF NOT EXISTS example_tbl_unique
(user_id         LARGEINT        NOT NULL,user_name       VARCHAR(50)     NOT NULL,city            VARCHAR(20),age             SMALLINT,sex             TINYINT
)
UNIQUE KEY(user_id, user_name)
DISTRIBUTED BY HASH(user_id) BUCKETS 10
PROPERTIES ("enable_unique_key_merge_on_write" = "true", --指定写时合并模式"replication_num" = "1"
);

1.3.2 读时合并(老版本)

在 1.2 版本前,Doris 中的主键模型默认使用读时合并模式,数据在写入时并不进行合并,以增量的方式被追加存储,在 Doris 内保留多个版本。查询或 Compaction 时,会对数据进行相同 Key 的版本合并。读时合并适合写多读少的场景,在查询是需要进行多个版本合并,谓词无法下推,可能会影响到查询速度。

CREATE TABLE IF NOT EXISTS example_tbl_unique_read
(user_id         LARGEINT        NOT NULL,user_name       VARCHAR(50)     NOT NULL,city            VARCHAR(20),age             SMALLINT,sex             TINYINT
)
UNIQUE KEY(user_id, user_name)
DISTRIBUTED BY HASH(user_id) BUCKETS 10
PROPERTIES ("enable_unique_key_merge_on_write" = "true", --指定写时合并模式"replication_num" = "1"
);

1.3.3 数据插入与存储

INSERT INTO example_tbl_unique_write VALUES
(101, 'Tom', 'BJ', 26, 1),
(101,'cat,'BJ', 26, 1),
(102, 'Jason', 'BJ', 27, 1),
(103, 'Juice', 'SH', 20, 2),
(104, 'Olivia', 'SZ', 22, 2);-- insert into data to update by key
INSERT INTO example_tbl_unique_write VALUES
(101, 'Tom', 'BJ', 27, 1),
(102, 'Jason', 'SH', 28, 1);-- check updated data
SELECT * FROM example_tbl_unique_write;
  • 结果如下:
    在这里插入图片描述

1.4 聚合模型(Aggregate Key Model)

Doris 的聚合模型专为高效处理大规模数据查询中的聚合操作设计。它通过预聚合数据,减少重复计算,提升查询性能。聚合模型只存储聚合后的数据,节省存储空间并加速查询。用于对明细数据进行汇总以及不需要查询原始明细数据。

1.4.1 原理

每一次数据导入会在聚合模型内形成一个版本,在 Compaction 阶段进行版本合并,在查询时会按照主键进行数据聚合:

  1. 数据导入阶段:数据按批次导入,每批次生成一个版本,并对相同聚合键的数据进行初步聚合(如求和、计数);
  2. 后台文件合并阶段(Compaction):多个版本文件会定期合并,减少冗余并优化存储;
  3. 查询阶段:查询时,系统会聚合同一聚合键的数据,确保查询结果准确。

1.4.2 建表

CREATE TABLE IF NOT EXISTS example_tbl_agg
(user_id             LARGEINT    NOT NULL,load_dt             DATE        NOT NULL,city                VARCHAR(20),last_visit_dt       DATETIME    REPLACE DEFAULT "1970-01-01 00:00:00",cost                BIGINT      SUM DEFAULT "0",max_dwell           INT         MAX DEFAULT "0",
)
AGGREGATE KEY(user_id, load_dt, city)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;
PROPERTIES ("replication_num" = "1"
);

1.4.3 聚合函数

聚合方式描述
SUM求和,多行的 Value 进行累加。
REPLACE替代,下一批数据中的 Value 会替换之前导入过的行中的 Value。
MAX保留最大值。
MIN保留最小值。
REPLACE_IF_NOT_NULL非空值替换。与 REPLACE 的区别在于对 null 值,不做替换。
HLL_UNION HLL类型的列的聚合方式,通过 HyperLogLog 算法聚合。
BITMAP_UNION BITMAP类型的列的聚合方式,进行位图的并集聚合。

1.4.4 数据插入与存储

在聚合表中,数据基于主键进行聚合操作。数据插入后及完成聚合操作。

-- 4 rows raw data
INSERT INTO example_tbl_agg VALUES
(101, '2024-11-01', 'BJ', '2024-10-29', 10, 20),
(102, '2024-10-30', 'BJ', '2024-10-29', 20, 20),
(101, '2024-10-30', 'BJ', '2024-10-28', 5, 40),
(101, '2024-10-30', 'SH', '2024-10-29', 10, 20);-- insert into 2 rows
INSERT INTO example_tbl_agg VALUES
(101, '2024-11-01', 'BJ', '2024-10-30', 20, 10),
(102, '2024-11-01', 'BJ', '2024-10-30', 10, 30);-- check the rows of table
SELECT * FROM example_tbl_agg;
+---------+------------+------+---------------------+------+----------------+
| user_id | load_date  | city | last_visit_date     | cost | max_dwell_time |
+---------+------------+------+---------------------+------+----------------+
| 102     | 2024-10-30 | BJ   | 2024-10-29 00:00:00 |   20 |             20 |
| 102     | 2024-11-01 | BJ   | 2024-10-30 00:00:00 |   10 |             30 |
| 101     | 2024-10-30 | BJ   | 2024-10-28 00:00:00 |    5 |             40 |
| 101     | 2024-10-30 | SH   | 2024-10-29 00:00:00 |   10 |             20 |
| 101     | 2024-11-01 | BJ   | 2024-10-30 00:00:00 |   30 |             20 |
+---------+------------+------+---------------------+------+----------------+

1.5注意

  • 建表时列类型建议
  1. Key 列必须在所有 Value 列之前。
  2. 尽量选择整型类型。因为整型类型的计算和查找效率远高于字符串。
  3. 对于不同长度的整型类型的选择原则,遵循够用即可。
  4. 对于 VARCHAR 和 STRING 类型的长度,遵循够用即可。

1.6自增列

要使用自增列,需要在建表CREATE-TABLE时为对应的列添加AUTO_INCREMENT属性。若要手动指定自增列起始值,可以通过建表时AUTO_INCREMENT(start_value)语句指定,如果未指定,则默认起始值为 1。

CREATE TABLE `demo`.`tbl` (`id` BIGINT NOT NULL AUTO_INCREMENT,`value` BIGINT NOT NULL
) ENGINE=OLAP
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

2. 数据类型 - Apache Doris

  • 数值类型
    BOOLEAN
    TINYINT
    SMALLINT
    INT
    BIGINT
    LARGEINT
    FLOAT
    DOUBLE
    DECIMAL
  • 日期类型
    DATE
    DATETIME
  • 字符串类型
    CHAR
    VARCHAR
    STRING
  • 半结构类型
    ARRAY
    MAP
    STRUCT
    JSON
    VARIANT
  • 聚合类型
    HLL
    BITMAP
    QUANTILE_STATE
    AGG_STATE
  • IP类型
    IPv4
    IPv6
    具体内容可观看doc文档

3. 数据压缩

Doris 采用 列式存储 模型来组织和存储数据,这种存储模型特别适合分析型负载,能够显著提高查询效率。在列式存储中,表的每一列会独立存储,这为压缩技术的应用提供了便利,从而提高了存储效率。Doris 提供多种压缩算法,用户可以根据工作负载的需求,选择合适的压缩方式来优化存储和查询性能。

  • 选择合适的压缩算法需根据工作负载特性:
    • 对于 高性能实时分析 场景,推荐使用 LZ4 或 Snappy。
    • 对于 存储效率优先 的场景,推荐使用 ZSTD 或 Zlib。
    • 对于需要兼顾速度和压缩率的场景,可选择 LZ4F。
    • 对于 归档或冷数据存储 场景,建议使用 Zlib 或 LZ4HC。
CREATE TABLE example_table (id INT,name STRING,age INT
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES ("compression" = "zstd", --使用zstd压缩算法"replication_num" = "1"
);

4. 变更表结构(Schema)

用户可以通过Alter Table 操作来修改 Doris 表的 Schema。Schema 变更主要涉及列的修改和索引的变化。
ALTER TABLE [database.]table alter_clause;

特性轻量级 Schema Change重量级 Schema Change
执行速度秒级(几乎实时)分钟级、小时级、天级(依赖表的数据量,数据量越大,执行越慢)
是否需要数据重写不需要需要,涉及数据文件的重写
系统性能影响影响较小可能影响系统性能,尤其是在数据转换过程中
资源消耗较低较高,会占用计算资源重新组织数据,过程中涉及到的表的数据占用的存储空间翻倍。
操作类型增加、删除 Value 列,修改列名,修改 VARCHAR 长度修改列的数据类型、更改主键、修改列的顺序等
  1. 修改列名称
    ALTER TABLE [database.]table RENAME COLUMN old_column_name new_column_name;
  2. 添加一列
  • 聚合模型如果增加 Value 列,需要指定 agg_type。
    首先建表
-- 1.建表
CREATE TABLE IF NOT EXISTS schema_my_table(col1 int,col2 int,col3 int,col4 int SUM,col5 varchar(32) REPLACE DEFAULT "abc"
) AGGREGATE KEY(col1, col2, col3)
DISTRIBUTED BY HASH(col1) BUCKETS 10; #分桶算法:Hash 分桶语法、Random 分桶语法
PROPERTIES ("replication_num" = "1"
);

第二步:向schema_my_table 的 col1 后添加一个 Key 列 key_col
ALTER TABLE example_db.my_table ADD COLUMN key_col INT DEFAULT "0" AFTER col1;
第三步:向 schema_my_table 的 col4 后添加一个 Value 列 value_colSUM 聚合类型
ALTER TABLE example_db.my_table ADD COLUMN value_col INT SUM DEFAULT "0" AFTER col4;

  • 非聚合模型(如 DUPLICATE KEY)如果增加 Key 列,需要指定 KEY 关键字。
-- 1.建表
CREATE TABLE IF NOT EXISTS test.schema_my_table(col1 int,col2 int,col3 int,col4 int,col5 int
) DUPLICATE KEY(col1, col2, col3)
DISTRIBUTED BY RANDOM BUCKETS 10
PROPERTIES ("replication_num" = "1"
);

第二步:向schema_my_table 的 col1 后添加一个 Key 列 key_col
ALTER TABLE schema_my_table ADD COLUMN key_col INT KEY DEFAULT "0" AFTER col1;
第三步:向 schema_my_table 的 col4 后添加一个 Value 列 value_col
ALTER TABLE schema_my_table ADD COLUMN value_col INT DEFAULT "0" AFTER col4;
3. 添加多列

  • 聚合模型如果增加 Value 列,需要指定 agg_type
    ALTER TABLE example_db.my_table ADD COLUMN (c1 INT DEFAULT "1", c2 FLOAT SUM DEFAULT "0");
  • 聚合模型如果增加 Key 列,需要指定 KEY 关键字
  1. 删除列
    ALTER TABLE example_db.my_table DROP COLUMN col4;
  2. 修改列类型
    ALTER TABLE example_db.my_table MODIFY COLUMN col1 BIGINT KEY DEFAULT "1" AFTER col2;
  3. 重新排序
    ALTER TABLE example_db.my_table ORDER BY (k3,k1,k2,k4,v2,v1);

五、测试

5.1 Star Schema Benchmark

Star Schema Benchmark(SSB) 是一个轻量级的数仓场景下的性能测试集。SSB 基于 TPC-H 提供了一个简化版的星型模型数据集,主要用于测试在星型模型下,多表关联查询的性能表现。另外,业界内通常也会将 SSB 打平为宽表模型(以下简称:SSB flat),来测试查询引擎的性能。

# 执行以下脚本下载并编译 ssb-tools 工具。
./bin/build-ssb-dbgen.sh# 生成 SSB 测试集
./bin/gen-ssb-data.sh -s 100 # 生成 100GB 数据量的表结构# 建表
./bin/create-ssb-tables.sh -s 100# SSB 测试集所有数据导入及 SSB FLAT 宽表数据合成并导入到表里。
./bin/load-ssb-data.sh# 执行SSB查询
./bin/run-ssb-queries.sh#或者要执行宽表查询 flat queries
./bin/run-ssb-flat-queries.sh

普通查询结果
[图片]

宽表查询结果
[图片]

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

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

相关文章

MySQL主从复制与读写分离概述

前言: 在数据驱动的现代应用中,数据库面临高并发读写与海量存储的双重挑战。单一数据库实例在性能、可用性及扩展性上逐渐成为瓶颈。MySQL主从复制(Master-Slave Replication)与读写分离(Read/Write Splitting&#xf…

数据库-元数据表

1. 什么是元数据表元数据:数据的数据,用以描述数据的信息也是数据,被称为元数据2. 获取元数据的方法MySQL提供了以下三种方法用于获取数据库对象的元数据:show语句从INFORMATION_SCHEMA数据库里查询相关表(information…

【STM32】通用定时器PWM

STM32 通用定时器 PWM 输出完全解析(以 TIM3_CH1 为例) PWM 输出基本原理 PWM(Pulse Width Modulation)即脉冲宽度调制,是由定时器通过比较 CNT 与 CCR 寄存器实现的。 信号产生原理: ARR 决定周期&#…

python学习打卡:DAY 21 常见的降维算法

知识点回顾: LDA线性判别PCA主成分分析t-sne降维 还有一些其他的降维方式,也就是最重要的词向量的加工,我们未来再说 浙大疏锦行

基于SpringBoot和Leaflet集成在线天气服务的区县当前天气WebGIS实战

目录 前言 一、需求描述 1、功能需求 2、技术实现流程 二、SpringBoot后台实现 1、控制层实现 2、区县数据返回 三、WebGIS前端实现 1、区位信息展示 2、天气信息展示 四、成果展示 1、魔都上海 2、蜀地成都 3、湖南桂东 五、总结 前言 在当今数字化时…

文心开源:文心大模型4.5系列全面开放,AI普惠时代加速到来

一场由4240亿参数模型领衔的开源盛宴,正在重塑中国AI生态的底层逻辑 2025年6月30日,百度如约宣布全面开源其旗舰产品——文心大模型4.5系列。一次性开源10款模型,覆盖从4240亿参数的MoE多模态巨无霸到轻巧的0.3B端侧模型,并同步开…

【运算放大器专题】基础篇

1.1 运算放大器是放大了个寂寞吗?—初识运算放大器 为了解决震荡问题,人为加了一些补偿网络之后导致的高频特性差 1.2欧姆定律和独立源 1正弦2方波3脉冲 电压源是平行于i轴的横线 1.3有伴源和运放缓冲器 有伴指的是有电阻,有伴是坏事&#…

英伟达 jetson nano 从NFS启动,使用英伟达提供的rootfs根文件系统

0、目标 为了方便驱动阶段的开发,并且使用英伟达提供的上层应用,这里希望使jetson nano 从NFS启动,同时使用英伟达提供的rootfs根文件系统。 1、硬件准备 确保jetson nano 板子和开发主机之间使用网线进行连接(保持板子和开发主…

广州华锐互动:以创新科技赋能教育,开启沉浸式学习​

在教育领域,广州华锐互动致力于打破传统教学的局限性,为师生们带来全新的沉浸式学习体验。广州华锐互动通过开发 VR 虚拟教学课件,将抽象的知识转化为生动、逼真的虚拟场景,让学生能够身临其境地感受知识的魅力 。比如在历史课上&…

Grok 4 最新技术评测与发布指南

TL;DR:马斯克跳过Grok 3.5直接发布Grok 4,计划在7月4日后上线,专注编程模型优化,这次"极限迭代"能否让马斯克在AI军备竞赛中翻盘? 📋 文章目录 🚀 Grok 4发布概况🏆 Grok…

为什么音视频通话需要边缘加速

⏩ 主要原因 ✅ 降低传输延迟 用户与边缘节点之间通常1-2跳即可完成连接,避免跨国、跨运营商长链路传输 保障音视频信令、媒体流快速到达,控制端到端延迟 ✅ 提升弱网环境下的连接稳定性 边缘节点具备链路优化、丢包补偿、转发中继功能 即使在WiFi切…

小架构step系列05:Springboot三种运行模式

1 概述 前面搭建工程的例子,运行的是一个桌面程序,并不是一个Web程序,在这篇中我们把它改为Web程序,同时从启动角度看看它们的区别。 2 Web模式 2.1 桌面例子 回顾一下前面的例子,其pom.xml的配置如下:…

LoRaWAN的设备类型有哪几种?

LoRaWAN(Long Range Wide Area Network)是一种专为物联网(IoT)设备设计的低功耗、长距离通信协议。它根据设备的功能和功耗需求,将设备分为三种类型:Class A、Class B 和 Class C。每种设备类型都有其独特的…

三维目标检测|Iou3D 代码解读一

本文对OpenPCDet项目中的iou3d模块中的iou3d_nms_kernel.cu代码进行解读,本次解决的函数是box_overlap,它的输入是两个包围盒,输出是两个包围盒在bev下的重叠面积,计算流程是 确定box_a和box_b的四个角落坐标 从包围盒中提取坐标值…

探索实现C++ STL容器适配器:优先队列priority_queue

前引: 在算法竞赛中,选手们常常能在0.01秒内分出胜负;在实时交易系统中,毫秒级的延迟可能意味着数百万的盈亏;在高并发服务器中,每秒需要处理数万条不同优先级的请求——这些系统背后,都隐藏着同…

一、Dify 私有部署、本地安装教程(LInux-openeuler)

官网:Dify AI Plans and Pricing 1.找到下载的位置。 2.可以切换文档为中午文档。 3.本次安装使用Docker Compose 安装,可以大致看一下文档描述的配置信息要求。 4.各个版本信息,本次下载1.5.1版本,你也可以选择安装其他版本。 …

GASVM+PSOSVM+CNN+PSOBPNN+BPNN轴承故障诊断

一、各算法基本原理与技术特点 1. GASVM(遗传算法优化支持向量机) 原理: 利用遗传算法(GA)优化SVM的超参数(如惩罚因子 C C C 和核函数参数 g g g)。遗传算法通过模拟自然选择机制&#xff…

Python实例练习---魔法方法

(主页有对应知识点^V^) 【练习要求】 针对知识点Python面向对象的魔法方法安排的本实例。要求实现:用__init__魔法方法定义书的长,宽,高,最后用__str__输出返回值 【重要步骤提示】 定义class书类 2、使…

【从0-1的CSS】第3篇:盒子模型与弹性布局

文章目录 盒子模型内容区content内边距padding边框border外边距margin元素的宽度高度box-sizing属性content-box:设置的width和height就是内容区的width和heightborder-box:设置的width和height是context padding border的width和height 弹性布局Flex容器的属性fl…

设置LInux环境变量的方法和区别_Ubuntu/Centos

Linux环境变量可以通过export实现,也可以通过修改几个文件来实现 1 通过文件设置LInux环境变量 首先是设置全局环境变量,对所有用户都会生效 /etc/profile:该文件为系统的每个用户设置环境信息,当用户登录时,该文件…