TODO
go断言
在Go语言中类型断言的语法格式如下:
value, ok := x.(T)
其中,x 表示一个接口的类型,T 表示一个具体的类型(也可为接口类型)。
该断言表达式会返回 x 的值(也就是 value)和一个布尔值(也就是 ok),可根据该布尔值判断 x 是否为 T 类型:
如果 T 是具体某个类型,类型断言会检查 x 的动态类型是否等于具体类型 T。如果检查成功,类型断言返回的结果是 x 的动态值,其类型是 T。
如果 T 是接口类型,类型断言会检查 x 的动态类型是否满足 T。如果检查成功,x 的动态值不会被提取,返回值是一个类型为 T 的接口值。
无论 T 是什么类型,如果 x 是 nil 接口值,类型断言都会失败。
一开始 : 只有一个进程,不涉及分布式
main/mrsequential.go
借助wc.go
执行map和reduce
来统计*.txt
结果输出到more-out-0
lab1 :
mapreduce框架要完成的是何时以何种方式使用用户编写的map和reduce函数达到分布式解决问题的目的
user的map和reduce : mrapps/wc.go
mapreduce框架的
master 进程 : main/mrmaster.go
master具体代码 : mr/master.go
worker 进程 : main/mrworker.go
worker具体代码 : mr/worker.go
gob error encoding body: gob: type mr.TaskReply has no exported fields
定义rpc调用所需的数据结构时,其首字母没有大写,导致外部程序无法访问
使用go时,以大写字母开头的字段和变量将被”导出”,并且对其他包可见。 以小写字母开头的字段是”未导出”的,并且仅在其自己的包中可见。
encoding / gob包依赖于反射来编码值,并且只能看到导出的struct字段。
为了使事情变得可编码,请在您的stateNode结构中将要保存的每个字段名称的首字母大写
https://blog.csdn.net/wang545054788/article/details/112991515
关于包级的变量名和函数名,小写相当于private 大写则是public ?
每个worker都可以执行map和reduce工作,一种比较靠谱和简单的实现方式是让worker向master请求工作,由master决定分配什么工作给该worker
注意的是,以后每次修改mr下的代码后都要重新编译wc.go -> wc.so
worker 和 master 其所使用的tsak都是同步的吗?是同一个吗?当然不是同一个吗。都不是一个进程 甚至不是一个机器。那么是同步的吗?
map 和 reduce 的代码 即函数代码 是在worker端的
但是执行任务的元数据 以及何时执行什么任务 是在master端的
目前的实现 最终是服务端正常退出 客户端是异常退出了
退出时机:服务端分发完全部reduce任务 并客户端都已经确定完成。客户端最后一次调用RPCReqest 请求不到任务的。服务端对此是server thread的一个协程(那也就是那个thread在一直loop)在一直loop
main thread 通过isDone看到符合退出条件 故直接exit
那么server thread也随之exit
客户端此时仍在rpc的call等待,server端异常退出 ,由tcp协议可知,server会发送fin flag,client端的应用层会看到eof。rpc的call返回。
得到一个全是默认值的TaskReply。
会匹配到DoMapTask 会利用其中信息open文件 由于文件不存在 故异常退出
明天看看能不能优化成正常退出
需要内存过多,一台机器上的内存解决不了。于是 解决方案:mapreduce
如果你可以在不构建分布式系统的情况下 通过在一台已知的计算机上解决该问题
那么就应该采用这种方式
mapreduce 是一种计算系统
存储,通信,计算
—————mapreduce———