当前位置: 首页 > news >正文

Hive 的 Hook 机制 完全解析

        Hive 的 Hook 是一种扩展机制,允许用户在执行查询时自定义行为,例如日志记录、审计或其他操作。Hook 通常在 Hive 的生命周期中某些关键节点被触发,开发者可以插入自定义代码执行特定任务。


一、Hook 的用途和核心概念

1. 用途
  • 审计:记录查询的执行信息(如用户、时间、执行语句)。
  • 安全性:检查用户权限,防止非法操作。
  • 监控:统计运行指标,例如查询时间、资源使用量。
  • 调试和优化:动态插入优化或调试逻辑。
2. 核心概念

        Hive Hook 的实现基于事件驱动模型,通过定义接口和生命周期钩子,用户可以插入自定义代码。Hive 提供了三种 Hook 类型:

  1. Pre-Hook:在查询执行之前触发。
  2. Post-Hook:在查询成功完成后触发。
  3. Failure-Hook:在查询执行失败时触发。

二、原理分析

1. Hook 的配置与加载

Hive 的 Hook 是通过配置文件 hive-site.xml 或环境变量加载的。关键参数包括:

  • hive.exec.pre.hooks:指定 Pre-Hook 的实现类。
  • hive.exec.post.hooks:指定 Post-Hook 的实现类。
  • hive.exec.failure.hooks:指定 Failure-Hook 的实现类。

Hive 在启动时,会通过反射机制动态加载这些类,并在相应的生命周期节点调用。

<property><name>hive.exec.pre.hooks</name><value>com.example.MyPreHook</value>
</property>
<property><name>hive.exec.post.hooks</name><value>com.example.MyPostHook</value>
</property>
<property><name>hive.exec.failure.hooks</name><value>com.example.MyFailureHook</value>
</property>

2. Hook 的执行流程

Hive 的查询执行分为多个阶段,例如语法解析、语义分析、执行计划生成、任务执行等。Hook 通常在以下阶段触发:

  1. 查询开始:触发 Pre-Hook。
  2. 任务执行完成:触发 Post-Hook。
  3. 任务失败:触发 Failure-Hook。

在源代码层面,Hook 的执行主要由以下几个组件负责:

  • Driver 类:Hive 的核心执行引擎,负责管理查询的生命周期。
  • SessionState 类:管理会话状态,包括 Hook 的注册和执行。
  • HookRunner 类:专门负责 Hook 的执行。
3. HookRunner 的实现

HookRunner 是 Hive 中执行 Hook 的关键类,其代码逻辑如下(简化版):

public class HookRunner {private List<Hook> preHooks;private List<Hook> postHooks;private List<Hook> failureHooks;public HookRunner(SessionState sessionState) {this.preHooks = sessionState.getHooks(HookContext.HookType.PRE_EXEC_HOOK);this.postHooks = sessionState.getHooks(HookContext.HookType.POST_EXEC_HOOK);this.failureHooks = sessionState.getHooks(HookContext.HookType.ON_FAILURE_HOOK);}public void runPreHooks(HookContext context) throws Exception {for (Hook hook : preHooks) {hook.run(context);}}public void runPostHooks(HookContext context) throws Exception {for (Hook hook : postHooks) {hook.run(context);}}public void runFailureHooks(HookContext context) throws Exception {for (Hook hook : failureHooks) {hook.run(context);}}
}


4. HookContext

HookContext 是 Hook 执行时的上下文,包含查询执行的详细信息,例如:

  • 当前用户
  • 查询语句
  • 执行计划
  • 会话信息
  • 运行环境(本地、远程等)

开发者可以通过 HookContext 获取这些信息并进行操作。

public class HookContext {private QueryPlan queryPlan;private String userName;private HiveConf conf;// Getters and other utility methods
}

三、实现自定义 Hook 的步骤

1. 实现 Hook 接口

Hive 的 Hook 需要实现 org.apache.hadoop.hive.ql.hooks.Hook 接口,或其子接口之一:

  • ExecuteWithHookContext:支持 HookContext
  • Execute:简单接口,只接收一个字符串。

示例:实现一个简单的 Pre-Hook,记录查询的开始时间。

public class MyPreHook implements ExecuteWithHookContext {@Overridepublic void run(HookContext hookContext) {System.out.println("Query started: " + hookContext.getQueryPlan().getQueryString());System.out.println("User: " + hookContext.getUserName());}
}
2. 配置 Hook

在 hive-site.xml 中配置:

<property><name>hive.exec.pre.hooks</name><value>com.example.MyPreHook</value>
</property>
3. 验证 Hook

执行任意 Hive 查询,观察日志输出。例如:

SELECT * FROM my_table;

四、案例解析:从源代码到执行过程

  1. Driver 类

    • 接收 SQL 查询,启动执行流程。
    • 调用 HookRunner 执行 Pre-Hook。
  2. HookRunner 执行 Pre-Hook

    • 加载 hive.exec.pre.hooks 中的类。
    • 初始化 HookContext,填充用户、查询等信息。
    • 按顺序调用 Hook。
  3. 任务执行完成后

    • 调用 HookRunner 执行 Post-Hook。
  4. 任务失败

    • 调用 HookRunner 执行 Failure-Hook。

五、详细原理总结

  1. 事件驱动:通过查询生命周期事件触发。
  2. 反射加载:通过配置指定 Hook 类,使用反射动态加载。
  3. 上下文传递:通过 HookContext 提供丰富的执行信息。
  4. 扩展性强:开发者可定制任何逻辑,无需修改 Hive 核心代码。

        通过这些设计,Hive 的 Hook 机制在灵活性和可扩展性上表现出色,同时对用户透明,不干扰正常的查询执行逻辑。


是什么的问题解决了,下面是能干什么和怎么干了


        Hive 的 Hook 是一种灵活的扩展机制,它允许开发者在查询执行生命周期的特定阶段插入自定义逻辑。这种机制在底层基于事件触发和反射加载,通过简单配置即可实现复杂的功能。以下是详细介绍和分析:


Hook 可以用来做什么

Hive 的 Hook 主要用于以下场景:

1. 查询审计

用途:记录用户查询日志,包括执行的 SQL、查询时间、用户信息等,以便进行后续的审计和问题排查。

实现逻辑

  • 在 Pre-Hook 中记录查询的开始时间和用户信息。
  • 在 Post-Hook 中记录查询的成功完成时间和结果。
  • 在 Failure-Hook 中记录查询失败的原因。

代码示例

public class AuditHook implements ExecuteWithHookContext {@Overridepublic void run(HookContext hookContext) {String query = hookContext.getQueryPlan().getQueryString();String user = hookContext.getUserName();System.out.println("User: " + user + ", Query: " + query + ", Status: Started");}
}

底层原理

  • HookContext 提供了查询计划 (QueryPlan) 和用户信息。
  • Hive 在 Driver 类中触发 Hook,执行开发者实现的逻辑。

2. 权限检查(实际上用得不多,有专门的权限管理工具)

用途:确保用户对查询的资源有适当的权限,防止未经授权的访问。

实现逻辑

  • 在 Pre-Hook 中检查用户权限,验证是否允许访问指定表或列。
  • 如果发现权限不足,则抛出异常,终止查询执行。

代码示例

public class AuthorizationHook implements ExecuteWithHookContext {@Overridepublic void run(HookContext hookContext) {String user = hookContext.getUserName();QueryPlan queryPlan = hookContext.getQueryPlan();// 假设有一个权限管理工具 AuthManagerfor (TableScanOperator tableScan : queryPlan.getTableScanOperators()) {String tableName = tableScan.getConf().getAlias();if (!AuthManager.hasAccess(user, tableName)) {throw new RuntimeException("User " + user + " does not have access to table " + tableName);}}}
}

底层原理

  1. 查询计划解析:Hive 的 QueryPlan 对象包含 SQL 的逻辑执行计划,TableScanOperator 提供了查询的表名和列信息。
  2. 权限验证:开发者可以接入企业的权限管理工具,通过用户身份验证访问权限。
  3. 异常终止:如果权限不足,通过抛出异常让 Hive 停止查询。

3. 性能监控

用途:实时收集查询的性能数据,例如执行时间、消耗资源、任务分布等,用于系统优化和资源管理。

实现逻辑

  • Pre-Hook:记录查询的开始时间。
  • Post-Hook:计算查询总耗时,统计资源使用。
  • Failure-Hook:记录失败任务的资源消耗和原因。

代码示例

public class PerformanceMonitorHook implements ExecuteWithHookContext {@Overridepublic void run(HookContext hookContext) {String query = hookContext.getQueryPlan().getQueryString();long startTime = System.currentTimeMillis();hookContext.getConf().set("start_time", String.valueOf(startTime));// Post-Hook 中可以继续处理System.out.println("Query started: " + query + " at " + startTime);}
}

底层原理

  1. 时间统计:通过 System.currentTimeMillis() 或 System.nanoTime() 记录执行开始和结束时间。
  2. 资源信息收集:结合 Hive 的 JobTracker 或 Yarn 的日志 API,收集任务的内存、CPU 使用情况。
  3. 上下文存储:通过 HookContext 或配置对象 HiveConf 在不同 Hook 阶段共享信息。

4. 数据质量验证

用途:在数据查询或写入时自动检查数据是否符合质量标准,例如是否存在重复值、是否符合特定格式等。

实现逻辑

  • 在 Pre-Hook 中对查询语句进行分析,检测可能导致数据质量问题的操作。
  • 在 Post-Hook 中对查询结果进行校验,例如检查空值或数据不一致情况。

代码示例

public class DataQualityHook implements ExecuteWithHookContext {@Overridepublic void run(HookContext hookContext) {QueryPlan queryPlan = hookContext.getQueryPlan();String query = queryPlan.getQueryString();// 假设需要检查插入操作是否满足某些条件if (query.toLowerCase().contains("insert")) {// 模拟检查逻辑boolean isDataValid = DataValidator.validate(queryPlan);if (!isDataValid) {throw new RuntimeException("Data quality check failed for query: " + query);}}}
}

底层原理

  1. SQL 分析:通过 QueryPlan 或 SemanticAnalyzer 获取 SQL 的操作类型和目标表信息。
  2. 结果校验:结合 Hive 的查询结果集(如 HDFS 文件或中间结果),进行数据一致性检查。
  3. 验证工具集成:支持接入外部工具,如 Apache Griffin、Great Expectations 等。

5. 操作自动化

用途:在查询执行时自动完成某些重复性操作,例如备份表数据、自动加载外部配置等。

实现逻辑

  • 在 Pre-Hook 中动态调整查询配置或自动加载依赖数据。
  • 在 Post-Hook 中对查询结果进行二次处理,例如生成报表。

代码示例

public class AutomationHook implements ExecuteWithHookContext {@Overridepublic void run(HookContext hookContext) {String query = hookContext.getQueryPlan().getQueryString();if (query.toLowerCase().contains("backup")) {// 模拟自动备份逻辑String tableName = getTableName(query);BackupManager.backupTable(tableName);System.out.println("Table " + tableName + " has been backed up.");}}private String getTableName(String query) {// 简单解析逻辑,真实场景可能需要更复杂的 SQL 解析return query.split(" ")[2];}
}

底层原理

  1. 动态配置:通过 HookContext 修改 Hive 的运行时配置,动态调整查询行为。
  2. 外部系统集成:调用外部服务或工具(如数据备份工具)。
  3. 事件驱动:自动化操作依赖 SQL 内容或运行结果触发。

6. 调试和开发

用途:通过 Hook 注入调试逻辑,例如记录中间执行计划、跟踪语法和语义分析结果,帮助开发者定位问题。

实现逻辑

  • 在 Pre-Hook 中打印解析后的逻辑计划。
  • 在 Failure-Hook 中记录错误栈信息。

代码示例

public class DebugHook implements ExecuteWithHookContext {@Overridepublic void run(HookContext hookContext) {QueryPlan plan = hookContext.getQueryPlan();System.out.println("Logical Plan: " + plan.getRootTasks());}
}

底层原理

  1. 查询计划解析QueryPlan 提供了任务依赖图(DAG),开发者可以分析任务的逻辑结构。
  2. 错误追踪Failure-Hook 中的上下文对象包含详细的错误信息,包括异常堆栈。

底层原理总结

  1. 事件驱动机制:Hook 机制基于 Hive 查询生命周期中的特定事件触发,通过 Driver 类和 HookRunner 实现。
  2. 上下文传递HookContext 提供查询的完整上下文,开发者可以轻松访问用户、查询计划、配置等信息。
  3. 动态加载与反射:Hive 使用反射加载 Hook 类,基于 hive-site.xml 的配置实现无侵入式扩展。
  4. 扩展性强:开发者可自由定义 Hook,实现从简单记录到复杂集成的功能,增强系统的功能和灵活性。

        通过这些机制,Hive 的 Hook 可以支持多种应用场景,从性能监控到安全审计,为数据平台的管理与优化提供了强大的工具。


下面是更深层次的原理


更深入的底层原理剖析

Hive 的 Hook 机制背后,基于以下几个核心的设计原则和技术实现:


1. Hook 的生命周期管理

Hive 中的 Hook 被设计为在查询执行的不同阶段自动触发。这些阶段由 Hive 的核心类 Driver 统一管理。以下是关键执行点:

(1)Driver 的核心工作流

Hive 查询的执行由 Driver.run() 方法控制。其执行逻辑如下(简化版):

public int run(String command) {// 1. 初始化 HookRunnerHookRunner hookRunner = new HookRunner(SessionState.get());try {// 2. 触发 Pre-HookhookRunner.runPreHooks(new HookContext(...));// 3. 执行查询计划compile(command);  // 语法解析、语义分析execute();         // 生成任务并提交到执行引擎(如 MapReduce、Tez)// 4. 触发 Post-HookhookRunner.runPostHooks(new HookContext(...));return 0;} catch (Exception e) {// 5. 触发 Failure-HookhookRunner.runFailureHooks(new HookContext(...));throw e;}
}
(2)Hook 的触发机制
  • Pre-Hook:在 compile() 方法执行前触发,用于初始化工作,如检查权限、记录日志等。
  • Post-Hook:在 execute() 成功完成后触发,用于后续处理工作,如生成报表或更新状态。
  • Failure-Hook:在执行过程中捕获异常后触发,用于记录错误和恢复机制。

2. Hook 类的动态加载

Hive 的 Hook 是通过 Java 反射 动态加载的,所有 Hook 类都需要实现 org.apache.hadoop.hive.ql.hooks.Hook 接口或其子接口。

(1)Hook 的加载机制

HookRunner 会根据 hive-site.xml 的配置项动态加载 Hook 类:

  • 配置项如 hive.exec.pre.hooks 是一个逗号分隔的类名列表。
  • SessionState 负责解析这些配置,并加载对应的 Hook 类。

代码示例:

public class SessionState {public <T extends Hook> List<T> getHooks(String hookType) {String hooksStr = hiveConf.get(hookType, ""); // 从配置读取 Hook 类名List<T> hooks = new ArrayList<>();for (String className : hooksStr.split(",")) {try {// 动态加载类T hook = (T) ReflectionUtils.newInstance(Class.forName(className), conf);hooks.add(hook);} catch (Exception e) {throw new RuntimeException("Failed to load Hook: " + className, e);}}return hooks;}
}
(2)反射加载的优势
  1. 无侵入性:开发者只需实现接口并在配置中指定,无需修改 Hive 的核心代码。
  2. 高扩展性:可以动态加载多个 Hook 类,按需组合功能。

3. HookContext 的作用

   HookContext 是 Hive 的 Hook 执行上下文,它在 Hook 中扮演关键角色,为开发者提供查询的所有相关信息。

(1)HookContext 的主要内容

HookContext 的设计注重信息的全面性,核心字段包括:

  • QueryPlan:查询的逻辑计划,包含 SQL 操作类型、表名、列名等信息。
  • UserName:当前执行查询的用户。
  • HiveConf:Hive 的运行时配置,可以动态调整。
  • OperationName:操作类型(如 SELECT、INSERT)。
  • ExecutionMode:运行模式(如 LOCAL、MAPREDUCE)。
  • JobInfo:任务级别的信息(如 MapReduce 作业)。

代码示例:

public class HookContext {private QueryPlan queryPlan;private String userName;private HiveConf conf;private String operationName;private String executionMode;public HookContext(QueryPlan queryPlan, String userName, HiveConf conf) {this.queryPlan = queryPlan;this.userName = userName;this.conf = conf;}// Getter methodspublic QueryPlan getQueryPlan() { return queryPlan; }public String getUserName() { return userName; }public HiveConf getConf() { return conf; }public String getOperationName() { return operationName; }public String getExecutionMode() { return executionMode; }
}
(2)信息的动态获取与使用
  • 查询计划解析:通过 QueryPlan 获取所有表和列的元信息。
  • 用户权限检查:通过 UserName 与权限系统集成。
  • 动态调整配置:通过 HiveConf 修改运行时行为(如启用调试模式)。

4. 扩展 Hook 的设计模式

Hive Hook 通过接口和多态实现了松耦合的设计,方便开发者按需扩展。以下是几种典型模式:

(1)链式调用

多个 Hook 可以按顺序执行,每个 Hook 都有独立的逻辑,彼此之间互不影响。

代码实现:

public class HookRunner {public void runHooks(List<Hook> hooks, HookContext context) {for (Hook hook : hooks) {hook.run(context); // 依次执行}}
}

优点:

  • 模块化:每个 Hook 专注于单一任务(如审计或监控)。
  • 灵活性:可以动态调整 Hook 的执行顺序或增减 Hook。
(2)责任链模式

        一个 Hook 的执行结果可以影响后续 Hook 的行为。例如,某个 Pre-Hook 可以动态修改查询计划,从而影响后续 Hook 的输入。

示例:

public class ModifyQueryHook implements ExecuteWithHookContext {@Overridepublic void run(HookContext hookContext) {QueryPlan plan = hookContext.getQueryPlan();// 动态修改查询计划plan.addHint("useIndex=true");}
}

5. Hive Hook 的优缺点

优点
  1. 灵活性:支持多种应用场景,如审计、监控、权限管理等。
  2. 易用性:开发者只需实现简单接口即可实现复杂功能。
  3. 低耦合性:通过反射动态加载 Hook 类,不影响 Hive 核心代码。
  4. 强扩展性:支持同时配置多个 Hook,可随需求扩展。
缺点
  1. 调试难度较高:Hook 是动态加载的,调试时需确认加载顺序和上下文信息。
  2. 性能开销:每个 Hook 都会增加查询的额外逻辑,若 Hook 过多可能影响性能。
  3. 隐蔽性:不熟悉 Hook 的用户可能难以察觉其对查询行为的影响。

6. 综合总结

        Hive 的 Hook 是一种基于事件驱动、动态加载的扩展机制,允许开发者在查询生命周期的各个阶段注入自定义逻辑。其设计简单却功能强大,适用于日志记录、权限验证、性能监控、数据质量检查、自动化等多种场景。

        通过 Driver 管理生命周期、HookRunner 调用 Hook、HookContext 提供执行上下文,Hive 实现了高效且灵活的扩展能力,为复杂数据处理系统提供了强大的工具支持。

相关文章:

Hive 的 Hook 机制 完全解析

Hive 的 Hook 是一种扩展机制&#xff0c;允许用户在执行查询时自定义行为&#xff0c;例如日志记录、审计或其他操作。Hook 通常在 Hive 的生命周期中某些关键节点被触发&#xff0c;开发者可以插入自定义代码执行特定任务。 一、Hook 的用途和核心概念 1. 用途 审计&#x…...

远程debug

这里写自定义目录标题 一、首先配置idea二、配置jvm1、将刚才idea生成的jvm指令复制下来&#xff0c;就是如下内容&#xff08;注意要从你的idea中复制&#xff09;2、在粘贴之前&#xff0c;要拼接上java-jar命令&#xff0c;还有servery,suspendy命令&#xff0c;最后拼接项目…...

一些常见网络安全术语

1、黑帽 为非法目的进行黑客攻击的人&#xff0c;通常是为了经济利益。他们进入安全网络以销毁&#xff0c;赎回&#xff0c;修改或窃取数据&#xff0c;或使网络无法用于授权用户。这个名字来源于这样一个事实&#xff1a;老式的黑白西部电影中的恶棍很容易被电影观众识别&…...

golang学习,小结

切片 切片&#xff0c;底层就是数组&#xff0c;len&#xff08;切片的长度&#xff09;和cap&#xff08;容量&#xff0c;切片的空间&#xff09; 从一个数组来得到切片&#xff0c;修改切片会修改原来的数组&#xff0c;数据会收到影响 我们可以通过内置的 append 函数对一…...

【C++ map和set】数据的吟游诗:Map与Set的双城记

公主请阅 set1.序列式容器和关联式容器2.set的介绍3.set的构造和迭代器部分set可以进行去重操作的&#xff0c;在去重的同时可以对插入进来的数字进行排序的操作4.set的增删查inserterasefindupper_bound和 lower_bound 5.multiset和set的差异6相关题目349.两个数组的交集142.环…...

leetcode 之 二分查找(java)(3)

文章目录 5. 81. 搜索旋转排序数组 II6. 378、有序矩阵中第k个小的元素 5. 81. 搜索旋转排序数组 II 题目描述&#xff1a; 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#…...

后端返回前端的数据量过大解决方案

后端返回前端的数据量过大解决方案 性能面板(Performance) chrome调试指南 原因 遇到一个页面有好几个表格&#xff0c;部分表格采用虚拟滚动条 数据量有点大 接近快60s了&#xff0c;看一下是哪里导致的慢 后台请求方法执行并不慢 2024-12-04 15:21:52.889 INFO 69948 …...

STL算法之其它算法_下

random_shuffle 这个算法将[first,last)的元素次序随机排列。也就说&#xff0c;在N!中可能的元素排列中随机选出一种&#xff0c;此处N为last-first。 N个元素的序列&#xff0c;其排列方式为N!中&#xff0c;random_shuffle会产生一个均匀分布&#xff0c;因此任何一个排列被…...

MySQL如何区分幻读和不可重复读

在MySQL中&#xff0c;幻读和不可重复读都是并发事务中可能出现的问题&#xff0c;但它们的表现和原因略有不同。 不可重复读 (Non-Repeatable Read) 不可重复读是指在同一个事务内&#xff0c;多次读取同一行数据时&#xff0c;可能会得到不同的结果。这种情况发生在一个事务…...

html ul li 首页渲染多条数据 但只展示八条,其余的数据全部隐藏,通过icon图标 进行展示

<div style"float: left;" id"showMore"> 展开 </div> <div style"float: left;“id"hideLess"> 收起 </div> var data document.querySelectorAll(.allbox .item h3 a); const list document.querySelectorAl…...

Vue3安装 运行教程

本文是综合了所有vue安装教程而成 更细化 更简略 希望对各位读者有所帮助&#xff01; Vue安装 1. Vue-cli脚手架安装 安装vue的方式有很多 我们这里选择npm方式安装vue npm方式 npm方式安装vue&#xff0c;详细介绍见下文。 1.node.js安装和配置 安装npm 需要安装note.js&…...

Spring事务的一道面试题

每次聊起Spring事务&#xff0c;好像很熟悉&#xff0c;又好像很陌生。本篇通过一道面试题和一些实践&#xff0c;来拆解几个Spring事务的常见坑点。 原理 Spring事务的原理是&#xff1a;通过AOP切面的方式实现的&#xff0c;也就是通过代理模式去实现事务增强。 具体过程是&a…...

PHP SM4 加密

PHP SM4 加密 sm4基类 class Sm4 {private $ck [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,0xc0c7ced5, 0xdce3ea…...

群控系统服务端开发模式-应用开发-短信工厂腾讯云短信开发

一、腾讯云短信工厂开发 1、添加框架对应的SDK composer require tencentcloud/tencentcloud-sdk-php 2、添加腾讯云工厂 在根目录下extend文件夹下Sms文件夹下channel文件夹下&#xff0c;创建腾讯云短信发送工厂并命名为TencentSmsSender。记住&#xff0c;一定要在腾讯云短…...

vue key属性强制刷新组件

在 Vue 中&#xff0c;key 属性通常用来帮助 Vue 跟踪每个组件或元素的身份&#xff0c;尤其是在使用 v-for 渲染列表时。当 key 值发生变化时&#xff0c;Vue 会销毁并重新渲染组件&#xff0c;这也可以用于强制刷新组件。 如果你想强制刷新一个组件&#xff0c;可以通过动态…...

浪潮X86服务器NF5280、8480、5468、5270使用inter VROC Raid key给NVME磁盘做阵列

浪潮服务器inter VROC Raid key给NVME磁盘做阵列方法 Inter VROC技术简介Raid Key 授权&#xff0c;即VROC SKU兼容性处理器兼容性列表平台和芯片组兼容性列表各Raid级别最大磁盘数量硬盘型号操作系统 服务器上的操作安装Raid Key确认服务器能识别硬盘识别磁盘所在的通道及服务…...

最长最短单词

最长最短单词 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入1行句子&#xff08;不多于200个单词&#xff0c;每个单词长度不超过100&#xff09;&#xff0c;只包含字母、空格和逗号。单词由至少一…...

Muduo网络库剖析 --- 架构设计

文章目录 前言概述篇一、Muduo网络库简介Reactor事件处理模式 二、基于muduo实现简易聊天服务器实现测试运行 三、muduo的架构设计Reacor模式muduo框架架构解析主从Reactor工作流程主线程(main Reactor)工作线程(sub Reactor) 线程分配与负载均衡 四、总结线程分配与负载均衡 四…...

lwip raw、netcoon、socket三种接口编程的区别

目录 一、前言 二、LWIP 简介 三、LWIP RAW 编程 1.概念与原理 2.编程模型与流程 3.示例代码 4.优点与缺点 四、LWIP NETCONN 编程 1.概念与原理 2.编程模型与流程 3.示例代码 4.优点与缺点 五、LWIP SOCKET 编程 1.概念与原理 2.编程模型与流程 3.示例代码 …...

在办公室环境中用HMD替代传统显示器的优势

VR头戴式显示器&#xff08;HMD&#xff09;是进入虚拟现实环境的一把钥匙&#xff0c;拥有HMD的您将能够在虚拟现实世界中尽情探索未知领域&#xff0c;正如如今的互联网一样&#xff0c;虚拟现实环境能够为您提供现实中无法实现的或不可能实现的事。随着技术的不断进步&#…...

P3916 图的遍历(Tarjan缩点和反向建边)

P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 写法一&#xff1a;Tarjan 思路&#xff1a;先运用Tarjan算法得到每个连通块中最大的编号&#xff0c;然后对每个连通块进行缩点重新建图&#xff0c;进行dfs&#xff0c;得到缩点后的连通块能够达到的最大编号。 Code: conste…...

Element UI 的 el-tree 组件e中默认展开前两层,设置 default-expanded-keys 属性来实现

在使用 Element UI 的 el-tree 组件时&#xff0c;如果你希望默认展开树的前两层节点&#xff0c;可以通过设置 default-expanded-keys 属性来实现。这个属性接受一个数组&#xff0c;数组中的值是需要默认展开的节点的 key。 首先&#xff0c;你需要确保你的每个树节点都有唯…...

Vue 项目中未登录状态如何统一处理

在 Vue 项目中&#xff0c;处理未登录状态&#xff08;比如用户访问需要登录的页面时&#xff09;是一项常见的需求。为了实现这一需求&#xff0c;我们通常使用 Vue Router 配合 Vuex 或者 Vue 的全局状态管理来统一处理未登录的状态&#xff0c;确保用户只能访问允许的页面。…...

Java 集合:强大的数据管理工具

在 Java 编程中&#xff0c;集合是一种非常重要的工具&#xff0c;它提供了一种方便的方式来存储和操作一组对象。本文将深入探讨 Java 集合框架&#xff0c;包括其主要类型、特点、用法以及一些最佳实践。 一、引言 在软件开发过程中&#xff0c;我们经常需要处理一组数据。…...

Creating Server TCP listening socket *:6379: bind: No error

启动redis报错&#xff1a;Creating Server TCP listening socket *:6379: bind: No error 解决方案&#xff1a; 1、直接在命令行中输入 redis-cli.exe 2、输入shutdown&#xff0c;关闭 3、输exit&#xff0c;退出 4、重新输入 redis-server.exe redis.windows.conf&…...

iOS免费共享企业证书、苹果最新企业证书免费获取

前言 大家可能都注意到了&#xff0c;苹果手机和安卓手机在安装软件上有点不一样。如果你在苹果手机上想装那些没在官方商店&#xff08;App Store&#xff09;里的软件&#xff0c;那就得给它们“签个名”&#xff0c;就像是给它们盖个章&#xff0c;这样手机才能认识它们&am…...

如果用Python写爬虫,具体怎么实现随机请求间隔呢?

在Python中实现随机请求间隔&#xff0c;通常使用time.sleep()函数结合random模块来生成随机的等待时间。以下是一个具体的实现方法&#xff1a; 导入必要的模块 首先&#xff0c;你需要导入time和random模块&#xff1a; import time import random 设置随机间隔 然后&am…...

aws(学习笔记第十五课) 如何从灾难中恢复(recover)

aws(学习笔记第十五课) 如何从灾难中恢复 学习内容&#xff1a; 使用CloudWatch对服务器进行监视与恢复区域(region)&#xff0c;可用区(available zone)和子网(subnet)使用自动扩展(AutoScalingGroup) 1. 使用CloudWatch对服务器进行监视与恢复 整体架构 这里模拟Jenkins Se…...

nginx4层限速

Nginx的功能概述 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也可以作为邮件代理服务器等。它主要工作在7层&#xff08;应用层&#xff09;&#xff0c;但在某些场景下也可以实现部分4层&#xff08;传输层&#xff09;的功能。 关于4层限速 Nginx自身的限制&#x…...

Spring Cloud Alibaba 之 “Feign多参数构造”

在上一篇文章整合好了Feign&#xff0c;现在来总结以下Feign调用多参数方法的使用。 GET方式&#xff1a; Spring Cloud为Feign支持了Spring Mvc注解的。如果请求的是localhost:8083/test?id1&namecoco,那么如果我们这样写&#xff08;User实体类有这二个属性&#xff09…...

C#高级教程

目录 C# 特性&#xff08;Attribute&#xff09;C# 反射&#xff08;Reflection&#xff09;C# 属性&#xff08;Property&#xff09;C# 索引器&#xff08;Indexer&#xff09;C# 委托&#xff08;Delegate&#xff09;C# 事件&#xff08;Event&#xff09;C# 集合&#xf…...

c++ 位图和布隆过滤器

位图&#xff08;bitmap&#xff09; 定义 位图是一种使用位数组存储数据的结构。每一位表示一个状态&#xff0c;通常用于快速判断某个值是否存在&#xff0c;或者用来表示布尔类型的集合。 特点 节省空间&#xff1a;一个字节可以表示8个状态。高效操作&#xff1a;位操作…...

基于Springboot开发的云野旅游平台

一、功能介绍 云野旅游平台包含管理员、用户两个角色以及前后台系统。 前台系统功能 用户登录成功后&#xff0c;可以进行查看旅游路线、最新线路、旅游资讯、个人中心、后台管理、购物车、客服等功能模块。进行相对应操作。 后台系统功能 管理员或用户登录成功后&#xf…...

微服务即时通讯系统(5)用户管理子服务,网关子服务

用户管理子服务&#xff08;user文件&#xff09; 用户管理子服务也是这个项目中的一个业务最多的子服务&#xff0c;接口多&#xff0c;但是主要涉及的数据表只有user表&#xff0c;Redis的键值对和ES的一个搜索引擎&#xff0c;主要功能是对用户的个人信息进行修改管理&#…...

docker.io连接超时的处理,用代理网站

docker pull的时候会超时&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 这时可以找一些代理网站&#xff0c;比如…...

【测试工具JMeter篇】JMeter性能测试入门级教程(四):JMeter中BeanShell内置方法使用

一、什么是BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简…...

JavaScript 键盘控制移动

如果你想通过 JavaScript 实现键盘控制对象&#xff08;比如一个方块&#xff09;的移动&#xff0c;下面是一个简单的示例&#xff0c;展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS&#xff1a; <!DOCTYPE html> <html lang"en">…...

如何预防服务器后台爆破攻击

服务器后台爆破&#xff08;Brute Force Attack&#xff09;是一种通过反复尝试用户名和密码组合&#xff0c;以非法获取系统访问权限的攻击方式。这种攻击不仅会消耗服务器资源&#xff0c;还可能导致合法用户被锁定或敏感数据泄露。为了有效预防服务器后台爆破攻击&#xff0…...

AI 写作(一):开启创作新纪元(1/10)

一、AI 写作&#xff1a;重塑创作格局 在当今数字化高速发展的时代&#xff0c;AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位&#xff0c;发挥着不可替代的作用。 随着信息的爆炸式增长&#xff0c;人们对于内容的需求日益旺盛。AI 写作能够…...

【HarmonyOS】鸿蒙应用使用lottie动画

【HarmonyOS】鸿蒙应用使用lottie动画 一、lottie动画是什么&#xff1f; https://airbnb.design/lottie Lottie是由Airbnb团队开发的一个适用于iOS、Android、React Native、Web和Windows的开源动画库&#xff0c;用于解析使用Bodymovin导出为JSON的Adobe After Effects动…...

SQL面试题——腾讯SQL面试题 合并连续支付订单

合并连续支付订单 现有一张用户支付表:user_pay包含字段订单ID,用户ID,商户ID,支付时间,支付金额。如果同一用户在同一商户存在多笔订单,且中间该用户没有其他商户的支付记录,则认为是连续订单,请把连续订单进行合并,时间取最早支付时间,金额求和。 +----------+------…...

【docker】10. 容器操作案例

容器操作案例 容器基本操作 • 通过 nginx 镜像文件创建容器 • 容器的列举(包含正在运行的容器) # 发现此时 e7c33d9f5c61 这个容器运行的状态为 Up,即运行状态 rootLAPTOP-H2EI4I6A:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED …...

postman测试

当然&#xff0c;以下是针对你提供的API层和Service层代码中涉及到的各个接口&#xff0c;如何使用 Postman 进行详细测试的指南。这个指南将帮助你理解如何配置 Postman 来测试这些接口&#xff0c;包括请求的构造、认证的处理、以及如何解读响应。 目录 准备工作接口测试指…...

【攻防实验】溯源与取证分析实验

溯源与取证分析实验 溯源取证分析作为网络攻防过程中重要环节&#xff0c;准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息)&#xff0c;对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或…...

【测试工具JMeter篇】JMeter性能测试入门级教程(七):JMeter断言

一、前言 在 JMeter 中&#xff0c;断言元件&#xff08;Assertion&#xff09;用于验证测试结果是否符合预期。断言元件可以检查服务器的响应数据&#xff0c;以确保它们符合期望的模式或值&#xff0c;从而验证性能测试脚本的正确性。断言元件通常在每个请求的响应中添加&am…...

Linux 常用命令

目录 一、ls 指令 二、pwd命令 三、cd 指令 1、cd 目录名 2、cd .. 返回上级目录 3、cd ~ 进入用户家目 4、cd - 返回最近访问目录 5、cd相对路径&&cd绝对路径 四、touch指令 五、mkdir指令 1、mkdir 目录名 创建一个目录 2、mkdir -p 递归创建多…...

汽车IVI中控OS Linux driver开发实操(二十八):回声消除echo cancellation和噪声消除Noise reduction

概述: 在当今高度互联的世界中,清晰的实时通信比以往任何时候都更重要。在远程团队会议期间,没有什么能像回声一样打断对话。当说话者听到他们的声音回响时,可能会分散注意力,甚至无法理解对话。即使是很小的回声也会产生很大的影响,仅仅25毫秒的振幅就足以造成声音干扰…...

003-SpringBoot整合Pagehelper

SpringBoot整合Pagehelper 一、引入依赖二、配置 application.yml三、配置 MybatisPlusConfig四、Controller五、ServiceImpl 一、引入依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</ar…...

零基础学安全--shell练习

目录 用shell写一个计算器 测试​ 一些小问题 n阶乘数 测试 拓展 写⼀个Shell脚本去筛选出eth0⽹卡的ipv4地址&#xff0c;并赋值⼀个变量输出 测试 无限重启 用shell写一个计算器 read -p "请输入数字a: " number1 read -p "请输入操作符&#xf…...

【专题】计算机网络之运输层(传输层)

1. 运输层协议概述 1.1 进程之间的通信 (1) 运输层的作用 运输层提供进程间的逻辑通信。 运输层的屏蔽作用&#xff1a; 运输层向高层用户屏蔽了下面网络核心的细节&#xff08;如网络拓扑、所采用的路由选择协议等&#xff09;&#xff0c;使应用进程看见的就是好像在两个运…...