MapReduce
===========================
将任务细化,让不同的节点处理不同部分。处理完后,再把各自的结果进行统一。它通过键值对来处理数据。但键和值的类型都有要求。
通过JAVA编写的 MapReduce 程序中。值的类型必须实现了 Writable, 因为它是要被写入文件中的。而实现了
WritableComparable
接口的类,即可以是键也可以是值。因为它是可写的,所以可以是值;而它又是可进行比较的,所以作为键。
一个可执行的 MapReduce JAVA 程序应该包括如下内容:
1.一个 main 方法,用来定义整个流程,接收的参数等。
2.定义 Mapper, 定义如何划分数据生成的值也是键值对形式。
3.定义 Reducer, 定义如何处理结果。最后生成的值也是键值对形式。
4.定义一个 Job, 将 Mapper, Reducer 等必要的值设置进去。
MapReduce 通过操作 键/值 对来处理数据,一般形式是:
map: 将 (K1, V1) 的输入转化成 list(K2, V2) 的输出
reduce: 将 (K2, list(V2)) 的输入转化成 list(K3, V3) 的输出
比如,一个网络游戏,有多个区,而角色又分几个种族。这时要分析每个区每个种族分别有多少。
整个分析的输入就是所有的这些数据,可能是数据库数据,CVS 形式的数据表。
经过 Map 方法后,数据分析任务分配给不同的 DataNode 。每个 DataNode 上的数据可能是:A区 X 族:
5W 人; A区 Y 族: 6W 人; B 区 X 族 4W 人...
当然,这些数据是 键/值 对形式存储的。
然后,这些数据再经过一个被称为洗牌的过程,将不同种族的 键/值 对放到不同的 DataNode 上。
再经过 Reduce, 得到最终结果:X 族 8W; Y 族: 6W 当然,结果形式还是 键/值 对。
Mapper
-----------------------------------------------------
Mapper 的定义是由一个类来实现的。它必须继承 MapReduceBase 基类并实现 Mapper 接口。
Mapper 只有一个方法:map.用于处理单独的键值对。运行的时候键值对是由 Task
传递过来的。所以这里只需要定义如何处理就行,不用关心谁调用。
Reducer
-----------------------------------------------------
Reducer 的定义是由一个类来实现的。它必须继承 MapReduceBase 基类并实现 Reducer
接口。
当 Reducer 任务接收来自各个 mapper
的输出时,它按键值对中的键,对数据进行排序,并将相同的值的值归并。然后调用 reduce() 方法。
案例:专利引用计算
************************************************************************
http://www.nber.org/patents/ 上有专利相关的数据。我们构造 MapReduce
程序来分析相关的结果。
选用该数据是因为该案例的数据结构和当前一些社会网络图差不多,数据形式较普遍。
专利引用数据集
http://www.nber.org/patents/acite75_99.zip
专利描述数据集:
http://www.nber.org/patents/apat63_99.zip
[root@localhost mapreduce1]# wget
http://www.nber.org/patents/acite75_99.zip
[root@localhost mapreduce1]# wget
http://www.nber.org/patents/apat63_99.zip
[root@localhost mapreduce1]# unzip
acite75_99.zip
[root@localhost mapreduce1]# unzip apat63_99.zip
[root@localhost mapreduce1]# cat cite75_99.txt | wc -l
16522439
[root@localhost mapreduce1]# cat apat63_99.txt | wc -l
2923923
专利引用数据有 16522439 条。专利描述有 2923923 条。
[root@localhost mapreduce1]# head -n 5
cite75_99.txt
"CITING","CITED"
3858241,956203
3858241,1324234
3858241,3398406
3858241,3557384
上面显示的是专利之间的引用关系。每行表示一条数据。前面的数字是专业号,后面是被引用的专利号。所以上面的数据可以看到,3858241
引用了 其它的四个专利。当然后面还有很多数据,这其实就是一个多对多的关系。
[root@localhost mapreduce1]# head -n 5
apat63_99.txt
"PATENT","GYEAR","GDATE","APPYEAR","COUNTRY","POSTATE","ASSIGNEE","ASSCODE","CLAIMS","NCLASS","CAT","SUBCAT","CMADE","CRECEIVE","RATIOCIT","GENERAL","ORIGINAL","FWDAPLAG","BCKGTLAG","SELFCTUB","SELFCTLB","SECDUPBD","SECDLWBD"
3070801,1963,1096,,"BE","",,1,,269,6,69,,1,,0,,,,,,,
3070802,1963,1096,,"US","TX",,1,,2,6,63,,0,,,,,,,,,
3070803,1963,10