深度解析 HDFS与Hive的关系
1. HDFS 和 Hive 如何协同
我们将从 HDFS(Hadoop Distributed File System) 的架构入手,深入剖析其核心组成、工作机制、内部流程与高可用机制。然后详细阐述 Hive 与 HDFS 的关系,从执行流程、元数据管理、文件读写、计算耦合等角度分析其融合方式。
一、HDFS 架构详细剖析
1.1 核心组件
组件 | 角色 | 说明 |
---|---|---|
NameNode | 主节点 | 负责元数据管理,包括目录树、文件与块映射(block mapping)、权限、块副本位置 |
DataNode | 从节点 | 存储实际的数据块(block),周期性向 NameNode 发送心跳与块报告 |
Secondary NameNode | 辅助节点 | 周期性合并 FsImage 和 EditLog,防止 EditLog 过大(非 HA) |
JournalNode(HA) | 日志节点 | 存储共享的 EditLog 日志,支持 NameNode 高可用 |
ZKFailoverController (ZKFC) | HA 组件 | 监控 NameNode 状态,结合 Zookeeper 实现故障转移 |
Checkpoint Node / Backup Node | 可选 | 增强型 Secondary NN 角色,用于元数据备份 |
1.2 数据存储机制
分块(Block)策略
-
默认块大小:128MB 或 256MB(可配置)
-
每个大文件被切分为多个块(Block),每块被写入多个 DataNode(副本)
副本机制
-
默认副本数:3
-
Rack-aware 策略:优先写入本机 -> 同机架不同节点 -> 不同机架,提高可靠性和容灾能力
1.3 元数据管理
类型 | 存储位置 | 说明 |
---|---|---|
FsImage | 本地磁盘 | 当前一致性文件系统快照,定期合并 |
EditLog | 本地磁盘 / JN | 所有对 HDFS 的变更操作日志(追加式) |
BlockMap | 内存中 | 文件到 Block 的映射、Block 所在 DataNode 信息,仅 NameNode 内存维护 |
1.4 文件读写流程(核心细节)
写入流程:
-
客户端向 NameNode 请求创建文件
-
NameNode 分配 Block 和副本 DataNode 列表
-
客户端以 pipeline 流方式依次写入 DataNode(链式写入:DN1→DN2→DN3)
-
写入完成后通知 NameNode 更新 Block 信息
-
NameNode 写 EditLog,记录操作变更
读取流程:
-
客户端向 NameNode 请求文件 Block 列表
-
NameNode 返回每个 Block 所在的 DataNode 列表(按拓扑距离排序)
-
客户端并行从多个 DataNode 拉取 Block 数据并拼接
1.5 容错机制
-
心跳机制:每 3 秒 DataNode 向 NameNode 发送心跳(丢失超过 10 分钟视为宕机)
-
块报告机制:每小时向 NameNode 汇报当前所有块列表
-
副本自动修复:当副本数低于配置阈值,NameNode 自动触发复制操作
-
Block Scanner:DataNode 本地检测数据块是否损坏(定期进行校验)
1.6 高可用架构(HA)
方式:Active/Standby NameNode + JournalNode + Zookeeper
-
JournalNode 集群用于存储 EditLog
-
Zookeeper+ZKFC 实现故障自动切换(Active/Standby)
-
客户端通过 ZK 获取当前 Active NameNode 地址
二、Hive 架构详细剖析与 HDFS 关系
2.1 Hive 核心架构
组件 | 功能 |
---|---|
HiveServer2 | 提供 JDBC/ODBC 服务,接收客户端请求 |
Driver | 解析 SQL、生成执行计划 |
Compiler | 语法解析、逻辑计划生成、查询优化 |
Execution Engine | 任务调度(MapReduce、Tez、Spark) |
Metastore | 元数据存储(表结构、分区、HDFS路径) |
HDFS | Hive 的数据底座,所有表数据都以文件形式存储于 HDFS |
Catalog(可选) | 集成 HMS / HiveCatalog(如 Flink/Spark)进行统一元数据管理 |
2.2 Hive 与 HDFS 的核心关系
维度 | 描述 |
---|---|
数据存储层 | Hive 表对应的实际数据存储在 HDFS 上,每个表/分区对应一个 HDFS 路径(如 /warehouse/db/table/part=... ) |
文件格式 | 支持 TextFile、ORC、Parquet、Avro 等,可压缩、可列存 |
表分区/桶 | Hive 分区表在 HDFS 中对应子目录;桶表对应多个文件(用于 map-side join 优化) |
操作行为 | 所有 Hive 的 insert/overwrite/load/drop 操作均直接调用 HDFS API 执行文件操作 |
容错与高可用 | 依赖 HDFS 的高可用与副本机制保障数据安全 |
2.3 Hive 查询执行过程(以 HDFS 为底层)
示例:SELECT * FROM sales WHERE region = 'east';
-
HiveServer2 接收请求
-
Compiler 阶段
-
解析 SQL
-
调用 Metastore 查询
sales
表的 HDFS 路径及分区信息
-
-
优化器阶段
-
基于字段过滤裁剪 HDFS 目录(分区裁剪)
-
选择执行引擎(MapReduce/Tez/Spark)
-
-
执行引擎阶段
-
生成执行计划(如 MapReduce)
-
Mapper 任务并行拉取 HDFS 中的数据块进行处理
-
-
任务完成,结果返回用户
三、Hive 与 HDFS 深度耦合分析
层面 | 耦合内容 | 说明 |
---|---|---|
路径映射 | 每个 Hive 表、分区都有一个 HDFS 目录路径,且通过 LOCATION 指定 | |
Schema + Data 分离 | Hive 元数据由 Metastore 管理,数据文件由 HDFS 存储 | |
执行模式 | Hive SQL 实际执行中,底层由任务读取 HDFS 文件,处理后输出到目标 HDFS 路径 | |
数据一致性 | 元数据与实际 HDFS 数据需保持一致,需防止“元数据存在但文件丢失”等问题 | |
数据落地 | Hive 表插入或导入数据实质是写入 HDFS 目录下的文件 | |
权限管理 | HDFS 文件权限控制直接影响 Hive 表操作权限(如 HDFS ACL、Ranger) |
四、总结:Hive 架构是构建在 HDFS 数据湖上的 SQL 计算引擎
特性 | HDFS | Hive |
---|---|---|
存储对象 | 文件(Block) | 表(逻辑) |
元数据 | 内部内存 & FsImage | Metastore(MySQL/Derby) |
访问方式 | Java API(HDFSClient) | SQL |
容错机制 | Block 副本、NN HA | 依赖 HDFS 容错 |
执行模式 | 存储为主 | 执行为主(借助 MapReduce/Tez/Spark) |
2. Hive 执行 SQL 的全过程解析
我们将对 Hive 执行 SQL 的全过程进行全链路、逐层解剖式分析,涵盖从用户发起查询、各组件执行职责,到最终数据返回的所有核心流程与内部机制。
一、Hive 执行 SQL 的整体流程概览
Client↓
HiveServer2↓
Driver↓
Compiler↓
Optimizer↓
Execution Engine↓
YARN / Local / LLAP↓
HDFS + Metastore↓
返回结果给用户
二、全链路详细步骤与组件职责分析
步骤 1:用户提交 SQL 请求
参与组件
-
CLI / Beeline / JDBC / ODBC 客户端
-
HiveServer2(HS2)
行为
-
客户端通过 JDBC/ODBC 连接 HiveServer2,发送 SQL 请求
-
HiveServer2 接收并认证(可接入 LDAP、Kerberos、Ranger 等)
步骤 2:SQL 解析与执行初始化
参与组件
-
Driver(org.apache.hive.ql.Driver)
-
SessionManager / Context
行为
-
创建执行会话(Session)
-
初始化执行上下文(设置当前数据库、资源路径、执行配置等)
-
封装查询成
QueryPlan
步骤 3:SQL 编译
参与组件
-
Compiler(org.apache.hive.ql.parse.ParseDriver)
-
SemanticAnalyzer
-
MetastoreClient
行为
-
词法与语法解析
-
将 SQL 字符串转为 AST(抽象语法树)
-
-
语义分析
-
解析表名、字段、函数、分区等
-
查询 Metastore,获取表结构与分区路径信息(如 HDFS 目录)
-
校验字段类型、函数合法性
-
-
逻辑计划生成
-
构建
Operator Tree
(如 TableScan → Filter → Join → Select → FileSink)
-
步骤 4:查询优化
参与组件
-
Optimizer(Logical Plan Optimizer)
-
Rule Dispatcher / Transformation Rules
行为
-
谓词下推(Predicate Pushdown)
-
列裁剪(Column Pruning)
-
MapJoin 转换
-
Join 排序优化(Cost-Based Optimizer)
-
表分区裁剪(Partition Pruning)
-
Bucket Map Join、Skew Join 优化
Hive 优化器会尝试将逻辑计划转换为最小代价的执行路径,提升并发性与计算效率。
步骤 5:物理计划生成
参与组件
-
Physical Plan Generator
-
Execution Engine
行为
-
将逻辑操作树转换为物理执行计划(如 MR DAG、Tez DAG 或 Spark Plan)
-
根据引擎类型(默认 Tez / 可选 Spark、MR)生成相应任务计划
步骤 6:任务提交与资源调度
参与组件
-
Execution Engine
-
YARN ResourceManager / LLAP Daemon
-
JobTracker / TezApplicationMaster / SparkDriver
行为
-
向 YARN 请求资源容器(Container)
-
提交 MapReduce Job / Tez DAG / Spark Application
-
启动 ApplicationMaster(AM)进行任务调度
-
并行在多个 NodeManager 上启动 Task(如 Map、Reducer)
步骤 7:数据读取与处理
参与组件
-
HDFS Client
-
InputFormat / RecordReader
-
Mapper/Executor
-
Serde
行为
-
使用 InputFormat/RecordReader 从 HDFS 读取文件数据(按切分 Block)
-
通过 SerDe 反序列化为行记录
-
Mapper 执行 TableScan → Filter → Project 等操作
-
根据 Plan 决定是否执行 Shuffle、Join、Aggregation 等操作
步骤 8:结果写入/输出
目标类型
-
SELECT 查询:直接返回结果(Memory / JDBC fetch)
-
INSERT/OVERWRITE:写入到目标 HDFS 路径
-
CREATE TABLE AS SELECT:创建表元数据 + 写入数据文件
组件行为
-
OutputFormat + RecordWriter 将结果写入本地/tmp/HDFS
-
最终结果缓存在 HiveServer2 端(或可配置写入 result_tmp_path)
步骤 9:返回结果给用户
组件
-
HiveServer2
-
JDBC/ODBC 客户端
行为
-
HiveServer2 逐行读取结果缓冲区
-
以 RowSet 形式通过 JDBC/ODBC 流式返回结果给用户
三、组件职责一览表(核心组件全解)
组件 | 所属模块 | 职责 |
---|---|---|
HiveServer2 | 服务层 | 接收 SQL 请求,建立 session,结果返回 |
Driver | 执行器 | 管理查询生命周期,协调编译、优化、执行 |
Compiler | 编译器 | SQL 解析为逻辑计划(AST → Operator Tree) |
SemanticAnalyzer | 分析器 | 语义分析,调用 Metastore 获取表结构 |
Metastore | 元数据 | 存储表结构、分区、列信息(使用 MySQL 等) |
Optimizer | 优化器 | 进行各种规则优化(谓词下推、Join 优化等) |
Execution Engine | 执行层 | 将物理计划提交到 Tez/Spark/MR 等引擎 |
ResourceManager | YARN | 分配执行任务所需的计算资源 |
HDFS | 存储层 | 提供数据存储与读取支撑(通过 InputFormat) |
Serde | 解析器 | 文件内容序列化/反序列化(如 ORC、Parquet) |
InputFormat | IO 接口 | 分片读取数据(行/列),对接底层存储格式 |
四、以 Tez 引擎为例:DAG 执行链路
Hive SQL↓
逻辑计划(Operator Tree)↓
Tez DAG Plan↓
YARN ResourceManager 启动 AM↓
Tez AM 启动多个 Vertex(类似 Map/Reduce)↓
Vertex 拉取 HDFS 分片数据,运行 Operator↓
结果通过 DAG 边传递(管道式执行)↓
写入结果目录 / 返回查询结果
五、完整案例流程(SELECT 查询)
SELECT name, price FROM sales WHERE region = 'east' AND price > 100;
执行链路概览:
步骤 | 说明 |
---|---|
SQL 输入 | 客户端通过 JDBC 向 HS2 提交查询 |
元数据解析 | Hive 获取 sales 表的 HDFS 路径、列定义、分区 |
语义分析 | AST → Operator Tree(TableScan → Filter → Project) |
分区裁剪 | region = 'east',裁剪对应 HDFS 子目录 |
优化 | 只读取 name, price 列,进行列裁剪与谓词下推 |
计划生成 | 构建 Tez DAG,使用 Tez AM 执行任务 |
数据读取 | InputFormat 读取 ORC 文件中的列数据块 |
数据处理 | 任务执行 Filter(price > 100)、Project(取 name 和 price) |
返回结果 | Tez 写入临时结果 → HiveServer2 → JDBC 返回用户 |
六、总结:Hive SQL 执行是“编译型 SQL + 分布式任务”的复合流程
阶段 | 类型 | 特征 |
---|---|---|
编译阶段 | 类似数据库编译器 | 语法 → 语义 → 优化 → 物理计划 |
执行阶段 | 类似大数据任务 | Tez/Spark/MR 执行 DAG,有效并行计算 |
元数据阶段 | 类似数据库 Catalog | 所有数据路径均依赖 Metastore |
存储访问 | 基于 HDFS | 高吞吐并行读写、Schema-on-Read |
3. HiveQL 执行案例分
我们将从查询和修改两类操作出发,深入到系统架构层,逐层剖析涉及的流程与组件协作。
一、整体系统架构图(用户请求路径)
+-----------------+| JDBC/Beeline |+--------+--------+|v+----------+----------+| HiveServer2 | ← JDBC 接入点(支持查询/修改/授权)+----------+----------+|+------------+------------+| Hive Compiler | ← 编译器:语法解析、逻辑优化、物理计划生成+------------+------------+|v+--------+--------+| Execution Engine | ← Tez / MapReduce / Spark+--------+--------+|+------------+------------+| HDFS | ← 存储层,读写数据文件(ORC/Parquet/Text)+------------+------------+|vDataNodes同时:+-----------------------------+| Hive Metastore (MySQL) |+-----------------------------+↑ ↑ ↑表结构 分区信息 数据位置
二、用户执行查询请求时(SELECT)
Step-by-step:
1. 客户端请求
-
用户通过 JDBC/Beeline/Web 发送 SQL,如:
SELECT name FROM user_logs WHERE region = 'US' LIMIT 10;
2. HiveServer2 接收请求
-
检查 SQL 合法性
-
连接到 Hive Metastore 查询 表 schema 和元数据(包括字段、分区、存储位置)
-
获取执行引擎上下文(Tez / Spark / MapReduce)
3. Hive 编译器处理
-
语法解析(Parse):生成 AST(抽象语法树)
-
语义分析(Semantic Analysis):识别表、列、类型,绑定元数据
-
逻辑计划生成(Logical Plan)
-
优化(Rule-Based Optimizer):
-
投影下推
-
分区裁剪(partition pruning)
-
谓词下推(predicate pushdown)
-
Join Reorder
-
-
物理计划生成(Physical Plan):转为 Task DAG
4. 执行引擎提交任务
-
Hive 调用 Tez / Spark / MapReduce 提交作业
-
向 YARN 注册任务,分配 Container 资源
-
各个 Task 从 HDFS 读取 ORC/Parquet 数据,执行 map/filter/join 等操作
-
数据通过 shuffle / reduce 汇总结果
5. 读取数据(HDFS 层)
-
根据 Metastore 提供的数据路径,从 DataNode 拉取数据块
-
通过 InputFormat(如 OrcInputFormat)进行列式读取
-
每个 Task 处理一部分 Split
6. 汇总结果,返回给客户端
-
Task 执行完毕后,将结果写回 HiveServer2
-
JDBC 返回结果集给用户
SELECT 查询关键组件协作:
组件 | 作用 |
---|---|
HiveServer2 | 接收 JDBC 请求、调度引擎 |
Metastore | 提供表结构、分区信息、文件位置 |
Execution Engine | Tez / Spark / MapReduce,执行 SQL 转换后的 DAG |
HDFS | 提供数据文件存储,分布式读取 |
ORC/Parquet | 提供高效的列式存储和压缩,支持 predicate pushdown |
三、用户执行修改请求时(INSERT/DELETE/UPDATE)
修改数据在 Hive 中也称为写入路径。以 INSERT INTO
为例。
Step-by-step:
1. 客户端发送写入请求
INSERT INTO user_logs SELECT * FROM staging_logs WHERE date = '2024-12-01';
2. HiveServer2 接收并验证
-
检查权限
-
获取源表和目标表的 schema、位置、格式
-
解析写入是否是覆盖 / 追加 / 动态分区等
3. 编译优化逻辑计划
-
生成 insert DAG
-
判断是否需要 Bucketing / Sort / Partition
-
动态分区裁剪、FileSink 插入节点确定路径
4. 调度执行引擎写入
-
提交 Tez/Spark/MapReduce DAG
-
执行 SELECT 子查询(从 staging_logs 读取)
-
将输出写入 HDFS 的临时 staging 目录
5. HDFS 写入逻辑
-
将结果数据写入
/warehouse/user_logs/.hive-staging-xxxxxx/
-
写入过程可能压缩为 ORC/Parquet
-
任务成功后重命名为目标目录(原子操作)
6. 更新 Metastore
-
更新分区元数据(如果涉及分区表)
-
增加文件列表、修改数据路径
-
记录插入行为(用于 ACID 表则记录 delta)
Hive 写入相关细节:
操作类型 | 默认行为 | 引擎处理 |
---|---|---|
INSERT INTO | 追加模式,写入新数据文件 | FileSink -> OutputFormat -> HDFS |
INSERT OVERWRITE | 清空原分区后再写 | 会删除老文件再写新文件 |
UPDATE/DELETE | 需要 ACID 表,底层写 delta log 文件 | 写 _delta_0001_0002 等目录 |
事务支持 | 需要开启 hive.txn.manager 事务配置 | 支持 snapshot isolation |
四、特殊路径分析(JOIN 查询)
JOIN 会产生:
-
多阶段 MapReduce/Tez DAG
-
Join 类型判断(MapJoin / SortMergeJoin)
-
Hive 优化器会决定是否广播小表
SELECT u.id, u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.date = '2024-12-01';
执行过程关键点:
-
小表
users
可能被广播为 MapJoin -
大表
orders
会被 scan + filter + hash join -
Join 结果在 Reducer 合并输出
五、总结:Hive 查询/修改路径关键协作流程
层级 | 查询(SELECT) | 写入/修改(INSERT/UPDATE) |
---|---|---|
客户端 | JDBC/Beeline/Web SQL 提交 | 同上 |
HiveServer2 | 验证 SQL,连接 Metastore,解析语义 | 同上 |
Metastore | 提供表结构、分区、数据路径 | 插入后更新元数据 |
编译器 | 生成 Logical Plan,优化,转为 Physical Plan | 生成 DAG,规划写路径、压缩格式、分区路径等 |
引擎(Tez) | 读取数据,执行 DAG | SELECT 子查询后,写入 FileSink 到 HDFS |
HDFS | InputFormat 读取数据块 | 输出数据写入临时目录,成功后 move 到目标目录 |
文件格式 | ORC/Parquet 支持谓词下推、列存压缩 | 写入时可控制压缩格式、分区结构 |
安全控制 | 可通过 Ranger/Sentry 实现表级、列级、行级权限控制 | 插入/修改权限通过 Metastore + 授权服务进行验证 |
相关文章:
深度解析 HDFS与Hive的关系
1. HDFS 和 Hive 如何协同 我们将从 HDFS(Hadoop Distributed File System) 的架构入手,深入剖析其核心组成、工作机制、内部流程与高可用机制。然后详细阐述 Hive 与 HDFS 的关系,从执行流程、元数据管理、文件读写、计算耦合等…...
ArrayList源码分析
1. ArrayList默认初始化容量 首先编写一个简单的初始化ArrayList的代码 List<String> li new ArrayList<>();然后进入ArrayList中,在无参数构造方法中可以查看到上面的绿色注释中写了构造一个空的集合并且初始化容量为10。接下来继续查看源码&#x…...
文件操作和IO-2 使用Java操作文件
Java操作文件的API 1、针对文件系统的操作。包括但不限于:创建文件、删除文件、重命名文件、列出目录内容…… 2、针对文件内容的操作。读文件/写文件 Java中针对文件的操作,使用File类来进行操作,这个类被存储在java.io这个包里面。 i&a…...
day 31
文件的拆分 1. 项目核心代码组织 src/(source的缩写):存放项目的核心源代码。 2. 配置文件管理 config/ 目录:集中存放项目的配置文件,方便管理和切换不同环境(开发、测试、生产)的配置。 …...
基于Python批量删除文件和批量增加文件
一、为什么写这么一个程序 其实原因也是很简单的,我去网上下载了一个文件夹,里面太多别人的文件了,我不喜欢,所以我就写了这么一个代码。 二、安装Python和vscode 先安装Python在安装vscode Python安装 vscode的安装 三、源码…...
【信息系统项目管理师】第12章:项目质量管理 - 26个经典题目及详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...
ShenNiusModularity项目源码学习(27:ShenNius.Admin.Mvc项目分析-12)
订单列表页面用于浏览、检索、维护商城模块的订单信息。订单列表页面的后台控制器类OrderController位于ShenNius.Admin.Mvc项目的Areas\Shop\Controllers内,页面文件位于同项目的Areas\Shop\Views\Order内,其中Index.cshtml页面为主页面,Det…...
(T_T),不小心删掉RabbitMQ配置文件数据库及如何恢复
一、不小心删除 今天是2025年5月15日,非常沉重的一天,就在今早8点左右的时候我打算继续做我的毕业设计,由于开机的过程十分缓慢(之前没有),加上刚开机电脑有卡死的迹象,再加上昨天晚上关电脑前…...
【Python装饰器深度解析】从语法糖到元编程实战
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:基础计时装饰器案…...
操作系统学习笔记第5章 (竟成)
目录 第 5 章 输入 / 输出 (I/O) 管理 5.1 I/O 管理基础 5.1.1 I/O 设备 1.I/O 设备的基本概念 2.I/O 设备的分类 3.I/O 接口 4.I/O 端口 (1) I/O 端口的概念 (2) I/O 端口的编址 ① 独立编址方式 ② 统一编址方式 5.1.2 I/O 控制方式 1. 程序查询方式 2. 程序中断方式 3. DMA …...
【DCGMI专题1】---DCGMI 在 Ubuntu 22.04 上的深度安装指南与原理分析(含架构图解)
目录 一、DCGMI 概述与应用场景 二、Ubuntu 22.04 系统准备 2.1 系统要求 2.2 环境清理(可选) 三、DCGMI 安装步骤(详细图解) 3.1 安装流程总览 3.2 分步操作指南 3.2.1 系统更新与依赖安装 3.2.2 添加 NVIDIA 官方仓库 3.2.3 安装数据中心驱动与 DCGM 3.2.4 服务…...
C# 使用 OpenCV 基础
一、C#安装OpenCV 安装上面两个模块 二、使用 导入 using OpenCvSharp;加载图片 // 导入图片 Mat image Cv2.ImRead("C:\x5.bmp"); // 拷贝 Mat image2 image.Clone();// 打开窗口 Cv2.NamedWindow("image", WindowFlags.AutoSize); // 显示图片 Cv2…...
如何解决全局或静态变量被修改的bug
问题卡死 程序原来设置Firware name 时N32G475,在程序运行时,程序崩溃,发现输出的固件名称没有了,这里说明固件名称被程序修改了 程序在开机时都是对的 打开map文件查找fw_name的内存地址,他的值被更改,就…...
[Java实战]Spring Boot整合Sentinel:流量控制与熔断降级实战(二十九)
[Java实战]Spring Boot整合Sentinel:流量控制与熔断降级实战(二十九) 一、Sentinel简介 Sentinel是阿里开源的分布式系统流量防卫组件,核心功能包括: 流量控制:根据QPS、线程数等指标限制资源访问熔断降…...
Linux系统中,Ctrl+C的运行过程是什么?
文章目录 前言1.终端驱动捕获键盘输入2.信号发送到前台进程组3. 进程处理信号4. 信号传递的详细流程5. Shell 的后续处理关键机制说明扩展:其他相关信号总结 前言 今天看到有个小伙伴面试问到这个问题,感觉挺有意思,我们后端开发者相信都用过…...
101个α因子#9
((0 < ts_min(delta(close, 1), 5)) ? delta(close, 1) : ((ts_max(delta(close, 1), 5) < 0) ? delta(close, 1) : (-1 * delta(close, 1))))worldquant brain平台上调整后的语法: ((0 < min(close-ts_delay(close, 1), ts_delay(close, 1)-ts_delay(c…...
DAY28 超大力王爱学Python
知识点回顾: 类的定义pass占位语句类的初始化方法类的普通方法类的继承:属性的继承、方法的继承 作业 题目1:定义圆(Circle)类 import mathclass Circle:def __init__(self, radius1):self.radius radius # 半径属性…...
【C++算法】70.队列+宽搜_N 叉树的层序遍历
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 429. N 叉树的层序遍历 题目描述: 解法 使用队列层序遍历就可以了。 先入根节点1。queue:1 然后出根节点1,入孩子节点2,3&a…...
常用UI自动化测试框架
🔍 常用UI自动化测试框架全览(Web / 移动 / 桌面 / AI驱动) UI(用户界面)测试框架是一类用于自动化测试应用图形界面的工具,帮助开发者和测试人员验证界面元素的功能性、交互性和视觉一致性。本文系统梳理了…...
C语言指针深入详解(五):回调函数、qsort函数
目录 一、回调函数 1、使用回调函数改造前 2、使用回到函数改造后 二、qsort使用举例 1、使用qsort函数排序整型数据 2、使用qsort排序结构数据 三、qsort函数模拟实现 结语 🔥个人主页:艾莉丝努力练剑 🍓专栏传送门:《…...
# YOLOv5:目标检测的新里程碑
YOLOv5:目标检测的新里程碑 在计算机视觉领域,目标检测一直是研究的热点和难点之一。近年来,随着深度学习技术的飞速发展,目标检测算法也取得了显著的进步。YOLO(You Only Look Once)系列算法以其高效的实…...
beanstalk一直被重新保留(reserved 状态)消息删除
说明:wallet是我的tube 完整流程示例 暂停 tube(防止任务被重新保留)pause-tube wallet 300踢回并删除任务kick 100000 # 踢回所有 reserved 任务 delete 183723 # 删除目标任务恢复 tube(取消暂停)pause-tu…...
NLP学习路线图(二): 概率论与统计学(贝叶斯定理、概率分布等)
引言 自然语言处理(NLP)作为人工智能的重要分支,致力于让机器理解、生成和操作人类语言。无论是机器翻译、情感分析还是聊天机器人,其底层逻辑都离不开数学工具的支持。概率论与统计学是NLP的核心数学基础之一,它们为…...
塔能智能照明方案——贵州某地区市政照明改造实践
在城市市政建设中,照明系统作为城市基础设施的重要组成部分,其能耗问题日益凸显。传统市政照明设备能耗高、运维效率低,成为城市绿色发展的阻碍。塔能科技针对这一痛点,为贵州某地区量身打造智能照明改造方案,通过技术…...
Mybatis的逆向工程Generator
Mybatis的逆向工程 什么是逆向工程 generator 简单点说,就是通过数据库中的单表,自动生成java代码。 Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\po类) 企业开发中&#…...
Runtime Suspend 专项训练
Q1. 什么是 Runtime PM?与 System Suspend 有什么区别? 答: Runtime PM(运行时电源管理)是 Linux 内核为单个设备提供的自动挂起机制。其核心思想是在设备空闲期间,关闭其时钟、电源、总线连接等资源&…...
香港科技大学(广州)智能制造理学硕士招生宣讲会——深圳大学专场
深圳大学专场宣讲会 时间:5月22日(星期四)19:00-20:00 地点:深圳大学沧海校区致原楼1101 🎓主讲嘉宾: 汤凯 教授 https://facultyprofiles.hkust-gz.edu.cn/faculty-personal-page/TANG-Kai/mektang …...
使用MacPro 安装flutter开发环境 详细教程
Mac 有 英特尔芯片 和 苹果芯片,故安装路径可能略有不同,但是思路 大致一样,以下内容仅供小伙伴们参考: 首先下载环境安装的软件,并推荐使用稳定版本。 gralde 8.5 点击下载 android studio 点击下载 jdk 点击下载…...
常见的 API 及相关知识总结
常见的 API 及相关知识总结 一、Math 类 Math 类提供了许多用于数学计算的静态方法和常量。 常见方法总结 方法描述Math.abs()返回一个数的绝对值Math.ceil()返回大于或等于给定数字的最小整数Math.floor()返回小于或等于给定数字的最大整数Math.round()对一个数进行四舍五…...
7-Zip软件下载与使用攻略:如何使用7z格式解压缩更高效?
在数字化文件管理中,压缩与解压缩工具的选择至关重要。7-Zip是一款广受欢迎的开源软件,以其高效的压缩率和多种格式支持而备受推崇。然而,解压专家作为另一款优秀的解压缩软件,同样值得关注。本文将为您推荐7-Zip的下载渠道&#…...
第 84 场周赛:翻转图像、字符串中的查找与替换、图像重叠、树中距离之和
Q1、[简单] 翻转图像 1、题目描述 给定一个 n x n 的二进制矩阵 image ,先 水平 翻转图像,然后 反转 图像并返回 结果 。 水平翻转图片就是将图片的每一行都进行翻转,即逆序。 例如,水平翻转 [1,1,0] 的结果是 [0,1,1]。 反转…...
SkyReels-V2:开启无限时长电影生成新时代
AI 在视频生成领域的突破尤为引人注目,为内容创作带来了全新的可能性。而 SkyReels-V2 的问世,更是如同一场革命,彻底颠覆了人们对视频生成技术的认知,开启了无限时长电影生成的新时代。 一、背景与挑战 回顾视频生成技术的发展…...
教师可用的申报书——基于GAI的小学数学课堂跨学科支架设计与实践
课题申报书:基于GAI的小学数学课堂跨学科支架设计与实践 (一)立项依据与研究内容 1. 项目的立项依据 1.1 研究意义 2025年《教育强国建设规划纲要》明确提出“推动学科融合发展”,《信息化标准建设行动计划(2024-2027年)》强调技术赋能教育创新。小学数学作为基础学科,…...
79、modelsim单独仿真altera带IP核的文件
1.编译 quartus 仿真库(如果有就不用编译了) 编译完成后 sim 文件夹中产生一个 verilog_libs 文件夹,打开文件夹 以上便是编译产生的库,将库添加到 modelsim 中也就是观察此文件中的 modelsim.ini 与 modelsim 安装目录下此…...
将 Workbook 输出流直接上传到云盘
如果不想将 Excel 文件保存到本地,而是希望直接将输出流上传到云存储(如阿里云OSS、腾讯云COS、七牛云等),可以采用以下方法: 文章目录 1. 创建内存中的 Excel 输出流2. 上传到云存储的通用方法3. 具体云服务实现示例…...
【LINUX操作系统】日志系统——自己实现一个简易的日志系统
经过一段时间的操作系统的学习,现在是时候让读者朋友们利用学过的技术知识自己完成一个简单的日志系统。认识、了解日志系统既是对已有多线程知识的运用,也是进一步提升项目技术能力的必须步骤。 1. 什么是日志 ⽇志认识 计算机中的⽇志是记录系统和软件…...
HTML页面渲染过程
前言 文章很长,凡是我觉得好的东西统统都塞进来了。看了很多的文章,有些说法甚至都不统一,所以还动用了AI搜索。总之希望这篇文章能有点用,如有错误,欢迎指正。 浏览器介绍 浏览器的主要组件包括: 界面…...
【八股战神篇】Java虚拟机(JVM)高频面试题
目录 专栏简介 一 请解释Java虚拟机(JVM)及其主要功能 延伸 1. JVM的基本概念 2. JVM的主要功能 二 对象创建的过程了解吗 延伸 1.Java 创建对象的四种常见方式 三 什么是双亲委派模型 延伸 1.双亲委派机制的作用: 2.双亲委派模型…...
微店商品详情接口开发指南
接口概述 微店商品详情接口(/api/v1/product/detail)用于获取商品的完整信息,包括标题、价格、库存、SKU、主图等数据,支持OAuth2.0鉴权。 点击获取key和secret 请求方式 GET https://open.weidian.com/api/v1/product/detail …...
拦截指定注解(FeignClient),补偿重试
拦截指定注解(FeignClient),补偿重试;对代码无入侵 避免正常调用和重试逻辑调用重复插入; 根据自己的业务需求 插入新数据时 是否需要删除之前的旧数据,防止数据覆盖 import cn.hutool.core.util.ObjectUti…...
使用 GitHub Pages 部署单页面应用教程
## 简介 GitHub Pages 是 GitHub 提供的一个静态网站托管服务,可以免费托管个人、项目或组织页面。本教程将指导您如何部署一个单页面应用到 GitHub Pages。 ## 前提条件 - 拥有 GitHub 账号 - 已安装 Git - 已安装 Node.js(如果使用前端框架&#x…...
day16-17-磁盘管理
1. 磁盘分类 磁盘接口 硬盘 大小 sata接口 机械硬盘、固态硬盘 机械:4tb 10k性能要求不高 sas接口 机械硬盘、固态硬盘 机械:900G 15k性能好,容量低 pcie-e接口 固态硬盘 tb级别 4tb 8tb 性能要求高,数据库,…...
【神经网络与深度学习】扩散模型之通俗易懂的解释
引言: 扩散模型(Diffusion Models)是近年来深度学习领域的一项重要突破,尤其在生成式人工智能(Generative AI)中展现了惊人的能力。它的核心思想类似于一个孩子学习搭建乐高城堡的过程——先拆散࿰…...
Linux Bash 中 $? 的详细用法
Bash (Bourne Again SHell) 是使用最广泛的 SHell 脚本语言之一,因为它与 Unix 和 Linux 系统兼容。它提供了许多内置函数和变量,使脚本编写更高效,更不容易出错。其中一个变量是 $?, 它是 Bash 脚本错误处理的一个组成部分。这个…...
嵌入式培训之系统编程(一)标准IO、文件操作
目录 一、系统编程概述 二、标准IO (一)(以计算机为中心)标准IO (二)io的分类 (三)man命令 三、文件读写操作 (一)文件操作步骤 (二&#…...
NVIDIA Earth-2 AI 天气模型 DLI 课程:解锁全球风云的未来之匙
电影闲聊引发思索之言: 曾几何时,当我们闲聊起那些描绘美国气候的大电影时(龙卷风-后天等美国大片),仿佛被带入了一个个奇幻而真实的气象世界。从狂风暴雨到烈日炎炎最后到冰天雪地,电影里的场景让我们对气…...
至此(day1-day4)代码详解(ai辅助整理)
至此(day1-day4)代码详解 ipl10.nas ; 第一阶段引导程序 ; 功能:读取磁盘数据并跳转到第二阶段加载程序 ; 编译参数:nask -o ipl10.bin ipl10.nasCYLS EQU 10 ; 预设读取柱面数(实际值由BIOS决定)ORG…...
STM32F103_LL库+寄存器学习笔记12.2 - 串口DMA高效收发实战2:进一步提高串口接收的效率
导言 通过优化代码算法,在串口空闲中断回调里不需要暂时关闭DMA接收,达到提高串口接收的效率。在IDLE接收中断里关闭DMA接收会导致接收过程中有数据丢失风险(关DMA的瞬间如果有数据到来,会丢帧!)。 回顾一…...
conda 设置env后,环境还是安装在c盘的解决方式:
1|设置 envs 文件夹权限 右键【envs】文件夹,选择【属性】 选择【安全】,点击【编辑】 选中【Users(用户名\Users)】,选中运行所有权限,如图所示 点击【确认】,确保修改被保存 2、环境变量path设置 选择【高级系统设置…...
设计模式 - 工厂模式
简单工厂模式 public class CoffeeFactory {public Coffee get(string coffeeType) {Coffee coffee null;if ("American".equals(coffeeType)) {coffee new AmericanCoffee();} else if ("Latte".equals(coffeeType)) {coffee new LatteCoffee();}retur…...