1. MapReduce 预备知识
1.1. 工作过程
MapReduce 程序的工作分两个阶段进行:Map 阶段、Reduce 阶段
- Map 阶段:将每个分割的数据传递给映射函数来产生输出值。
- Reduce 阶段:对重排阶段输出值进行汇总。这个阶段结合来自重排阶段值,并返回一个输出值。
2. 示例代码
2.1. 在 pom.xml
中添加依赖
2.2. 创建 Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
子类
template | 作用 |
---|
KEYIN | mapreduce 所读取到的一行文本的起始偏移量,Long 类型,在 hadoop 中有其自己的序列化类 LongWriteable |
VALUEIN | mapreduce 所读取到的一行文本的内容,hadoop 中的序列化类型为 Text |
KEYOUT | 是用户自定义逻辑处理完成后输出的 KEY ,在此处是单词,Text 类型 |
VALUEOUT | 是用户自定义逻辑输出的 value ,这里是单词出现的次数, LongWriteable 类型 |
2.3. 重写 map
方法
2.4. 创建 Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
子类
template | 作用 |
---|
KEYIN | mapper 传入的数据,本例中是单词,Text 类型 |
VALUEIN | mapper 传入的数据,本例中是单词出现的次数,LongWriteable 类型 |
KEYOUT | 输出结果,在此处是单词,Text 类型 |
VALUEOUT | 输出结果,这里是合并后单词出现的次数,LongWriteable 类型 |
2.5. 重写 reduce
方法
2.6. 主程序
2.7. 生成 jar 包
2.7.1. 如果项目中已经打过包,那么需要先清理项目:maven -> clean
2.7.2. 双击 package
生成 jar 包
2.7.3. 将 jar 包上传至虚拟机
2.7.4. 使用命令运行刚刚写的程序
命令中 /test1127
和 /output
分别对应代码中的 args[0]
和 args[1]
,运行后会将 /test1127
目录下的所有文件进行词频统计。
2.7.5. 查看结果
成功后查看 /output
目录,其中 _SUCCESS
表示操作成功,part-r-00000
文件中存放的是最终结果,通过命令查看统计结果
3. 示例:统计天气
3.1. 数据文件
DATE | HOUR | COND | PRES | HUM | TMP | AQI | PM2.5 | PM10 |
---|
20160101 | 00 | 霾 | 1024 | 67 | -2 | 212 | 168 | 158 |
20160101 | 01 | 霾 | 1024 | 70 | -3 | 209 | 164 | 132 |
数据文件以 ,
为分隔符,为 csv
格式文件,在读取后需要通过 .split(",")
来进行分割。同时,温度值有些可能会有无效数据 N/A
,因此需要将这些无效数据跳过。
3.2. 将数据文件上传到 hadoop 系统中
将本地文件上传到系统中。
3.3. 修改代码 并执行数据统计
3.3.1. 修改代码
3.3.2. 打包后上传到 master 主机运行
4. 作业 1:每个月的平均温度
4.1. 代码
4.2. 上传 jar 包
4.3. 运行
每个月的平均温度结果如下
年月 | 平均温度 |
---|
201601 | -3.808199121522694 |
201602 | 1.680161943319838 |
201603 | 9.741197183098592 |
201604 | 16.772661870503597 |
201605 | 21.534170153417016 |
201606 | 25.697014925373136 |
5. 中文统计
5.1. 安装 Jieba
依赖
5.1.1. 在 pom.xml
中添加依赖
重新加载 Maven 项目,此时能够自动安装 Jieba
5.1.2. 尝试使用 Jieba 分词
5.2. 尝试处理中文文件
5.2.1. 将 maven 自动下载的 Jieba 包上传到 master 主机上的以下目录
5.2.2. 将本地一个中文文本文件上传到 hdfs
5.2.3. 重写 CnWordCountMapper
CnWordCountReducer
CnWordCountApp
5.2.4. 打包 上传 运行
5.2.5. 下载到本地
5.2.6. 对统计结果进行排序
词语 | 频数 |
---|
康德 | 40 |
哲学 | 24 |
一种 | 22 |
能动 | 22 |
科学 | 17 |
能动性 | 16 |
主义 | 15 |
可以 | 14 |
思维 | 14 |
我们 | 14 |
6. 作业 2:找出所有四大名著中的 20 个热词
数据清洗
如果某一行以中文字符结尾,而不是以标点为结尾,那么有可能这一行刚好被分开,此时词语可能会是断开的。因此,我们需要加上判断,先进行数据清洗,再将文件上传到 hdfs 中。
使用 concat 先将 4 个文件拼接起来,字节流 → 字符流 → 缓冲流
6.1. 编写方法处理字符文件
运行后可以在 hdfs 看到处理后的文件,大致为 8.5 MB
6.2. 统计词频
使用 jar 包的方法,统计词频
处理完成后可以看到处理后的文件大约为 1.3 MB
6.3. 下载文件 排序统计
文件下载
排序统计结果
词语 | 频数 |
---|
行者 | 4468 |
一个 | 4268 |
宝玉 | 3755 |
宋江 | 3696 |
两个 | 3128 |
那里 | 2791 |
只见 | 2352 |
我们 | 2276 |
不知 | 2139 |
如何 | 1912 |
出来 | 1907 |
太太 | 1848 |
不得 | 1826 |
师父 | 1822 |
这里 | 1822 |
八戒 | 1808 |
怎么 | 1764 |
不是 | 1760 |
孔明 | 1748 |
夫人 | 1746 |