# week2-homework **Repository Path**: zero-night-01/week2-homework ## Basic Information - **Project Name**: week2-homework - **Description**: 极客时间第二周 MapReduce 练习 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-05 - **Last Updated**: 2022-03-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # week2 #### 介绍 极客时间第二周 `MapReduce` 练习 MR 任务包含本周作业和视频中给出的 `WordCount TopK` 任务,作业包含 `v1` 和 `v2` 两个版本,具体如下: 1. `v1` 为 `WritableComparable` 使用练习 2. `v2` 为 `Combiner` 使用练习 3. `wc` 为 `WordCountTopK` 练习 #### 使用说明 打包: ```shell cd mapreduce mvn clean package ``` 2. `maven` 打包后的 `mapreduce-1.0-SNAPSHOT.jar` 已上传至 `student1` 的 `/home/student1/fuwuchen` 目录下 3. 同时作业所用数据集上传至 `hdfs://emr-header-1.cluster-285604:9000/user/fuwuchen/input` 使用方式: 1. `hadoop jar mapreduce-1.0-SNAPSHOT.jar org.geektime.time.v1.MobileDataUsageStatDriver /user/fuwuchen/week2/input /user/fuwuchen/week2/output 1` 2. 查看输出 `hdfs dfs -ls /user/fuwuchen/week2/output/` 3. 可根据命令行传入的 `ReducerTask` 数量查看具体输出文件 `hdfs dfs -cat /user/fuwuchen/week2/output/part-r-00000` 可使用的类及其参数 1. `org.geektime.time.v1.MobileDataUsageStatDriver input_path output_path num_reduce_task` 2. `org.geektime.time.v2.MobileDataUsageStatDriver input_path output_path num_reduce_task` 3. `org.geektime.time.wc.WordCountTopKDriver input_path output_path num_reduce_task k` #### 代码流程 `v1.MobileDataUsageStatDriver`: 1. `Mapper`: 对每行数据按 `\t` 切分字段,取手机号(数组序号 1)为 `key`,封装上行流量(数组序号 8)、下行流量(数组序号 9)为 `bean`,写入到环形缓冲区 2. 编写自定义 bean 类 `DataUsageInfo`,实现 `Writable` 接口以序列化 3. `Reducer`: 经过 shuffle,对同一个手机号的数据调用一次 `reduce` 函数,遍历 `value`,计算流量总和,并将结果写入自定义 `bean` 作为 `key` 输出(`value` 为 `NullWritable`) 4. 编写自定义 bean 类 `DataUsageStats`,实现 `WritableComparator` 接口以指定排序规则(按手机号字典序)和序列化 补充: 1. `Mapper` 中重用共享变量 KEY 以减少对象创建数量 2. `Mapper` 中不满足字段数量的行被跳过 3. 可通过命令行指定 `reduceTask` 数量 `v2.MobileDataUsageStatDriver` 流程与 v1 类似,除了: 1. 修改自定义 `bean` 类 `DataUsageInfo`,只存放流量信息,同时用于 `Mapper` 和 `Reducer` 的输出类型 2. 统一 `Reducer` 的输入与输出类似以指定 `Combiner` 减少网络传输 `wc.WordCountTopKDriver` 与 `WordCount` 流程类似,除了: 1. `Reducer` 中指定优先队列存放 `reduce` 函数计算的中间结果,并在 `Reducer` 初始化时初始化 2. 在所有 `reduce` 函数计算完成后,一次性写入 `topK` 个结果 3. 由于整体 `topK` 可由多个局部 `topK` 求得,因此指定 `Combiner` 做预聚合