Java从零实现单点MapReduce、MIT6.824 Java版

Java从零实现单点MapReduce 🌟

项目等其他问题交流可发邮件

项目地址:https://github.com/Xu1Aan/MapReduceDaemon

学习Hadoop的MapReduce时,为能够更加充分的了解MapReduce底层原理,希望从零实现一个自己的MapReduce。而著名的MIT 6.824课程MapReduce由 Go 语言完成(MIT 6.824 分布式系统课程,是一门著名的讲解分布式系统设计原理的课程)。同样是服务端编程语言的Java,网上从零实现MapReduce资源却很少,如此看来,如果能有一个 Java 版的课程作业可供学习挑战,收益人应该还会更多。

本项目为单点MapReduce项目(非分布式),后期将对此项目重构为分布式MapReduce项目。此项目实现了单点的wordcount案例。

该项目由三部分组成(结构):

common: KeyValue 类

handler:MapReduce接口 WordCount实现类

main: MapReduceDaemon程序入口

*程序入口:*com.xu1an.MapReduceDaemon,运行main方法。需要指定文件夹路径filePath以及Map Reduce接口的实现类的全类名className

public static void main(String[] args) {
	start("./data","com.xu1an.handler.impl.WordCount");
}

执行流程😄

  • Map:读取文件夹(./data),调用map方法,通过KeyValue记录出现的所有单词,将所有的KeyValue添加到List集合中。最后对List按key排序
  • Refuce: 准备写出文件(mr-out.txt),变量List集合,将相同key进行计数,计入输出文件。

流程图
在这里插入图片描述

Splitting代码:

// 对应Splitting阶段
List<String> words = Arrays.stream(contents.split("[^a-zA-Z]+"))
    .filter(word -> !"".equals(word))
    .collect(Collectors.toList());

Mapping代码:

//对应Mapping阶段
List<KeyValue> keyValues = new ArrayList<>(words.size());
 for (String word : words) {
    KeyValue keyValue = new KeyValue(word, "1");
    keyValues.add(keyValue);
}
//将mapping后的KeyValue数据放入List集合中(intermediate)
for (File f : files) {
    String content = readAll(f);
    intermediate.addAll(mapReduce.map(content));
}

shuffling、reduce代码:

for (int i = 0; i < intermediate.size(); ) {
    //shuffling 阶段
    int j = i + 1;
    String keyI = intermediate.get(i).getKey();
    while (j < intermediate.size() && (intermediate.get(j).getKey().equals(keyI))) {
    	j++;
    }
    List<String> values = new ArrayList<>(j - i);
    for (int k = i; k < j; k++) {
    	values.add(intermediate.get(k).getValue());
    }
    
    //reduce 阶段
    String output = mapReduce.reduce(values); 
    
    //result
    bw.write(keyI + " " + output + System.lineSeparator());
    i = j;
}
// Reduce方法
return String.valueOf(values.size());

下一步⭐️

使用Netty对单点MapReduce进行重构,实现分布MapReduce。

参考资料🎉

MIT6.824课程

MIT6.824-Java

尚硅谷大数据资料

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MIT 6.824 课程的 Lab1 是关于 Map 的实现,这里单介绍一下实现过程。 MapReduce 是一种布式计算模型,它可以用来处理大规模数据集。MapReduce 的核心想是将数据划分为多个块,每个块都可以在不同的节点上并行处理,然后将结果合并在一起。 在 Lab1 中,我们需要实现 MapReduce 的基本功能,包括 Map 函数、Reduce 函数、分区函数、排序函数以及对作业的整体控制等。 首先,我们需要实现 Map 函数。Map 函数会读取输入文件,并将其解析成一系列键值对。对于每个键值对,Map 函数会将其传递给用户定义的 Map 函数,生成一些新的键值对。这些新的键值对会被分派到不同的 Reduce 任务中,进行进一步的处理。 接着,我们需要实现 Reduce 函数。Reduce 函数接收到所有具有相同键的键值对,并将它们合并成一个结果。Reduce 函数将结果写入输出文件。 然后,我们需要实现分区函数和排序函数。分区函数将 Map 函数生成的键值对映射到不同的 Reduce 任务中。排序函数将键值对按键进行排序,确保同一键的所有值都被传递给同一个 Reduce 任务。 最后,我们需要实现整个作业的控制逻辑。这包括读取输入文件、调用 Map 函数、分区、排序、调用 Reduce 函数以及写入输出文件。 Lab1 的实现可以使用 Go 语言、Python 或者其他编程语言。我们可以使用本地文件系统或者分布式文件系统(比如 HDFS)来存储输入和输出文件。 总体来说,Lab1 是一个比较简单的 MapReduce 实现,但它奠定了 MapReduce 的基础,为后续的 Lab 提供了良好的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值