大数据技术之 Apache Doris(一)

第 1 章 Doris 简介

1.1 Doris 概述

Apache Doris 由百度大数据部研发(之前叫百度 Palo,2018 年贡献到 Apache 社区后,更名为 Doris ),在百度内部,有超过 200 个产品线在使用,部署机器超过 1000 台,单一 业务最大可达到上百 TB。

Apache Doris 是一个现代化的 MPP(Massively Parallel Processing,即大规模并行处理) 分析型数据库产品。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。

Apache Doris 的分布式架构非常简洁,易于运维,并且可以支持 10PB 以上的超大数据集。

Apache Doris 可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等。

1.2 Doris 架构

Doris 的架构很简洁,只设 FE(Frontend)、BE(Backend)两种角色、两个进程,不依赖于外部组件,方便部署和运维,FE、BE 都可线性扩展。

  • FE(Frontend):存储、维护集群元数据;负责接收、解析查询请求,规划查询计划,调度查询执行,返回查询结果。主要有三个角色:

(1)Leader 和 Follower:主要是用来达到元数据的高可用,保证单节点宕机的情况下,元数据能够实时地在线恢复,而不影响整个服务。

(2)Observer:用来扩展查询节点,同时起到元数据备份的作用。如果在发现集群压力非常大的情况下,需要去扩展整个查询的能力,那么可以加 observer 的节点。observer 不参与任何的写入,只参与读取。

  • BE(Backend):负责物理数据的存储和计算;依据 FE 生成的物理计划,分布式地执行查询。数据的可靠性由 BE 保证,BE 会对整个数据存储多副本或者是三副本。副本数可根据需求动态调整。

  • MySQL Client:Doris 借助 MySQL 协议,用户使用任意 MySQL 的 ODBC/JDBC 以及 MySQL 的客户端,都可以直接访问 Doris。

  • Broker:Broker 为一个独立的无状态进程。封装了文件系统接口,提供 Doris 读取远端存储系统中文件的能力,包括 HDFS,S3,BOS 等。

第 2 章 编译与安装

安装 Doris,需要先通过源码编译,主要有两种方式:使用 Docker 开发镜像编译(推荐)、直接编译。 直接编译的方式,可以参考官网:https://doris.apache.org/zh-CN/installing/compilation.html

2.1 安装 Docker 环境

1)Docker 要求 CentOS 系统的内核版本高于 3.10 ,首先查看系统内核版本是否满足

uname -r

2)使用 root 权限登录系统,确保 yum 包更新到最新

sudo yum update -y 

3)假如安装过旧版本,先卸载旧版本

sudo yum remove docker docker-common docker-selinux docker-engine

4)安装 yum-util 工具包和 devicemapper 驱动依赖

sudo yum install -y yum-utils device-mapper-persistent-data lvm2 

5)设置 yum 源(加速 yum 下载速度)

sudo yum-config-manager --add-repo  https://download.docker.com/linux/centos/docker-ce.repo

如果连接超时,可以使用 alibaba 的镜像源:

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

6)查看所有仓库中所有 docker 版本,并选择特定版本安装,一般可直接安装最新版

yum list docker-ce --showduplicates | sort -r 

7)安装 docker

(1)安装最新稳定版本的方式:

sudo yum install docker-ce -y 
#安装的是最新稳定版本,因为 repo 中默认只开启 stable 仓库

(2)安装指定版本的方式:

sudo yum install <FQPN> -y 
# 例如: 
sudo yum install docker-ce-20.10.14.ce -y 

8)启动并加入开机启动

sudo systemctl start docker #启动 docker 
sudo systemctl enable docker #加入开机自启动 

9)查看 Version,验证是否安装成功

sudo docker version 

若出现 Client 和 Server 两部分内容,则证明安装成功。

2.2 使用 Docker 开发镜像编译

1)下载源码并解压

通过 wget 下载(或者手动上传下载好的压缩包)。

wget https://dist.apache.org/repos/dist/dev/incubator/doris/0.15/0.15.0-rc04/apache-doris-0.15.0-incubating-src.tar.gz

解压到/opt/soft

tar -zxvf apache-doris-0.15.0-incubating-src.tar.gz -C /opt/soft

2)下载 Docker 镜像

sudo docker pull apache/incubator-doris:build-env-for-0.15.0

可以通过以下命令查看镜像是否下载完成。

sudo docker images 

3)挂载本地目录运行镜像

以挂载本地 Doris 源码目录的方式运行镜像,这样编译的产出二进制文件会存储在宿主机中,不会因为镜像退出而消失。同时将镜像中 maven 的 .m2 目录挂载到宿主机目录,以防止每次启动镜像编译时,重复下载 maven 的依赖库。

docker run -it \
-v /opt/software/.m2:/root/.m2 \
-v /opt/software/apache-doris-0.15.0-incubating-src/:/root/apache-doris-0.15.0-incubating-src/ \
apache/incubator-doris:build-env-for-0.15.0

4)在docker容器内,切换到 JDK 8

alternatives --set java java-1.8.0-openjdk.x86_64
alternatives --set javac java-1.8.0-openjdk.x86_64
export JAVA_HOME=/usr/lib/jvm/java-1.8.0

5)准备 Maven 依赖

编译过程会下载很多依赖,可以将我们准备好的 doris-repo.tar.gz 解压到 Docker 挂载的对应目录,来避免下载依赖的过程,加速编译。

[root@hadoop1 soft]# tar -zxvf doris-repo.tar.gz -C /opt/soft

也可以通过指定阿里云镜像仓库来加速下载:

vi /opt/soft/apache-doris-0.15.0-incubating-src/fe/pom.xml
在<repositories>标签下添加:
<repository>
    <id>aliyun</id>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
​
vi /opt/soft/apache-doris-0.15.0-incubating-src/be/pom.xml
在<repositories>标签下添加:
<repository>
    <id>aliyun</id>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>

6)编译 Doris

[root@6fef83055389 apache-doris-0.15.0-incubating-src]# pwd
/root/apache-doris-0.15.0-incubating-src
​
[root@6fef83055389 apache-doris-0.15.0-incubating-src]# sh build.sh 

如果是第一次使用 build-env-for-0.15.0 或之后的版本,第一次编译的时候要使用如下命令:

[root@6fef83055389 apache-doris-0.15.0-incubating-src]# pwd
/root/apache-doris-0.15.0-incubating-src

[root@6fef83055389 apache-doris-0.15.0-incubating-src]# sh build.sh --clean --be --fe --ui 

因为 build-env-for-0.15.0 版本镜像升级了 thrift(0.9 -> 0.13),需要通过--clean 命令强制使用新版本的 thrift 生成代码文件,否则会出现不兼容的代码。

2.3 安装要求

2.3.1 软硬件需求

5)注意事项

(1)FE 的磁盘空间主要用于存储元数据,包括日志和 image。通常从几百 MB 到几个GB 不等。

(2)BE 的磁盘空间主要用于存放用户数据,总磁盘空间按用户总数据量* 3(3 副本)计算,然后再预留额外 40%的空间用作后台 compaction 以及一些中间数据的存放。

(3)一台机器上可以部署多个 BE 实例,但是只能部署一个 FE。如果需要 3 副本数据,那么至少需要 3 台机器各部署一个 BE 实例(而不是 1 台机器部署 3 个 BE 实例)。多个 FE 所在服务器的时钟必须保持一致(允许最多 5 秒的时钟偏差)

(4)测试环境也可以仅适用一个 BE 进行测试。实际生产环境,BE 实例数量直接决定了整体查询延迟。

(5)所有部署节点关闭 Swap。

(6)FE 节点数据至少为 1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。

(7)Follower 的数量必须为奇数,Observer 数量随意。

(8)根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署 3 个Follower 和 1-3 个 Observer。如果是离线业务,建议部署 1 个 Follower 和 1-3 个 Observer。

(9)Broker 是用于访问外部数据源(如 HDFS)的进程。通常,在每台机器上部署一个 broker 实例即可。

2.3.2 默认端口

当部署多个 FE 实例时,要保证 FE 的 http_port 配置相同。

部署前请确保各个端口在应有方向上的访问权限。

2.4 集群部署

生产环境建议 FE 和 BE 分开。

2.4.1 创建目录并拷贝编译后的文件

1)创建目录并拷贝编译后的文件

mkdir /opt/mod/apache-doris-0.15.0
cp -r /opt/soft/apache-doris-0.15.0-incubating-src/output /opt/mod/apache-doris-0.15.0

2)修改可打开文件数(每个节点)

sudo vi /etc/security/limits.conf 

* soft nofile 65535 
* hard nofile 65535 
* soft nproc 65535 
* hard nproc 65535 

重启永久生效,也可以用 ulimit -n 65535 临时生效。

2.4.2 部署 FE 节点

1)创建 fe 元数据存储的目录

mkdir /opt/mod/apache-doris-0.15.0/doris-meta 

2)修改 fe 的配置文件

vi /opt/mod/apache-doris-0.15.0/fe/conf/fe.conf
​
#配置文件中指定元数据路径: 
meta_dir = /opt/mod/apache-doris-0.15.0/doris-meta 
#修改绑定 ip(每台机器修改成自己的 ip) 
priority_networks = 192.168.1.31/24 

注意:

  • 生产环境强烈建议单独指定目录不要放在 Doris 安装目录下,最好是单独的磁盘(如果有 SSD 最好)。

  • 如果机器有多个 ip, 比如内网外网, 虚拟机 docker 等, 需要进行 ip 绑定,才能正确识别。

  • JAVA_OPTS 默认 java 最大堆内存为 4GB,建议生产环境调整至 8G 以上。

3)启动 hadoop1 的 FE

/opt/mod/apache-doris-0.15.0/fe/bin/start_fe.sh --daemon

可以通过页面查看FE相关信息

2.4.3 配置 BE 节点

1)分发 BE

xsync /opt/mod/apache-doris-0.15.0/be 

2)创建 BE 数据存放目录(每个节点)

mkdir /opt/mod/apache-doris-0.15.0/doris-storage1 
mkdir /opt/mod/apache-doris-0.15.0/doris-storage2

3)修改 BE 的配置文件(每个节点)

vi /opt/mod/apache-doris-0.15.0/be/conf/be.conf 
​
#配置文件中指定数据存放路径: 
storage_root_path = /opt/mod/apache-doris-0.15.0/doris-storage1;/opt/mod/apache-doris-0.15.0/doris-storage2 
#修改绑定 ip(每台机器修改成自己的 ip) 
priority_networks = 192.168.1.31/24 

注意:

  • storage_root_path 默认在 be/storage 下,需要手动创建该目录。多个路径之间使用英文状态的分号;分隔(最后一个目录后不要加)。

  • 可以通过路径区别存储目录的介质,HDD 或 SSD。可以添加容量限制在每个路径的末尾,通过英文状态逗号,隔开,如:

storage_root_path=/home/disk1/doris.HDD,50;/home/disk2/doris.SSD,10;/home/disk2/doris 

说明:

/home/disk1/doris.HDD,50,表示存储限制为 50GB,HDD;

/home/disk2/doris.SSD,10,存储限制为 10GB,SSD;

/home/disk2/doris,存储限制为磁盘最大容量,默认为 HDD

  • 如果机器有多个 IP, 比如内网外网, 虚拟机 docker 等, 需要进行 IP 绑定,才能正确识别。

2.4.4 在 FE 中添加所有 BE 节点

BE 节点需要先在 FE 中添加,才可加入集群。可以使用 mysql-client 连接到 FE。

1)安装 MySQL Client

(1)创建目录

mkdir /opt/soft/mysql-client/ 

(2)上传相关以下三个 rpm 包到/opt/soft/mysql-client/

➢ mysql-community-client-5.7.28-1.el7.x86_64.rpm

➢ mysql-community-common-5.7.28-1.el7.x86_64.rpm

➢ mysql-community-libs-5.7.28-1.el7.x86_64.rpm

(3)检查当前系统是否安装过 MySQL

sudo rpm -qa|grep mariadb 

#如果存在,先卸载 
sudo rpm -e --nodeps mariadb mariadb-libs mariadb-server 
(4)安装
rpm -ivh /opt/soft/mysql-client/* 

2)使用 MySQL Client 连接 FE

mysql -h hadoop1 -P 9030 -uroot 

默认 root 无密码,通过以下命令修改 root 密码。

SET PASSWORD FOR 'root' = PASSWORD('oracle'); 

3)添加 BE

ALTER SYSTEM ADD BACKEND "hadoop1:9050"; 
ALTER SYSTEM ADD BACKEND "hadoop2:9050"; 
ALTER SYSTEM ADD BACKEND "hadoop3:9050";

4)查看 BE 状态

SHOW PROC '/backends';

2.4.5 启动 BE

1)启动 BE(每个节点),如果启动be有问题,可以查看/opt/mod/apache-doris-0.15.0/be/log目录下的日志

/opt/mod/apache-doris-0.15.0/be/bin/start_be.sh --daemon

2)查看 BE 状态

mysql -h hadoop1 -P 9030 -uroot -p 
SHOW PROC '/backends'; 

Alive 为 true 表示该 BE 节点存活。

2.4.6 部署 FS_Broker(可选)

Broker 以插件的形式,独立于 Doris 部署。如果需要从第三方存储系统导入数据,需要部署相应的 Broker,默认提供了读取 HDFS、百度云 BOS 及 Amazon S3 的 fs_broker。fs_broker 是无状态的,建议每一个 FE 和 BE 节点都部署一个 Broker。

1)编译 FS_BROKER 并拷贝文件

(1)进入源码目录下的 fs_brokers 目录,使用 sh build.sh 进行编译

#参考2.2,进入docker容器编译,注意要将jdk设置成1.8
[root@47dd1482f9ce apache_hdfs_broker]# pwd
/root/apache-doris-0.15.0-incubating-src/fs_brokers/apache_hdfs_broker
​
[root@47dd1482f9ce apache_hdfs_broker]# sh build.sh
#编译完成后,退出容器

(2)拷贝源码 fs_broker 的 output 目录下的相应 Broker 目录到需要部署的所有节点上,改名为: apache_hdfs_broker。建议和 BE 或者 FE 目录保持同级。

方法同 2.2。

[hadoop@hadoop1 apache_hdfs_broker]$ pwd
/opt/soft/apache-doris-0.15.0-incubating-src/fs_brokers/apache_hdfs_broker/output/
​
[hadoop@hadoop1 output]$ sudo cp -r apache_hdfs_broker /opt/mod/apache-doris-0.15.0/
[hadoop@hadoop1 apache-doris-0.15.0]$ cd /opt/mod/apache-doris-0.15.0/
[hadoop@hadoop1 apache-doris-0.15.0]$ sudo chown -R hadoop:hadoop apache_hdfs_broker
​
#同步apache_hdfs_broker目录到其他节点
[hadoop@hadoop1 apache-doris-0.15.0]$ xsync apache_hdfs_broker

2)启动 Broker

/opt/mod/apache-doris-0.15.0/apache_hdfs_broker/bin/start_broker.sh --daemon 

3)添加 Broker

要让 Doris 的 FE 和 BE 知道 Broker 在哪些节点上,通过 sql 命令添加 Broker 节点列表。

1)使用 mysql-client 连接启动的 FE,执行以下命令:

mysql -h hadoop1 -P 9030 -uroot -p 
​
ALTER SYSTEM ADD BROKER broker_name "hadoop1:8000","hadoop2:8000","hadoop3:8000";
#broker_name可以自定义

其中 broker_host 为 Broker 所在节点 ip;broker_ipc_port 在 Broker 配置文件中的 conf/apache_hdfs_broker.conf。

4)查看 Broker 状态

使用 mysql-client 连接任一已启动的 FE,执行以下命令查看 Broker 状态:

SHOW PROC "/brokers";

 注:在生产环境中,所有实例都应使用守护进程启动,以保证进程退出后,会被自动拉起,如 Supervisor(opens new window)。如需使用守护进程启动,在 0.9.0 及之前版本中,需要修改各个 start_xx.sh 脚本,去掉最后的 & 符号。从 0.10.0 版本开始,直接调用 sh start_xx.sh 启动即可。

2.5 扩容和缩容

Doris 可以很方便的扩容和缩容 FE、BE、Broker 实例。

2.5.1 FE 扩容和缩容

可以通过将 FE 扩容至 3 个以上节点来实现 FE 的高可用。

1)使用 MySQL 登录客户端后,可以使用 sql 命令查看 FE 状态,目前就一台 FE

mysql -h hadoop1 -P 9030 -uroot -p 
SHOW PROC '/frontends';

 

也可以通过页面访问进行监控,访问 8030,账户为 root,密码默认为空不用填写。

2)增加 FE 节点

FE 分为 Leader,Follower 和 Observer 三种角色。 默认一个集群,只能有一个 Leader,可以有多个 Follower 和 Observer。其中 Leader 和 Follower 组成一个 Paxos 选择组,如果Leader 宕机,则剩下的 Follower 会自动选出新的 Leader,保证写入高可用。Observer 同步Leader 的数据,但是不参加选举。

如果只部署一个 FE,则 FE 默认就是 Leader。在此基础上,可以添加若干 Follower 和Observer。

ALTER SYSTEM ADD FOLLOWER "hadoop2:9010";
ALTER SYSTEM ADD OBSERVER "hadoop3:9010";

3)配置及启动 Follower 和 Observer

第一次启动时,启动命令需要添加参--helper leader 主机: edit_log_port:

(1)分发 FE,修改 FE 的配置(同 2.4.2)

scp -r /opt/mod/apache-doris-0.15.0/fe hadoop2:/opt/mod/apache-doris-0.15.0 
scp -r /opt/mod/apache-doris-0.15.0/fe hadoop3:/opt/mod/apache-doris-0.15.0 
​
#在节点2、节点3,修改fe的配置文件
[hadoop@hadoop2 conf]$ pwd
/opt/mod/apache-doris-0.15.0/fe/conf
​
[hadoop@hadoop2 conf]$ vi fe.conf
#将每个节点的配置文件,改成自己相应的IP
priority_networks = 192.168.1.32/24
​
#在节点2、节点3,创建fe的元数据目录
[hadoop@hadoop2 fe]$ mkdir -p /opt/mod/apache-doris-0.15.0/doris-meta

(2)在 hadoop2 启动 Follower,第一次启动要加--helper,

/opt/mod/apache-doris-0.15.0/fe/bin/start_fe.sh --helper hadoop1:9010 --daemon

(3)在 hadoop3 启动 Observer,第一次启动要加--helper

/opt/mod/apache-doris-0.15.0/fe/bin/start_fe.sh --helper hadoop1:9010 --daemon 

4)查看运行状态

使用 mysql-client 连接到任一已启动的 FE。

SHOW PROC '/frontends'; 

 

 

5)删除 FE 节点命令,删除后,将相关节点的FE停止

ALTER SYSTEM DROP FOLLOWER[OBSERVER] "fe_host:edit_log_port"; 

注意:删除 Follower FE 时,确保最终剩余的 Follower(包括 Leader)节点为奇数。

2.5.2 BE 扩容和缩容

1)增加 BE 节点

在 MySQL 客户端,通过 ALTER SYSTEM ADD BACKEND 命令增加 BE 节点。

2)DROP 方式删除 BE 节点(不推荐)

ALTER SYSTEM DROP BACKEND "be_host:be_heartbeat_service_port";

注意:DROP BACKEND 会直接删除该 BE,并且其上的数据将不能再恢复!!!所以我们强烈不推荐使用 DROP BACKEND 这种方式删除 BE 节点。当你使用这个语句时,会有对应的防误操作提示。

3)DECOMMISSION 方式删除 BE 节点(推荐)

ALTER SYSTEM DECOMMISSION BACKEND "be_host:be_heartbeat_service_port";
  • 该命令用于安全删除 BE 节点。命令下发后,Doris 会尝试将该 BE 上的数据向其他 BE 节点迁移,当所有数据都迁移完成后,Doris 会自动删除该节点。

  • 该命令是一个异步操作。执行后,可以通过 SHOW PROC '/backends'; 看到该 BE 节点的 isDecommission 状态为 true。表示该节点正在进行下线。

  • 该命令不一定执行成功。比如剩余 BE 存储空间不足以容纳下线 BE 上的数据,或者剩余机器数量不满足最小副本数时,该命令都无法完成,并且 BE 会一直处于 isDecommission 为 true 的状态。

  • DECOMMISSION 的进度,可以通过 SHOW PROC '/backends'; 中的 TabletNum 查看,如果正在进行,TabletNum 将不断减少。

  • 该操作可以通过如下命令取消:

    CANCEL DECOMMISSION BACKEND "be_host:be_heartbeat_service_port"; 

    取消后,该 BE 上的数据将维持当前剩余的数据量。后续 Doris 重新进行负载均衡。

2.5.3 Broker 扩容缩容

Broker 实例的数量没有硬性要求。通常每台物理机部署一个即可。Broker 的添加和删除可以通过以下命令完成:

ALTER SYSTEM ADD BROKER broker_name "broker_host:broker_ipc_port";  
ALTER SYSTEM DROP BROKER broker_name "broker_host:broker_ipc_port";  
ALTER SYSTEM DROP ALL BROKER broker_name; 

Broker 是无状态的进程,可以随意启停。当然,停止后,正在其上运行的作业会失败,重试即

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

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

相关文章

MySQL使用教程:数据库、表操作

目录 1. 免密码登录MySQL1.1 免密码配置1.2 登录选项介绍 2. MySQL基础配置&#xff1a;my.cnf3. 开机自启动设置&#xff08;可选设置&#xff09;4. 查看存储引擎5. 查看系统的编码规则和校验规则6. 数据库的操作6.1 查看数据库6.2 创建数据库 create database6.3 删除数据库…

九州金榜|面对校园霸凌,家长应该如何教育?

近期关于校园霸凌事件接连发生&#xff0c;前有邯郸时间&#xff0c;后有福建晋江一中学生因不忍被霸凌&#xff0c;选择跳楼轻生&#xff0c;面对此类事件&#xff0c;接连发生&#xff0c;孩子为什么会成为被霸凌的对象&#xff1f;家长应该如何教育孩子敢于对霸凌时说不。下…

【Java程序设计】【C00374】基于(JavaWeb)Springboot的社区疫情管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

Java Web-Tomcat

Web服务器 Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是“提供网上信息浏览服务”。 Tomcat&#xff0c;是一个 HTTP 服务器。我们只需要在服务器中安装一个Web服务器如Tomcat&#xff0c;然后就可以将…

js逆向之对称加密west交大登录密码

目录 js逆向之对称加密&west交大登录密码 什么是DES? 什么是AES? 实例演示--某大学官网 找加密? 关键字搜索 第一处: 找到其加密码代码 下断点 扣代码 这js代码怎么运行呢? 如何使用node运行js代码? 下载这个加密算法对象库 引用(对象) 传参 联动pyth…

Rancher介绍

1.什么是Rancher Rancher是一套容器管理平台&#xff0c;专门用于部署和管理容器化应用。以下是关于Rancher的详细介绍&#xff1a; 容器编排与管理&#xff1a;Rancher是一个开源的企业级容器管理平台&#xff0c;它支持Kubernetes作为其容器编排引擎。Rancher可以帮助用户在…

rust中常用cfg属性和cfg!宏的使用说明,实现不同系统的条件编译

cfg有两种使用方式&#xff0c;一种是属性&#xff1a; #[cfg()]&#xff0c;一种是宏&#xff1a;cfg! &#xff0c;这两个都是非常常用的功能。 #[cfg()]是 Rust 中的一个属性 用于根据配置条件来选择性地包含或排除代码。cfg 是 "configuration" 的缩写&#xf…

将markdown文档中的图床外链图片下载到本地文件夹

markdown图床外链图片下载到本地代码 前言 因为文章发到先知或者攻防社区需要本地图片&#xff0c;而我的图片从来都是上传到图床&#xff0c;所以编写了一个脚本实现了把markdown文章中所有含有外链图床的图片转储到本地的文件夹。 然后发布文章时再手动一个个上传图片。 如果…

Set和Map数据结构

Set和Map数据结构理解 Set&#xff1a; 1、es6新的数据结构&#xff0c;类似数组&#xff0c;但成员唯一 2、实例属性&#xff1a;Set.prototype.size返回Set实例的成员总数 3、操作方法&#xff1a;add、delete、has、clear 4、遍历操作&#xff1a;forEach、keys、values、en…

【研发日记】C/C++开发避坑秘籍(一)——CAN接收Buffer溢出Bug

文章目录 背景介绍 问题描述 分析排查 解决方案 总结归纳 背景介绍 在一个嵌入式软件项目中&#xff0c;有一段使用C语言写的嵌入式代码&#xff0c;功能是把CAN总线上的几帧报文接收进来&#xff0c;并解析出数据。示例如下&#xff1a; 乍一看感觉挺简单&#xff0c;想着…

全球前十大交易所KuCoin遭美司法部、CFTC起诉!违反银行保护法、反洗钱!交2200万“保护费”还不够?

昨&#xff08;26&#xff09;日晚间&#xff0c;美国司法部释出重磅消息&#xff0c;全球排名前十的中心化加密货币交易所KuCoin及其创始人Chun Gan和Ke Tang&#xff0c;遭到美国南区纽约地区检察官办公室起诉&#xff0c;理由是KuCoin及其两位创始人违反了美国反洗钱规范和未…

Mysql的高级语句3

目录 一、子查询 注意&#xff1a;子语句可以与主语句所查询的表相同&#xff0c;但是也可以是不同表。 1、select in 1.1 相同表查询 1.2 多表查询 2、not in 取反&#xff0c;就是将子查询结果&#xff0c;进行取反处理 3、insert into in 4、update…

el-table 表格全选

<template><div><el-checkbox v-model"checked" :disabledcheckedDis change"onAllSelectChange">全选</el-checkbox><el-table ref"multipleTable" :data"tableData" tooltip-effect"dark" sel…

面试八股文之JAVA基础

JAVA基础 DNS、CDN&#xff1f;如何实现对象克隆?父子类静态代码块, 非静态代码块, 构造方法执行顺序?String s new String("abc") 创建了几个对象, 分别放到哪里?OSI网络模型七层&#xff1f;应用层协议&#xff1f;http协议和https协议区别&#xff1f;传输层协…

Spring高级面试题-2024

Spring 框架中都用到了哪些设计模式&#xff1f; 1. 简单工厂&#xff1a; ○ BeanFactory&#xff1a;Spring的BeanFactory充当工厂&#xff0c;负责根据配置信息创建Bean实例。它是一种工厂模式的应用&#xff0c;根据指定的类名或ID创建Bean对象。2. 工厂方法&#xff…

插入排序和希尔排序:

插入排序 1. 算法思想&#xff1a; 由数组下标为1 开始的数值作为判断依据&#xff0c;与之前的数据从后往前比较定义tmp 暂存判断的数值&#xff0c;若前面的数据大于tmp&#xff0c;则将前面的数据向后移动 : arr[j1]arr[j]若对比的数据比tmp 大&#xff0c;则往后移&#…

展会邀约 |立仪科技邀您相聚四月

2024深圳国际传感器与应用技术展览会 2024年04月14日盛大开幕&#xff01; 立仪科技作为参展商 诚挚地邀请各地朋友莅临参观交流 2024成都国际工业展览会 2023年04月24-26日盛大开幕&#xff01; 立仪科技作为参展商 诚挚地邀请各地朋友莅临参观交流 深圳立仪科技有限公司…

Ubuntu上安装d4rl数据集

Ubuntu上安装d4rl数据集 D4RL的官方 github: https://github.com/Farama-Foundation/D4RL 一、安装Mujoco 1.1 官网下载mujoco210文件 如果装过可以跳过这步 链接&#xff1a;https://github.com/deepmind/mujoco/releases/tag/2.1.0 下载第一个文件即可。我这里是在windo…

拥抱C++的深度和复杂性,挖掘更多可能 !——《C++20高级编程(第5版)》

&#xff0c;C难以掌握&#xff0c;但其广泛的功能使其成为游戏和商业软件应用程序中最常用的语言。即使是有经验的用户通常也不熟悉许多高级特性&#xff0c;但C20的发布提供了探索该语言全部功能的绝佳机会。《C20高级编程(第5版)》为C的必要内容提供了一个代码密集型、面向解…