2020.10.6 mapreduce小demo分析:(WordCount)词数统计
今天完成的小demo,通过mapreduce编程完成对文档词频统计
问题分析:在本地某路径下建立文档wrods.csv(此处我用的csv文件,其他的也行,反正要有String在里面),例如:
此文件放置于:E:\data\mapreduce\input中,通过编写的mapreduce程序完成统计,结果为:
图解流程:下图只是演示,内容和我所使用内容无关,理解过程即可
首先words文档内按行存储了若干字段,将若干字段按行进行分割,每行交给datanode节点去做逻辑实现,java程序就是所写的逻辑程序,最后将每个java程序执行后的结果进行整合。
在读取文件时,会将文件的内容变成一个个的键值对,键为:每段文本的偏移量。值:每段文本。例子如下:
java c++ python
java bigdata c++
在上述的文档中,存在两行数据,则会有两个键值对:{[0,java c++ python] , [15,java bigdata c++]},0的来源是第一行的行偏移量:0个,因为它是第一行嘛,15的来源是因为第二行的行偏移量是15,而java c++ python就是占了15个位置,所以它偏移了15个“位置”。这个解释很通俗了吧。
而我们最后需要的结果是获得:
bigdata 1
c# 1
c++ 2
java 4
python 2
仔细观察其实这也是种键值对的形式,可以看为{[bigdata,1] [c#,1] [c++,2] [java,4] [python,2]}。在map阶段,实现了将<K1,V1>转换成<K2,V2>,以上述偏移量为例:
<K2,V2>可以表示为:
java 1
c++ 1
python 1
java 1
bigdata 1
c++ 1
而转为什么类型的K2与V2,由程序员定义,下一阶段就是Shuffle阶段,该阶段将key相同的value进行整合:
java<1,1>
python<1>
c++<1,1>
bigdata<1>
此时shuffle结束,开始reduce阶段,此阶段将新的<K2,V2>转为<K3,V3>,此时的K3与V3就是你最后想要的结果的样子,所以此时的输出格式是由程序员自己定义的,即获得最终结果:
bigdata 1
c# 1
c++ 2
java 4
python 2
其中,map阶段就相当于“分”,而reduce阶段相当于“总”,分布式计算的一种核心思想就是“分”和“总”。
MapReduce任务过程分为两个处理阶段:map阶段和reduce阶段。每个阶段都以键值对最为输入和输出,类型由程序员来定义,程序员所要写的就是map函数和reduce函数。
此文只阐述自己对该demo的逻辑理解,所以不涉及逻辑实现的介绍,等我再花点时间把代码每句话什么意思摸透了再说哈。