MapReduce编程案例(上)
- 单词计数WordCount
- 数组排序并加序号
- 共同好友
MapRedeuce相关概念
MapReduce是一个分布式运算程序的编程框架,是用户开发”基于Hadoop的数据分析应用”的核心框架
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上
FileInputFormat中默认的切片机制:切片大小默认等于block的大小
用户编写MR程序分为三个部分:Mapper、Reducer、Driver(提交运行MR程序的客户端)
Mapper的输入数据和输出数据是K-V对的形式,Reducer的输入数据类型对应Mapper的输出类型
ReduceTask进程对每一组相同K的K-V组调用一次reduce()方法
单词计数WordCount
思路:逐行读取文本内容–>把读取到的一行文本内容切割为一个一个的单词–>把每个单词出现一次的信息记录为一个key-value,key=word,value=1–>收集所有相同的单词,然后统计value值的总和
1 | import java.io.IOException; |
数组排序并加序号
思路:利用shuffle阶段会把K-V对中的key值自动排序功能,先把数组元素放到key中进行排序,然后根据排序的顺序在reduce阶段为元素编上序号
1 | import java.io.IOException; |
思考:当本地文件中的数据过大时,这样的排序并加编号的方案是否可行 ?
求共同好友
数据格式:
1 | A:B,C,D,F,E,O (表示B,C,D,E,F,O是A用户的好友) |
输出格式:
1 | A-B:C E (A和B的共同还有是E,C) |
逆推法:结果为A-B:C E,那么key:A-B;value:C E,得知A-B:C;A-B:E,意思是E是A和B的共同好友;继续可以转换A:E,B:E;那么单看A的好友可以拆分为,A:B,A:C,A:D。
我们整理来一下,从源数据格式推出结果:A:B,C,D,F,E,O / B:A,C,E,K –> A:C,E / B:C,E –>A-B:E / A-B:C –> A-B:C E,这样推理过来就需要两个MR来解决,拆分来写,只需要后一个MR程序调用前一个MR程序的结果即可;多job串联,可以使用JobControl这个类把具有依赖关系的多个job串联起来,然后调度先后执行。
1 | package org.pross.friend; |