用go语言实现一个MapReduce框架

1 目的

本文会带领大家使用GO语言,实现一个MapReduce框架。该框架能够实现MapReduce的基本功能,能运行基本的MapReduce应用,如WordCount等。

2 整体架构

在这里插入图片描述

3 细节

3.1 common.go

在这里定义了公用的结构和函数。

type Task struct{
	FileName string //文件名称,在Map阶段是输入文件的路径。在Reduce阶段,是中间文件的路径
	NReduce int //代表Reduce数量
	NMap int //代表Map数量
	Seq int  //任务id
	Phase TaskPhase //Map or reduce
	Alive bool //任务执行阶段,共两种阶段:Map,Reduce
}
//根据map的序号和reduce序号生成中间文件名称
func reduceName(mapIdx,reduceIdx int)string{
	return fmt.Sprintf("mr-%d-%d",mapIdx,reduceIdx)
}
//根据reduce的序号生成最终输出文件
func outputName(reduceIdx int)string{
	return fmt.Sprintf("mr-out-%d",reduceIdx)
}

3.2 rpc.go

MapReduce框架中使用RPC来实现Coordinator(Master)和Worker的通信,rpc.go中定义了rpc通信传输的数据结构以及函数。

//worker通过rpc向coordinator进行注册的时候发送的请求参数,它是一个空的结构,因为注册时,worker不需要传递任何参数给coordinator。
type RegisterArgs struct {
}
//worker注册时的返回参数
type RegisterReply struct {
	WorkerID int //workerID 该worker的id
}

// worker向coordinator请求任务时的请求参数
type TaskArgs struct{
	WorkerID int //workerID 该worker的id
}
// worker向coordinator请求任务时的返回参数
type TaskReply struct{
	Task *Task //Task 请求的task的Task结构
}

//worker向coordinator报告任务执行情况时的请求参数结构
type ReportTaskArgs struct{
    Done bool //表示任务是否执行完成
	Seq int // 任务的id
	Phase TaskPhase // 任务的状态 Map还是Reduce
	WorkerID int// worker的id
}
//worker向coordinator报告任务执行情况时的返回参数结构,为空
type ReportTaskReply struct {}

//生成rpc名称
func coordinatorSock() string {
	s := "/var/tmp/824-mr-"
	s += strconv.Itoa(os.Getuid())
	return s
}

3.3 coordinator.go

在这里插入图片描述

3.4 worker.go

在这里插入图片描述

3.5 mrcoordinator.go

负责调用mrcoordinator.go中的MakeCoordinator函数,来开启coordinator程序。

3.6 mrworker.go

负责调用worker.go中的Worker函数,开启worker程序。

4 运行

  • 1 编译wc.go

    先将mapreduce应用编译成功

    go build -race -buildmode=plugin ../mrapps/wc.go
    
  • 2 清楚已有的中间文件,以及结果文件

    rm mr-out*
    
  • 3 运行mrcoordinator.go

    go run -race mrcoordinator.go pg-*.txt
    
  • 4 运行mrworker.go

    go run -race mrworker.go wc.so
    

在这里插入图片描述

结果如图所示

注:需要先安装go环境

5 完整代码获取

关注微信公众号【山人彤】,回复 【MapReduce】 获取

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
掌握分布式mapreduce与raft算法与分布式数据库MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念Map(映射)和Reduce(归约),是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。MapReduce是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义:1)MapReduce一个基于集群的高性能并行计算平台(Cluster Infrastructure)。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。2)MapReduce一个并行计算与运行软件框架(Software Framework)。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。3)MapReduce一个并行程序设计模型与方法(Programming Model & Methodology)。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用MapReduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可理解性,Raft 将一致性算法分解成了几个关键模块,例如leader人选举、日志复制和安全性。同时它通过实施一个更强的一致性来减少需要考虑的状态的数量。从一个用户研究的结果可以证明,对于学生而言,Raft 算法比 Paxos 算法更加容易学习。Raft 算法还包括一个新的机制来允许集群成员的动态改变,它利用重叠的大多数来保证安全性。 一致性算法允许一组机器像一个整体一样工作,即使其中一些机器出现故障也能够继续工作下去。正因为如此,一致性算法在构建可信赖的大规模软件系统中扮演着重要的角色。在过去的 10 年里,Paxos 算法统治着一致性算法这一领域:绝大多数的实现都是基于 Paxos 或者受其影响。同时 Paxos 也成为了教学领域里讲解一致性问题时的示例。 但是不幸的是,尽管有很多工作都在尝试降低它的复杂性,但是 Paxos 算法依然十分难以理解。并且,Paxos 自身的算法结构需要进行大幅的修改才能够应用到实际的系统中。这些都导致了工业界和学术界都对 Paxos 算法感到十分头疼。 和 Paxos 算法进行过努力之后,我们开始寻找一种新的一致性算法,可以为构建实际的系统和教学提供更好的基础。我们的做法是不寻常的,我们的首要目标是可理解性:我们是否可以在实际系统中定义一个一致性算法,并且能够比 Paxos 算法以一种更加容易的方式来学习。此外,我们希望该算法方便系统构建者的直觉的发展。不仅一个算法能够工作很重要,而且能够显而易见的知道为什么能工作也很重要。 Raft 一致性算法就是这些工作的结果。在设计 Raft 算法的时候,我们使用一些特别的技巧来提升它的可理解性,包括算法分解(Raft 主要被分成了leader人选举,日志复制和安全三个模块)和减少状态机的状态(相对于 Paxos,Raft 减少了非确定性和服务器互相处于非一致性的方式)。一份针对两所大学 43 个学生的研究表明 Raft 明显比 Paxos 算法更加容易理解。在这些学生同时学习了这两种算法之后,和 Paxos 比起来,其中 33 个学生能够回答有关于 Raft 的问题。 Raft 算法在许多方面和现有的一致性算法都很相似(主要是 Oki 和 Liskov 的 Viewstamped Replication),但是它也有一些独特的特性: 强leader:和其他一致性算法相比,Raft 使用一种更强的leader能力形式。比如,日志条目只从leader发送给其他的服务器。这种方式简化了对复制日志的管理并且使得 Raft 算法更加易于理解。leader选举:Raft 算法使用一个随机计时器来选举leader。这种方式只是在任何一致性算法都必须实现的心跳机制上增加了一点机制。在解决冲突的时候会更加简单快捷。成员关系调整:Raft 使用一种共同一致的方法来处理集群成员变换的问

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一朝英雄拔剑起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值