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

6.824/6.5840 Lab 1: MapReduce

宁静的夏天

天空中繁星点点

心里头有些思念

思念着你的脸

——宁夏

完整代码见: https://github.com/SnowLegend-star/6.824

 由于这个lab整体难度实在不小,故考虑再三还是决定留下代码仅供参考

6.824的强度早有耳闻,我终于也是到了挑战这座高峰的时候。最开始看完《MapReduce: Simplified Data Processing on Large Clusters》这篇论文的时候,感觉没什么很大的理解难度,比之我平时看的论文有所不如。谁知真正实现它着实让我吃了不少苦头。

首先就是对golang语法不甚熟悉的问题,好几次设计思路有了却不知道怎么具体用golang实现出来,有种一拳打在棉花上的感觉。齐次就是这次是真要直面文件操作了。记得当初c语言最后学到文件操作的时候,我死活理解不了文件的各种操作,感觉抽象无比。在那之后每次遇到文件操作我都有种怯战的感觉。再者平时基本也遇不到文件操作,渐渐文件处理就成了我心里一片挥着不去的阴霾。而MapReduce的本质就是各个worker对任务文件进行处理存储的过程实现,这次我一定要勇敢地克服恐惧,把失去的尊严夺回来。最后就是多文件式编程。虽说以前也遇到过不少多文件编程,6.s081就是如此。但基本都是在各个文件做改进。这次coordinator.go、rpc.go、worker.go三个文件基本全是自己编写,第一次完成这种工作难免让人手足无措。有时候对着当前文件一顿猛看,结果发现是另一个文件出问题了,当然这是后话。

言归正传,下面分析下MapReduce的实现过程。实验说明和Lab原代码要多看几遍,力求理解透彻。

你的任务是实现一个分布式 MapReduce 系统,包括两个程序,coordinator 和 worker。将只有一个 coordinator 进程,和一个或多个并行执行的 worker 进程。在实际系统中,worker 将运行在不同的机器上,但在这个实验中,你将在一台机器上运行它们。worker 将通过 RPC 与 coordinator 通信。每个 worker 进程将在循环中执行以下操作: coordinator 请求任务,从一个或多个文件中读取任务的输入,执行任务,将任务的输出写入一个或多个文件,然后再次请求新的任务。coordinator 应该注意到如果一个 worker 在合理的时间内没有完成任务(在本实验中为十秒),并将同一任务交给另一个 worker

这里就开始给出实验要求了:

  1. worker要在循环中请求任务,而不是完成了一个任务就直接结束
  2. worker应在10s完成任务并给master发送完成signal。同时要创建本地文件把任务处理结果存储在其中。
  3. master如果10s没收到该worker完成任务的signal,就把这个交给其他worker重新实现

我们在 main/test-mr.sh 中提供了一个测试脚本。测试检查 wc indexer MapReduce 应用程序在输入 pg-xxx.txt 文件时是否产生正确的输出。测试还检查你的实现是否并行运行 Map 和 Reduce 任务,以及你的实现是否能从 worker 崩溃中恢复。

由于忽略了上面这句话,我一直对worker要处理什么类型的任务百思不得其解,同时Lab到底用的是什么plugin进行测试抱有疑问。后面还对自己从代码中推断出了plugin应该是和wc.so类似而感到沾沾自喜,直到后面无意中看到了这句话。真是自己一个小时的思考不及多用一分钟阅读这句话,堪称降维打击。

func Worker(mapf func(string, string) []KeyValue, 
reducef func(string, []string) string) {}

既然worker要用到map和Reduce处理文件,那应该从哪里读取这些文件呢?答案是通过rpc向master发出任务请求从而获取文件。

论文中的这张图一定要完全理解透彻,不能有些许马虎。

A few rules:

1、Map 阶段应将中间键分成 nReduce 个 Reduce 任务的桶,其中 nReduce 是 Reduce 任务的数量——main/mrcoordinator.go 传递给 MakeCoordinator() 的参数。每个 Mapper 应创建 nReduce 个中间文件供 Reduce 任务使用。

按照MapReduce给的execution overview中,worker在进行map阶段的任务文件处理时,应该生成本地文件并将中间键存储在其中。这里为什么说workermap阶段呢?难道同一个worker执行完map任务后还可以继续执行Reduce任务吗?Exactly!它甚至在执行完了当前map任务后还可以请求master再给它来点别的map任务

等到所有map任务结束后,master就开始给worker分配Reduce阶段的任务。

2、worker 实现应将第 X 个 Reduce 任务的输出放在文件 mr-out-X 中。

output文件的名字为mr-out-X,这是Reduce阶段的任务了。

3、一个 mr-out-X 文件应包含每个 Reduce 函数输出的一行。该行应使用 Go 的 "%v %v" 格式生成,使用键和值进行调用。查看 main/mrsequential.go 中注释 "this is the correct format" 的行。如果你的实现与此格式差异过大,测试脚本将失败。

就是用

fmt.Fprintf(ofile, "%v %v\n", key, result)

这种格式把键值对写入output文件中。

4、你可以修改 mr/worker.go、mr/coordinator.go 和 mr/rpc.go。你可以临时修改其他文件进行测试,但确保你的代码与原始版本一起工作;我们将使用原始版本进行测试。

作为新手,我们要有菜鸟的自知之明。能不改的地方尽量不去动,免得给后续实现埋坑。完成Lab后倒是可以自由修改任何地方。

5、worker 应将中间 Map 输出放在当前目录中的文件中,以便你的 worker 在 Reduce 任务中可以读取它们。

这条rule难道不应该放在②吗?Map阶段处理好的intermediate键值对切片要存储起来,供后续Reduce阶段进行读入。输出文件名称有具体要求吗?mr-X-Y。这次的实验说明的内容顺序堪称大坑。混乱的要求次序让人摸不着头脑。

6、main/mrcoordinator.go 期望 mr/coordinator.go 实现一个 Done() 方法,当 MapReduce 作业完全完成时返回 true;此时,mrcoordinator.go 将退出。

如何判断所有任务文件都已经完成了?在master(即coordinator.go)中维护一个Reduce阶段所有任务的状态数组。每当worker完成了一个任务,就向master发送一条signal,master即更新状态数组。

其实也应该为map阶段维护一个数组。毕竟要等所有map任务完成才可以开始分配Reduce阶段的任务

7、当作业完全完成时,worker 进程应退出。实现此功能的一个简单方法是使用 call() 的返回值:如果 worker 无法联系到 coordinator,可以假定 coordinator 已经退出,因为作业已经完成,因此 worker 也可以终止。根据你的设计,你可能还会发现有一个 "please exit" 伪任务供 coordinator 给 worker 是有帮助的。

这里注意是“当作业完全完成时,worker 进程应退出”而不是完成某项任务worker进程就自顾退出跑路了。

看完了rules之后,我们再来看看hints。其实两者有些内容是重复的,这也是为什么我说实验说明排版混乱的原因。

Hints:

1、Guidance 页面有一些开发和调试的技巧。

2、开始的一个方法是修改 mr/worker.go 的 Worker(),使其发送一个 RPC 请求给 coordinator 要求任务。然后修改 coordinator 以响应一个尚未开始的 Map 任务的文件名。然后修改 worker 以读取该文件并调用应用程序 Map 函数,如 mrsequential.go 中所示。

这里建议多阅读mrcoordinator.go、mrnetworker.go、mrsequential.go等文件,wc.go和indexer.go也要理解透彻。

然后我们可以从运行networker.go中提供的example方法着手。先把它们运行起来,再对example方法进行小小的改动,观察call()方法的执行流程。

3、应用程序 Map 和 Reduce 函数在运行时使用 Go 的 plugin 包加载,文件名以 .so 结尾。

4、如果你更改了 mr/ 目录中的任何内容,可能需要重新构建你使用的任何 MapReduce 插件,如 go build -buildmode=plugin ../mrapps/wc.go。

更改了mr/目录下的任何文件后,应该重构xx.so文件,如果继续使用原来的xx.so文件可能会报如下错误

修改语句如下

go build -race -buildmode=plugin -gcflags="all=-N -l"  ../mrapps/wc.go

5、此实验依赖 worker 共享文件系统。当所有 worker 在同一台机器上运行时,这很简单,但如果 worker 在不同的机器上运行,则需要全局文件系统如 GFS。

6、中间文件的合理命名约定是 mr-X-Y,其中 X 是 Map 任务编号,Y 是 Reduce 任务编号。

怎么确定Map的任务编号呢?可以先在master给每个任务文件编号,并用一个切片记录下来。回复worker的任务请求时返回这个文件编号。

7、worker 的 map 任务代码需要一种方式将中间键/值对存储在文件中,以便在 Reduce 任务期间正确读回。一种可能性是使用 Go 的 encoding/json 包。

Q:我直接把中间键值对存在普通文件中进行读取有什么不同呢

A:将中间键值对存储在普通文件中,而不是使用 JSON 格式,有几个关键的不同和潜在的挑战:

1. 数据结构的复杂性

  • 普通文件: 如果你使用普通文件存储中间键值对,通常需要自行设计和实现数据的编码和解码方式。你需要确保数据格式的一致性,以及处理可能的特殊字符(如换行符、分隔符等)。
  • JSON: 使用 JSON 可以自动处理复杂的数据结构。Go 的 encoding/json 包可以直接将结构体、切片等复杂数据类型序列化和反序列化,无需额外处理。

2. 可读性和调试性

  • 普通文件: 如果使用自定义格式存储数据,文件的可读性取决于设计的格式。如果格式复杂或不直观,调试时会比较困难。
  • JSON: JSON 是人类可读的文本格式,结构清晰,容易理解和调试。开发者可以直接查看 JSON 文件内容,验证数据是否正确。

3. 跨语言兼容性

  • 普通文件: 自定义格式可能需要特定语言或库的支持。如果需要与其他语言编写的系统交互,可能需要额外的工作来解析和生成这种格式。
  • JSON: JSON 是一种标准化的数据交换格式,几乎所有编程语言都支持 JSON 的解析和生成,跨语言兼容性好。

4. 编码和解码的实现

  • 普通文件: 你需要自己编写编码和解码逻辑,可能涉及字符串处理、文件读写等操作。实现起来可能会比较繁琐,并且容易出错。
  • JSON: 使用 Go 的 encoding/json 包,编码和解码变得非常简单和可靠,只需调用标准库中的函数即可。

总结

尽管使用普通文件存储中间键值对也可以实现,但使用 JSON 文件提供了更高的可读性、调试性、跨语言兼容性和实现简单性。JSON 格式的标准化和广泛支持,使得它成为 MapReduce 中间键值对存储的一个理想选择。

8、worker 的 map 任务可以使用 ihash(key) 函数(在 worker.go 中)为给定键选择 Reduce 任务。

这里属于一个小难点,要用合适的方法将中间键写入NBUCKET个文件中,否则多次遍历intermediate会导致处理任务的用时激增。

我采用的方法如下:

  1. 先将从任务文件读取的内容content传入mapf()中,普通文件读取用ioutil.ReadAll()即可。得到处理过后的切片kva
  2. 创建一个二维切片intermediate := make([][]KeyValue, reply.NReduce)
  3. 遍历kva的同时,利用ihash(key)把kva中的每一个元素分配到Nreduce个intermeditae[index]中
  4. 最后创建Nreduce个“mr-X-Index”中间文件,把对应的intermediate[index]写入到对应的中间文件内部。记得用json的方法写,这是为了Reduce阶段读取中间文件更为方便

9、你可以从 mrsequential.go 中借用一些代码,用于读取 Map 输入文件,在 Map 和Reduce 之间对中间键/值对进行排序,以及将 Reduce 输出存储在文件中。

map阶段对中间键进行排序我个人觉得没什么必要了,Reduce阶段对output文件内容进行排序这就仁者见仁智者见智。为了结果的可读性可以排序,但是排序相当于再次遍历所有内容,时间复杂度就高了。

10、coordinator 作为 RPC 服务器将是并发的;不要忘记锁定共享数据

coordinator.go中涉及处理单个与worker有关的数据时,应该加锁。包括给worker分配任务,修改任务状态的切片等。

11、使用 Go 的竞态检测器,使用 go run -race。test-mr.sh 在开头有一个注释,告诉你如何使用 -race 运行。当我们评分你的实验时,我们不会使用竞态检测器。然而,如果你的代码存在竞态,尽管没有使用竞态检测器进行测试,你的代码很有可能会失败。

12、worker 有时需要等待,例如 reduce 任务在最后一个 map 完成之前不能开始。一种可能性是 worker 周期性地向 coordinator 请求工作,在每次请求之间使用 time.Sleep()。另一种可能性是让 coordinator 中相关的 RPC 处理器有一个循环,等待,用 time.Sleep() 或 sync.Cond。Go 在每个 RPC 中运行处理器,因此一个处理器在等待并不会阻止 coordinator 处理其他 RPC。

这里我采用的是在每次请求之间使用 time.Sleep(),先把Lab完成了再回头考虑各种优化细节

13、coordinator 不能可靠地区分崩溃的 worker、活着但由于某种原因停滞的 worker 和执行但速度太慢的 worker。你能做的最好的事情是让 coordinator 等待一段时间,然后放弃并重新分配任务给另一个 worker。对于这个实验,让 coordinator 等待十秒;之后 coordinator 应假定 worker 已经死亡(当然,它可能没有)。

超过10s worker还未发送任务完成的signal,master就重新把任务分配给别的worker。由于map阶段和Reduce阶段的各种操作具有幂等性,所以直接不考虑失联的worker就可以。

14、如果你选择实现备用任务(Backup Tasks,第 3.6 节),注意我们测试你的代码在 worker 未崩溃时不会安排多余的任务。只有在相对较长的时间(例如,10秒)之后才应安排备用任务。

15、要测试崩溃恢复,可以使用 mrapps/crash.go 应用程序插件。它在 Map 和 Reduce 函数中随机退出。

16、为了确保在崩溃时没有人观察到部分写入的文件,MapReduce 论文提到使用临时文件并在完全写入后原子重命名的技巧。你可以使用 ioutil.TempFile(或 os.CreateTemp 如果你运行的是 Go 1.17 或更高版本)创建一个临时文件,并使用 os.Rename 原子地重命名它。

17、test-mr.sh 在子目录 mr-tmp 中运行所有进程,因此如果出现问题并且你想查看中间或输出文件,可以在那里查找。可以临时修改 test-mr.sh,使其在失败的测试后退出,因此脚本不会继续测试(并覆盖输出文件)。

这个建议还是有用的。

18、test-mr-many.sh 多次运行 test-mr.sh,你可能希望这样做以发现低概率的错误。它接收一个参数,表示运行测试的次数。你不应该并行运行多个 test-mr.sh 实例,因为 coordinator 将重用相同的套接字,导致冲突。

19、Go RPC 只发送以大写字母开头的字段。子结构也必须具有大写的字段名。

Golang的需要导出的内容都应该以大写字母开头。

20、调用 RPC call() 函数时,回复结构应包含所有默认值。在调用之前不要设置 reply 的任何字段。如果传递包含非默认字段的回复结构,RPC 系统可能会静默返回错误的值。

我在RPC and Threads中看到了上述内容。再次证明Printf神教yyds哈哈哈!

Bugs

最后介绍下完成Lab过程中遇到的各种bug

1、worker通知master任务已完成时,未传入任务类型,这是导致map无限轮回的第一个原因。

2、修改了上述bug后,我在prinrf大法的路上越走越远。我发现worker在完成任务后会及时通知master,master也能成功接收,但是为什么还是永远都运行map阶段的任务呢?

进行了debug我才发现问题出在文件完成状态判断的函数上

我直接把Done()中判断Reduce阶段所有任务是否全部完成的代码给复制过来了,还忘记修改就直接运行。第二天还忘记这事了。这才导致map无限轮回。

3、处理好map阶段的bugs后,终于要成功了。但是Reduce输出的output文件确实空的。看来是Reduce阶段对文件的读取有问题。

 

多亏我debug时发现读取函数后返回的err有问题——怎么都还没开始读文件,但是文件指针已经移动到了文件末尾呢?

一番排查后我发现又是复制代码的锅。我为了图方便直接把map阶段的处理代码复制到Reduce阶段的处理函数中,结果下面这句话忘记删了。

这个语句直接读取了文件的所有内容,导致用dec := json.NewDecoder(intermediate_File)的时候文件内部的指针已经移到了文件的末尾。

经过我的不懈努力,终于是完成了MapReduce的实现。

美中不足的是被connection refused克制了~ 

对了,如果想要进行debug,可以在6.5840的 文件夹下创建launch.json文件

{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"debugAdapter": "dlv-dap",// "name": "mrcoordinator",// "name": "mrworker","name": "test_test","type": "go","request": "launch","mode": "auto",// "program": "${workspaceFolder}/src/main/mrcoordinator.go","program": "${workspaceFolder}/src/main/mrworker.go","args": [// "wc.so",// "pg-grimm.txt",// "pg-frankenstein.txt"// "wc.so"],"buildFlags": "-race"}]
}

按照上述格式进行调整就行

相关文章:

6.824/6.5840 Lab 1: MapReduce

宁静的夏天 天空中繁星点点 心里头有些思念 思念着你的脸 ——宁夏 完整代码见: https://github.com/SnowLegend-star/6.824 由于这个lab整体难度实在不小,故考虑再三还是决定留下代码仅供参考 6.824的强度早有耳闻,我终于也是到了挑战这座高…...

Day5:生信新手笔记 — R语言基本语法

一、数据类型 &#xff08;重点只有两个&#xff0c;剩下的不看&#xff09; 1.1 向量&#xff08;vector&#xff09; 矩阵&#xff08;Matrix&#xff09; 数组&#xff08;Array&#xff09; 1.2 数据框&#xff08;Data frame&#xff09; x<- c(1,2,3) #常用的向…...

lua download

https://www.lua.org/ https://www.lua.org/versions.html#5.4...

安装更新upgrade导致ubuntu崩溃

安装更新导致ubuntu崩溃 前言uuid编不过&#xff0c;导致的崩溃 记录一些ubuntu崩溃的过程。 目前只有一个&#xff0c;以后遇到都放在这里&#xff0c;以提醒自己。 前言 如果从10000年看现在的linux&#xff0c;不是说不完美&#xff0c;而是糟透了。 linux的版本号&#xf…...

软件测试最新项目合集【商城、外卖、银行、金融等等.......】

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…...

【学习总结|DAY09】Java 流程控制与数据操作练习一:录入三位数并筛选符合条件的数字

一、主要代码&#xff1a; import java.util.Scanner;public class demo07 {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.print("请输入一个大于100的三位数&#xff1a;");int number scanner.nextInt();if (nu…...

“放弃Redis Desktop Manager使用Redis Insight”:日常使用教程(Redis可视化工具)

文章目录 更新Redis Insight连接页面基础解释自动更新key汉化暂时没有找到方法&#xff0c; Redis Desktop Manager在连接上右键在数据库上右键在key上右键1、添加连接2、key过期时间 参考文章 更新 (TωT)&#xff89;~~~ β&#xff59;ё β&#xff59;ё~ 现在在维护另一…...

使用lumerical脚本语言创建弯曲波导并进行数据分析(纯代码实现)

本文使用lumerical脚本语言创建弯曲波导、设置有限差分时域(FDTD)模拟、改变波导弯曲半径计算损耗、绘制图像展示电场强度分布情况及对具有不同弯曲半径的波导进行一系列模拟和分析操作(代码均有注释讲解)。 一、创建弯曲波导 1.1 基本结构讲解 (1)包层(Clad) 在波导结…...

AC+AP漫游实验

实验拓扑 实验要求 1.AP1服务vlan10&#xff0c;AP2服务vlan20&#xff0c;实现三层漫游 2.AP1与AP2为不同AP组&#xff0c;直接转发 实验步骤 1.配置VLAN放行相关流量 交换机与AP接口为trunk口并修改PVID为30 2.配置相关业务使得ap上线 3.配置vap上线&#xff0c;AP可用…...

七:仪表盘安装-controller node

一&#xff1a;工具、环境准备-controller node 二&#xff1a;OpenStack环境准备-controller node 三&#xff1a;安装服务-controller node 四&#xff1a;工具、环境准备-compute node 五&#xff1a;OpenStack环境准备-compute node 六&#xff1a;安装服务-compute node 七…...

pandas习题 067:小于 60 的部分列修改为 60

(编码题)修改以下名为 df 的 DataFrame 的值,将 Q1、Q2、Q3、Q4 列中小于 60 的分数修改为 60。 import pandas as pd# 示例数据 data = {name: [Alice, Bob, Charlie],...

Flutter 版本管理工具FVM

FVM是一款非常好用的Flutter版本管理工具。FVM官网&#xff1a; 下面是使用 FVM&#xff08;Flutter Version Manager&#xff09;管理 Flutter 版本的整个流程&#xff0c;包括安装、配置环境变量以及基本的使用步骤。 1. 安装 FVM FVM 可以通过多种方式安装&#xff0c;下…...

图学习GNN笔记

目录 第一部分&#xff1a;预测分析中的图学习4.3 案例研究&#xff1a;图上的学习机器学习生命周期 第二部分&#xff1a;图特征学习特征表示与嵌入为什么难以学习&#xff1f; 第三部分&#xff1a;节点嵌入嵌入节点设置学习节点嵌入浅层编码如何定义节点相似性&#xff1f; …...

装饰器—购物打折

from collections import namedtuple# 定义促销策略列表 promos []# 装饰器函数&#xff0c;用于注册促销策略 def promotion(promo_func):promos.append(promo_func)return promo_func# 促销策略1&#xff1a;忠诚度积分折扣 promotion def fidelity(order):""&quo…...

【Linux---10】本地机器 <=> 服务器 文件互传

文章目录 1. 小文件互传2. 大文件互传 1. 小文件互传 使用sz命令。 说明&#xff1a;sz命令是ZModem文件传输协议的一部分&#xff0c;用于在Linux和Unix系统中&#xff0c;从本地系统发送&#xff08;send&#xff09;文件到远程系统。sz命令通常与rz命令&#xff08;ZModem接…...

Mysql数据库基础篇笔记

目录 sql语句 DDL——数据库定义语言&#xff08;定义库&#xff0c;表&#xff0c;字段&#xff09; 数据库操作&#xff1a; 表操作&#xff1a; DML 增删改语句 DQL 语法编写顺序&#xff1a; 条件查询 DCL 用户管理&#xff1a; 权限管理&#xff1a; 函数 常见字符串内置函…...

QT 实现QStackedWidget切换页面右移动画

1.实现效果 以下是一个QStackedWidget,放了两个QPushButton在上面,点击切换不同的界面。 为了方便查看动画特效,设置了每个界面的背景图片。 2.实现思路 首先截取当前界面的图片,渲染到一个QLabel上,然后设置QPropertyAnimation动画,动画的作用对象就是这个QLabel,不断…...

RocketMQ rocketmq-tools管理主题

RocketMQ rocketmq-tools管理主题 环境和软件版本增删改查 环境和软件版本 Win10、IDEA、Jdk1.8、rocketmq 5.1.3、rocketmq-tools 5.1.3 引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-tools</artifactId&g…...

Docker 容器隔离关键技术:Seccomp

Docker 容器隔离关键技术&#xff1a;Seccomp 在 Docker 容器中&#xff0c;Seccomp&#xff08;Secure Computing Mode&#xff09; 是一种内核安全机制&#xff0c;用来限制容器内的程序可以调用哪些系统调用&#xff08;Syscalls&#xff09;。通过列清单的方式&#xff0c…...

2024年顶级小型语言模型前15名

本文&#xff0c;我们将深入了解2024年备受瞩目的十五款小型语言模型&#xff08;SLMs&#xff09;&#xff0c;它们分别是Llama 3.1 8B、Gemma2、Qwen 2、Mistral Nemo、Phi-3.5等。这些SLMs以其精巧的体积和高效率著称&#xff0c;它们不需要依赖庞大的服务器资源&#xff0c…...

【大模型微调】pdf转markdown

目前市面上大部分都是pdf文档,要想转换成能训练的文本,调研了各种工具。 觉得MinerU确实不错。 参考此链接进行操作 MinerU/docs/README_Ubuntu_CUDA_Acceleration_en_US.md at master opendatalab/MinerU GitHub 需要注意的几个点: 1. 使用root账户安装的,配置文件在…...

【Nacos02】消息队列与微服务之Nacos 单机部署

Nacos 部署 Nacos 部署说明 Nacos 快速开始 Nacos 快速开始 版本选择 当前推荐的稳定版本为2.X Releases alibaba/nacos GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. - Re…...

PROTEUS资源导引

本专栏讲述51、32单片机的仿真设计&#xff0c;且所有文章资源共享&#xff0c;如需哪篇文章&#xff0c;可按ctrlF键搜索查询&#xff0c;点击进入即可。 -----------------------------------------------------------目录------------------------------------------------…...

对力扣77组合优化的剪枝操作的理解

77. 组合 代码随想录放出了这一张图 我乍一看觉得想当然,但是仔细想想,又不知道以下剪枝代码作何解释,因此我想通过这篇文章简要解释一下 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int sta…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十九,ffmpeg封装

封装就是将 一个h264&#xff0c;和一个aac文件重新封装成一个mp4文件。 这里我们的h264 和 aac都是来源于另一个mp4文件&#xff0c;也就是说&#xff0c;我们会将 in.mp4文件解封装成一路videoavstream 和 一路 audioavstream&#xff0c;然后 将这两路的 avstream 合并成一…...

http 与 https 汇总

文章目录 http 与 httpsHTTP&#xff08;超文本传输协议&#xff09;介绍1. 基本概念2. 工作原理3. 特点4. 应用场景 HTTPS&#xff08;超文本传输安全协议&#xff09;介绍1. 基本概念2. 工作原理3. 特点4. 应用场景 HTTP协议的工作原理请求阶段响应阶段客户端解析处理 协议的…...

龙蜥 Linux 安装 Nginx

龙蜥 Linux 安装 Nginx 下载编译安装配置编译参数先装依赖编译安装 使用启动检查配置文件重启关闭 503权限问题参考资料 下载 下载地址详情见参考资料&#xff0c;我下的 nginx-1.26.2.tar.gz 到 /home/jerry/ /home/jerry$ curl -O http://nginx.org/download/nginx-1.26.2.…...

8. 一分钟读懂“代理模式”

8.1 模式介绍 代理模式是一种结构型设计模式&#xff0c;它通过提供一个代理对象来替代对另一个对象&#xff08;真实对象&#xff09;的访问。代理对象与真实对象实现相同的接口&#xff0c;并通过代理类对真实对象的访问进行控制&#xff0c;可以在调用前后执行附加操作&…...

分布式搜索引擎Elasticsearch

Elasticsearch是一个基于Lucene库的开源分布式搜索引擎&#xff0c;它被设计用于云计算中&#xff0c;能够实现快速、near-real-time的搜索&#xff0c;并且可以进行大规模的分布式索引。 以下是一个简单的Python代码示例&#xff0c;展示如何使用Elasticsearch的Python客户端…...

完全按照手册win10里装Ubuntu 虚拟机然后编译ESP32(主要是想针对ESP32C3和S3)开发板的鸿蒙系统(失败)

基本上完全按照手册来的&#xff0c;除了Ubuntu虚拟机使用了22.04 Jammy版本&#xff0c;鸿蒙手册里是20.04 版本&#xff0c;主要是鸿蒙里3年前的手册了&#xff0c;所以就擅自用了高版本。 据此还想到一点&#xff0c;鸿蒙LiteOS&#xff0c;还挺稳定的&#xff0c;3年也没有…...

MySQL 8.0与PostgreSQL 15.8的性能对比

以下是MySQL 8.0与PostgreSQL 15.8的性能对比&#xff1a; MySQL 8.0性能特点&#xff1a; MySQL在处理大量读操作时表现出色&#xff0c;其存储引擎InnoDB提供了行级锁定和高效的事务处理&#xff0c;适用于并发读取的场景。MySQL通过查询缓存来提高读取性能&#xff0c;查询缓…...

hive 行转列

行转列的常规做法是&#xff0c;group bysum(if())【或count(if())】 建表: CREATE TABLE table2 (year INT,month INT,amount DOUBLE );INSERT INTO table2 (year, month, amount) VALUES(1991, 2, 1.2),(1991, 3, 1.3),(1991, 4, 1.4),(1992, 1, 2.1),(1992, 2, 2.2),(1992…...

linux——进程间通信system V消息队列

Linux——命名管道及日志-CSDN博客 文章目录 目录 文章目录 前言 一、system V消息队列是什么&#xff1f; 二、相关库接口 1.shmget接口 2、ftok接口 3、shmget、ftok接口封装 4、共享内存操作 ​编辑 5、shmdt接口 三.函数的调用 1、查看共享内存 2、shell 四…...

Seatunnel解决ftp读取json文件无法读取数组以及格式化之后的json无法解析的问题

问题原因 在JsonRead这个方法里面 在源码中使用的逻辑是读取一行 然后把这个json进行解析 但是这样存在一个问题 比如如果json的格式是这样的 { name&#xff1a;“zhangsan”&#xff0c; age&#xff1a;25 } 如果是这样的话 第一行读到的内容就是 { 显然 一个 { 并不是一个…...

[Vue Router warn]: No match found for location with path 解决方法

在使用vue3 vue-router4时 当列表A组件使用 加上keep-alive缓存后&#xff0c;跳转至详情页面时出现 [Vue Router warn]: No match found for location with path "/atlas/editDetails" 解决方案&#xff1a; 把 router.push({ path: "/atlas/editDetails&…...

优傲协作机器人 Remote TCP Toolpath URCap(操作记录)

目录 一、新机设置项 1、设置管理员密码 2、设置安全密码 3、设置负载 二、激活 Remote TCP & Toolpath URCap 1、插入U盘 2、打开激活面板 3、导入许可证 4、查看是否激活成功 5、启用功能 三、使用流程&#xff08;官方&#xff09; 步骤一 步骤二 步骤三 …...

使用历史索引监控 Elasticsearch 索引生命周期管理

作者&#xff1a;来自 Elastic Stef Nestor 大家好&#xff01;在之前的一篇博客中&#xff0c;我们概述了常见的索引生命周期管理 (index lifecycle management - ILM) 问题及其解决方案。此后&#xff0c;我们已将这些常见场景添加到我们的 Elasticsearch 文档中&#xff0c;…...

[网络安全]sqli-labs Less-5 解题详析

[网络安全]Less-5 GET - Double Injection - Single quotes - String:双注入GET单引号字符型注入 判断注入类型判断注入点个数查库名&#xff08;爆破&#xff09; left函数抓包查库名&#xff08;双查询注入&#xff09; 原理实例查库名&#xff08;extractvalue函数&#xff…...

贪心算法入门(一)

第1题 礼物 查看测评数据信息 国庆马上要到了。小明喜欢的礼物有n种分别是&#xff1a;公仔、电子手表、漫画书等。 每种礼物有一件&#xff0c;每种礼物价钱都不一样。小明手头上有 m 元。 小明最多可以买多少件礼物&#xff1f; 输入格式 第一行&#xff0c;两个整数&…...

HTTP 探秘之旅:从入门到未来

文章目录 导言&#xff1a;目录&#xff1a;第一篇&#xff1a;HTTP&#xff0c;互联网的“快递员”第二篇&#xff1a;从点开网页到看到内容&#xff0c;HTTP 究竟做了什么&#xff1f;第三篇&#xff1a;HTTP 的烦恼与进化史第四篇&#xff1a;HTTP 的铠甲——HTTPS 的故事第…...

网络安全技术详解:虚拟专用网络(VPN) 安全信息与事件管理(SIEM)

虚拟专用网络&#xff08;VPN&#xff09;详细介绍 虚拟专用网络&#xff08;VPN&#xff09;通过在公共网络上创建加密连接来保护数据传输的安全性和隐私性。 工作原理 VPN的工作原理涉及建立安全隧道和数据加密&#xff1a; 隧道协议&#xff1a;使用协议如PPTP、L2TP/IP…...

人工智能中的深度学习:原理与实践

什么是深度学习&#xff1f; 深度学习&#xff08;Deep Learning&#xff09;是机器学习的一个分支&#xff0c;旨在通过模拟人脑的神经网络结构来解决复杂的任务。深度学习通过多层神经网络&#xff0c;自动从数据中学习特征&#xff0c;避免了传统机器学习中手动特征工程的繁…...

复现SMPLify-X: Ubuntu22.04, Cuda-11.3, GPU=3090Ti

Env: 3090Ti CUDA 最低支持版本需要>cuda-11.1 Ubuntu 22.04 Installation: Installing CUDA11.3 wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run sudo sh cuda_11.3.0_465.19.01_linux.run …...

qt QGraphicsScale详解

1、概述 QGraphicsScale是Qt框架中提供的一个类&#xff0c;它提供了一种简单而灵活的方式在QGraphicsView框架中实现缩放变换。通过设置水平和垂直缩放因子、缩放中心点&#xff0c;可以创建各种缩放效果&#xff0c;提升用户界面的交互性和视觉吸引力。结合QPropertyAnimati…...

全新首发小利特惠/生活缴费/电话费/油卡燃气/等充值业务类源码附带U商承兑系统

全新首发小利特惠/生活缴费/电话费/油卡燃气/等充值业务类源码附带U商承兑系统 php7.4及以上 / mysql5.6 / 伪静态&#xff1a;thinkphp / 运行目录&#xff1a;/public / 修改数据库&#xff1a;/config/database.php /后台&#xff1a;/admin 账号密码 admin q2821706481 …...

ubuntu 根分区逻辑卷扩容

1、虚拟机关机通过管理界面给磁盘扩容。 rootcurtis:/home/curtis/git_code# pvdisplay--- Physical volume ---PV Name /dev/vda3VG Name ubuntu-vgPV Size <239.00 GiB / not usable 0Allocatable yes (but full)PE…...

Word分栏后出现空白页解决方法

Word分栏后出现空白页解决方法 只需要在后面的空白页设置相同的页面布局(分栏格式)&#xff0c;然后按Ctrl backspace即可删除该空白页。 参考文章&#xff1a;Word分栏出现空白怎么解决。...

Ansible自动化运维-Ansible安装与主机列表

目录 1.Ansilble的功能及优点 2.Ansible架构 3.Ansible执行流程 4.Ansible安装 5.Ansible配置文件 6.Ansible主机列表 1.Ansilble的功能及优点 &#xff08;1&#xff09;远程执行 批量执行远程命令&#xff0c;可以对多台主机进行远程操作。 &#xff08;2&#xff0…...

大模型使用-提示学习-基础提示

一、基础提示简介 1、常用提示方法 上下文学习&#xff1a;ICL&#xff08;In-context Learning&#xff09;任务描述与问答示例以自然语言形式加入到提示中思维链提示&#xff1a;CoT&#xff08;Chain-of-Thought&#xff09;&#xff0c;是一种增强技术&#xff0c;将思维…...

【Java基础面试题004】封装、继承、重载、多态、接口和抽象类是什么?

目录 回答重点 封装 继承 重载 多态 接口 抽象类 扩展知识 继承的优缺点 编译时多态&运行时多态 编译时多态 运行时多态 重写&重载区别 为什么Java不支持多继承&#xff1f; 为什么Java支持接口多实现&#xff1f; 接口的成员 抽象类的注意事项 接口&…...