# mapreduce-go **Repository Path**: stewiechen/mapreduce-go ## Basic Information - **Project Name**: mapreduce-go - **Description**: 自己实现MapReduce - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-08-27 - **Last Updated**: 2023-04-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 自己实现MapReduce > 作者:陈桐 > 参考:MIT 6.824 Lab1 ### 简介 1. 项目是对MIT 6.824 Lab1的完整实现 2. MapReduce是Hadoop生态下的一个分布式计算框架 3. MapReduce把任务的输入和输出分别看成是一组Key-Value 4. MapReduce任务执行分为Map阶段和Reduce阶段 5. Map阶段是对文件进行加载、切分等,输出中间结果文件 6. Reduce阶段是对Map输出的中间结果文件进行处理,输出最终的结果文件 7. 通过Master-Worker的模式进行工作 8. Master负责任务调度、Worker负责任务的具体处理 9. Master和Worker之间的通信采用RPC的方式 ### 模块说明 | 模块 | 说明 | | -------- | -------------- | | call | 封装RPC | | common | 公共模块 | | master | 集群master实现 | | worker | 集群worker实现 | | schedule | worker调度模块 | ### 流程说明 1. 指定输入文件、reduce并行处理数量 2. 根据map分割规则,对文件进行切分 3. map阶段并行任务数量由输入文件数量决定 4. map阶段通过对key值进行hash取余写入到中间文件 5. master轮询将任务分配给worker,进行负载均衡 6. reduce阶段进行分片合并,输出到reduce结果文件中 7. 由master进行最终合并,输出结果文件 ### 测试 #### 词频统计 - `main.go`中提供了词频统计的案例 配置文件 **`config.json`** ```json { "job_name": "test", "master": "10.10.10.1:8000", "worker": [ "10.10.10.1:8001", "10.10.10.1:8002", "10.10.10.1:8003" ], "in_file": [ "./example/pg-being_ernest.txt", "./example/pg-dorian_gray.txt", "./example/pg-frankenstein.txt", "./example/pg-grimm.txt", "./example/pg-huckleberry_finn.txt", "./example/pg-metamorphosis.txt", "./example/pg-sherlock_holmes.txt", "./example/pg-tom_sawyer.txt" ], "n_reduce": 3, "random": { "n_number": 100, "count": 5, "rand_to": 30 } } ``` 参数解释 | 参数名 | 解释 | 是否必填 | |----------|--------------|:------:| | job_name | 任务名 | × | | master | master地址 | √ | | worker | worker地址 | √ | | in_file | 输入文件 | × | | n_reduce | reduce并行任务数量 | √ | | random | 生成随机测试数据 | × | | 参数名 | 解释 | 是否必填 | |----------|-------|:------:| | n_number | 数据量 | √ | | count | 文件数量 | √ | | rand_to | 随机数范围 | √ | > **注意事项** > 1. `example`目录下提供了测试文档 > 2. `in_file`与`random`配置其中一项 > 3. 若配置`in_file`则`random`不生效 > 4. 中间结果文件将生成在`out`目录下