# hadoop-study **Repository Path**: yangdechao_admin/hadoop-study ## Basic Information - **Project Name**: hadoop-study - **Description**: 一个基于 Hadoop 2.7.6 的 MapReduce 编程实战学习项目,覆盖 HDFS 操作、MapReduce 核心机制、二次排序、分布式缓存、矩阵运算以及三种经典推荐算法(ItemCF / UserCF / ContentCF)的完整实现。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-06-20 - **Last Updated**: 2026-09-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # hadoop-study > 一个基于 **Hadoop 2.7.6** 的 MapReduce 编程实战学习项目,覆盖 HDFS 操作、MapReduce 核心机制、二次排序、分布式缓存、矩阵运算以及三种经典推荐算法(ItemCF / UserCF / ContentCF)的完整实现。 项目主体内容来自慕课网课程 **《Hadoop 进阶》**([imooc.com/learn/890](https://www.imooc.com/learn/890)),并在此基础上补充了 WordCount、音乐统计、基站二次排序、HDFS 工具、HtmlUnit 爬虫等练习代码。 --- ## 目录 - [项目简介](#项目简介) - [技术栈与环境](#技术栈与环境) - [项目结构](#项目结构) - [模块详解](#模块详解) - [1. WordCount 词频统计](#1-wordcount-词频统计) - [2. Music 音乐统计](#2-music-音乐统计) - [3. JiZhan 基站数据二次排序](#3-jizhan-基站数据二次排序) - [4. Temperature 年份温度统计](#4-temperature-年份温度统计) - [5. Matrix 矩阵乘法](#5-matrix-矩阵乘法) - [6. ItemCF 基于物品的协同过滤推荐](#6-itemcf-基于物品的协同过滤推荐) - [7. UserCF 基于用户的协同过滤推荐](#7-usercf-基于用户的协同过滤推荐) - [8. ContentCF 基于内容的推荐](#8-contentcf-基于内容的推荐) - [9. HDFS 操作工具](#9-hdfs-操作工具) - [10. 其他模块](#10-其他模块) - [数据说明](#数据说明) - [构建与运行](#构建与运行) - [核心知识点](#核心知识点) - [常见问题](#常见问题) --- ## 项目简介 本项目通过多个可独立运行的 MapReduce 作业,系统性地演示了 Hadoop 生态的核心编程模型与常用技巧: | 主题 | 对应包 | 覆盖知识点 | | --- | --- | --- | | 词频统计 | `guage.wordcount` / `guage.wordcount2` | Mapper / Reducer / Combiner | | 音乐统计 | `guage.music` | 多值聚合 | | 基站二次排序 | `guage.jizhan` | 自定义复合键、二次排序 | | 年份温度统计 | `temperature` | 二次排序、自定义分区、分组比较器 | | 矩阵乘法 | `matrix` | 分布式缓存、矩阵转置、矩阵相乘 | | 物品协同过滤 | `recommend` | 五步 MapReduce 链式推荐 | | 用户协同过滤 | `UserCF` | 五步 MapReduce 链式推荐 | | 内容推荐 | `ContentCF` | 三步 MapReduce 链式推荐 | | HDFS 操作 | `DAO` / `guage.hadoop.upload` | HDFS 增删改查、上传下载 | --- ## 技术栈与环境 - **JDK**:1.8 - **Hadoop**:2.7.6(hadoop-hdfs 为 2.6.0) - **构建工具**:Maven - **IDE**:IntelliJ IDEA / Eclipse - **集群环境**:`hdfs://192.168.222.129:9000`(部分模块为 `hdfs://master:9000`) - **开发平台**:Windows(代码中通过 `hadoop.home.dir` 指向本地 Hadoop 解压目录,实现在 Windows 上跨平台向 Linux 集群提交作业) > 依赖见 `pom.xml`,主要依赖 `hadoop-common`、`hadoop-mapreduce-client-core`、`hadoop-hdfs`、`hadoop-mapreduce-client-jobclient`、`hadoop-mapreduce-client-common`,并引入了 `htmlunit`、`httpclient`、`commons-io` 等辅助库。 --- ## 项目结构 ``` hadoop-study ├── pom.xml # Maven 构建配置(artifactId: WordC) ├── README.md ├── .gitignore # 忽略 target / .settings ├── .classpath / .project / BigDataLearning.iml # IDE 配置文件 └── src └── main ├── java │ ├── guage │ │ ├── wordcount # WordCount(单文件版) │ │ ├── wordcount2 # WordCount(Mapper/Reducer/Main 拆分版) │ │ ├── music # 音乐统计 │ │ ├── jizhan # 基站数据二次排序 │ │ ├── daka # HtmlUnit 模拟浏览器 │ │ └── hadoop/upload # HDFS 上传下载工具 │ ├── temperature # 年份温度统计(二次排序) │ ├── matrix # 矩阵转置 + 矩阵乘法 │ │ ├── step1 # 转置右矩阵 │ │ └── step2 # 矩阵相乘 │ ├── recommend # ItemCF 基于物品的协同过滤(5 步) │ │ ├── step1 ~ step5 │ │ └── Job/JobRunner # 链式调度入口 │ ├── UserCF # 基于用户的协同过滤(5 步) │ │ └── step1 ~ step5 │ ├── ContentCF # 基于内容的推荐(3 步) │ │ └── step1 ~ step3 │ ├── DAO │ │ └── HdfsDAO # HDFS 增删改查 │ ├── Test │ │ └── TestString # 字符串测试 │ └── org/apache/hadoop/io/nativeio │ └── NativeIO # Windows 环境兼容补丁 ├── resources # core-site / hdfs-site / mapred-site / yarn-site / log4j └── data ├── input # 各模块输入样例数据 └── output # 各模块示例输出结果 ``` --- ## 模块详解 ### 1. WordCount 词频统计 **包**:`guage.wordcount`、`guage.wordcount2` MapReduce 入门经典案例,统计文本中每个单词出现的次数。 - `guage.wordcount.WordCount`:将 Mapper、Reducer、Driver 写在一个类中,并设置了 `Combiner`。 - `guage.wordcount2`:将 `WordCountMapper`、`WordCountReduce`、`WordCountMain` 拆分为三个类,结构更清晰。 **核心逻辑**: - Map 阶段:按空白切分每行,输出 `<单词, 1>`。 - Reduce 阶段:对同一单词的 value 列表求和,输出 `<单词, 总次数>`。 - Combiner:在 Map 端本地先做一次合并,减少网络传输(`job.setCombinerClass(...)`)。 **输入数据**:`src/main/data/input/wordcount/words-file` ### 2. Music 音乐统计 **包**:`guage.music` 统计每首歌曲被哪些用户喜欢。 - 输入格式:`用户名,歌曲名`(如 `tom,LittleApple`)。 - Map:以歌曲名为 key,用户名为 value 输出。 - Reduce:将喜欢同一首歌的所有用户拼接(以 `|` 分隔)。 **输入数据**:`src/main/data/input/music/music.txt` ### 3. JiZhan 基站数据二次排序 **包**:`guage.jizhan` 处理移动基站日志数据(`src/main/data/input/jizhan/jizhan.txt`),字段包括手机号、基站 ID、时间戳、信号强度等。通过自定义复合键 `NewK2` 实现二次排序:先按主键排序,再按次键排序。 **知识点**:自定义 `WritableComparable` 复合键、二次排序。 ### 4. Temperature 年份温度统计 **包**:`temperature` 统计每年温度的最高值/最低值,是 **二次排序 + 自定义分区 + 分组比较器** 的经典案例。 **关键类**: - `MyKeyPair`:自定义复合键(年份 + 温度),实现 `WritableComparable`,包含序列化/反序列化(`write`/`readFields`)。 - `Partition`:自定义分区器,按年份分区。 - `Sort`:排序比较器,年份升序、温度降序。 - `Group`:分组比较器,按年份分组。 - `RunJob`:Driver,设置 4 个 Reduce 任务(`setNumReduceTasks(4)`)。 - `MapperJob` / `ReduceJob`:Map 解析 `年份-月-日 时间\t温度C`,Reduce 取每组的 Top 温度。 **输入数据**:`src/main/data/input/temperature/year_temperature` ### 5. Matrix 矩阵乘法 **包**:`matrix.step1`、`matrix.step2` 使用 MapReduce + **分布式缓存(DistributedCache)** 实现矩阵乘法,分两步: - **Step1(矩阵转置)** `MapperReduce1`:将右侧矩阵转置(行变列、列变行)。 - **Step2(矩阵相乘)** `MapperReduce2`:将转置后的右矩阵载入分布式缓存,左矩阵的行作为 Map 输入,逐行与缓存矩阵相乘。 **输入数据**:`src/main/data/input/matrix/step1/matrix2`、`src/main/data/input/matrix/step2/matrix1` ### 6. ItemCF 基于物品的协同过滤推荐 **包**:`recommend`(`step1` ~ `step5` + `Job/JobRunner`) **算法思想**:给用户推荐那些和他们之前喜欢的物品**相似**的物品。 用户行为和权重:点击 1.0 分、搜索 3.0 分、收藏 5.0 分、付款 10.0 分。 通过 `JobRunner` 串联 5 个 MapReduce 作业,形成一个完整的推荐流水线: | 步骤 | 功能 | 输入 | 缓存 | 输出 | | --- | --- | --- | --- | --- | | Step1 | 计算用户-物品评分矩阵 | 用户行为列表(用户ID,物品ID,分值) | — | 物品ID(行) × 用户ID(列) 分值 | | Step2 | 计算物品间余弦相似度矩阵 | Step1 输出 | Step1 输出 | 物品ID × 物品ID 相似度 | | Step3 | 评分矩阵转置 | Step1 输出 | — | 用户ID × 物品ID 分值 | | Step4 | 相似度矩阵 × 评分矩阵 | Step2 输出 | Step3 输出 | 物品ID × 用户ID 分值 | | Step5 | 已评分物品置零,得到推荐列表 | Step4 输出 | Step1 输出 | 用户ID × 物品ID 分值(最终推荐) | **入口**:`recommend.Job.JobRunner`,按 Step1→Step5 顺序执行,任一步失败即中断。 **示例输出**(`src/main/data/output/recommend/step5/part-r-00000`): ``` A 5_6.45,3_4.44 B 4_3.27,1_2.38 C 6_3.10,2_4.25 ``` ### 7. UserCF 基于用户的协同过滤推荐 **包**:`UserCF`(`step1` ~ `step5`) **算法思想**:给用户推荐和他兴趣**相似的其他用户**喜欢的物品。 与 ItemCF 思路对称,同样分为 5 步: | 步骤 | 功能 | | --- | --- | | Step1 | 计算用户-物品评分矩阵 | | Step2 | 计算用户间相似度矩阵 | | Step3 | 评分矩阵转置 | | Step4 | 相似度矩阵 × 评分矩阵 | | Step5 | 已评分物品置零,得到推荐列表 | **输入数据**:`src/main/data/input/UserCF/step1/ActionList.txt` ### 8. ContentCF 基于内容的推荐 **包**:`ContentCF`(`step1` ~ `step3`) **算法思想**:给用户推荐和他们之前喜欢的物品**在内容(标签)上相似**的物品。 分 3 步实现: | 步骤 | 功能 | | --- | --- | | Step1 | 构建 Item Profile 矩阵(物品 × 标签 的 0/1 矩阵) | | Step2 | 构建 Item-User 评分矩阵并计算 User Profile | | Step3 | 对 Item Profile 与 User Profile 求余弦相似度,得到推荐结果 | **输入数据**:`src/main/data/input/ContentCF/step1/ItemProfile.txt`、`src/main/data/input/ContentCF/step2/ItemUser.txt` ### 9. HDFS 操作工具 - `DAO.HdfsDAO`:封装 HDFS 的增删改查(`mkdirs`、`ls`、`copyFile` 上传、`download` 下载、`rm` 删除)。 - `guage.hadoop.upload.HdfsUtil`:演示 HDFS 上传、下载、删除文件的完整流程。 ### 10. 其他模块 - `guage.daka.Ddkjg`:使用 **HtmlUnit** 模拟浏览器访问百度并执行搜索,演示无界面爬虫/自动化。 - `Test.TestString`:字符串 `substring`/`lastIndexOf` 用法示例。 - `org.apache.hadoop.io.nativeio.NativeIO`:为解决 Windows 环境下本地库缺失(`winutils.exe`)问题而引入的兼容补丁类。 --- ## 数据说明 样例数据统一放在 `src/main/data/` 下: - `input/`:各模块的输入数据(wordcount、music、jizhan、matrix、temperature、recommend、UserCF、ContentCF)。 - `output/`:部分模块的示例运行结果(matrix、recommend、year_temperature)。 各模块输入文件与格式: | 数据文件 | 用途 | 格式 | | --- | --- | --- | | `wordcount/words-file` | 词频统计 | 纯文本 | | `music/music.txt` | 音乐统计 | `用户名,歌曲名` | | `jizhan/jizhan.txt` | 基站二次排序 | 空格分隔的多列日志 | | `temperature/year_temperature` | 温度统计 | `日期 时间\t温度C` | | `matrix/step1/matrix2` | 矩阵转置 | `行号\t列_值,...` | | `matrix/step2/matrix1` | 矩阵相乘 | `行号\t列_值,...` | | `recommend/step1/input/ActionList` | ItemCF 用户行为 | `用户,物品,分值` | | `UserCF/step1/ActionList.txt` | UserCF 用户行为 | `用户,物品,分值` | | `ContentCF/step1/ItemProfile.txt` | 内容推荐物品画像 | `物品\t标签_1,...` | | `ContentCF/step2/ItemUser.txt` | 内容推荐用户评分 | `用户\t物品_分值,...` | --- ## 构建与运行 ### 构建 ```bash # 打包(生成带依赖的可执行 jar) mvn clean package ``` 打包后生成 `target/WordC-1.0-SNAPSHOT-jar-with-dependencies.jar`(通过 `maven-assembly-plugin` 生成)。 ### 运行前提 1. 本地安装并配置 JDK 1.8、Maven。 2. 准备一套可用的 Hadoop 集群(或本地伪分布式),配置 `core-site.xml`、`hdfs-site.xml`、`mapred-site.xml`、`yarn-site.xml` 中的地址(默认指向 `192.168.222.129:9000`)。 3. Windows 开发环境下,需设置 `hadoop.home.dir` 并准备 `winutils.exe`(代码中已通过 `System.setProperty` 设置,注意按实际路径修改)。 ### 运行示例 各模块入口类均有 `main` 方法,可直接在 IDE 中运行,例如: - 词频统计:`guage.wordcount.WordCount` - 温度统计:`temperature.RunJob` - 矩阵乘法:`matrix.step1.MapperReduce1` → `matrix.step2.MapperReduce2` - ItemCF 推荐:`recommend.Job.JobRunner`(自动串联 5 步) > 注意:代码中的 `mapred.jar`、`hadoop.home.dir`、输入/输出路径等硬编码为原作者本机路径(如 `D:\install\hadoop-2.7.6`、`D:\git-project\...`),运行前请根据实际环境修改。 --- ## 核心知识点 本项目覆盖的 Hadoop / MapReduce 核心知识点: 1. **MapReduce 编程模型**:Mapper、Reducer、Combiner、Driver。 2. **MapReduce 执行流程**:Split → Map → Shuffle → Reduce 四阶段。 3. **分片与 Map 任务数调整**:`mapred.map.tasks`、`mapred.min.split.size`,以及小文件合并优化。 4. **二次排序(Secondary Sort)**:自定义复合键 + 分区器 + 排序比较器 + 分组比较器。 5. **分布式缓存(DistributedCache)**:在作业执行前将共享数据加载到各节点内存。 6. **矩阵运算**:矩阵转置、矩阵乘法在 MapReduce 下的实现思路。 7. **推荐算法**: - 余弦相似度计算; - ItemCF(基于物品的协同过滤); - UserCF(基于用户的协同过滤); - ContentCF(基于内容的推荐); - 多步 MapReduce 链式作业编排。 8. **HDFS 编程**:文件上传、下载、删除、目录管理等。 --- ## 常见问题 1. **报错找不到 `winutils.exe`**:Windows 下运行 Hadoop 需要 `winutils.exe`,可通过 `System.setProperty("hadoop.home.dir", "Hadoop安装目录")` 指定,或将 Hadoop 加入环境变量。 2. **报错 `/bin/bash: line 0: fg: no job control`**:Windows 跨平台提交导致,设置 `mapreduce.app-submission.cross-platform=true` 即可解决。 3. **输出路径已存在**:MapReduce 输出目录必须不存在,可先删除或改用新路径。 4. **路径硬编码问题**:代码中 HDFS 地址、jar 包路径、本地输入/输出路径均为原作者环境硬编码,使用前请统一替换。 --- ## License 本项目为学习用途,代码版权归原作者所有,仅供 Hadoop / MapReduce 学习参考。