Map Reduce 简明教程

MapReduce - Algorithm

MapReduce 算法包含两项重要任务,即 Map 和 Reduce。

  1. Map 任务由映射程序类完成

  2. 还原任务由还原程序类完成。

映射程序类接受输入,对输入进行标记化、映射和排序。映射程序类的输出作为还原程序类的输入,还原程序类反过来搜索匹配对并减少它们。

mapper reducer class

MapReduce 实施各种数学算法,将任务划分为较小的部分并将其分配给多个系统。从技术角度而言,MapReduce 算法有助于将 Map 和 Reduce 任务发送到集群中的适当服务器。

这些数学算法可能包括以下内容:

  1. Sorting

  2. Searching

  3. Indexing

  4. TF-IDF

Sorting

排序是处理和分析数据的基本 MapReduce 算法之一。MapReduce 实施排序算法,通过键自动对映射程序的输出键值对进行排序。

  1. 排序方法在映射程序类本身中实现。

  2. 在混合和排序阶段,在映射程序类中标记值之后, Context 类(用户定义类)将匹配的值键作为集合收集起来。

  3. 为了收集类似的键值对(中间键),映射程序类借助 RawComparator 类对键值对进行排序。

  4. Hadoop 会自动对给定 Reducer 的中级键值对集合进行排序,以形成键值(K2,{V2,V2,…}),然后才会将它们呈交给 Reducer。

Searching

搜索在 MapReduce 算法中扮演着重要的角色。它有助于合并器阶段(可选)和 Reducer 阶段。让我们尝试借助一个示例了解搜索的运作方式。

Example

以下示例展示了 MapReduce 如何采用搜索算法找出给定员工数据集中薪水最高员工的详细信息。

  1. 假设我们有四个不同文件中的员工数据 - A、B、C 和 D。我们还要假设所有这四个文件中都有重复的员工记录,因为员工数据是从所有数据库表中反复导入的。参见以下图示。

map reduce illustration
  1. The Map phase 处理每个输入文件,并提供键值对形式的员工数据(<k, v>:<员工姓名,工资>)。参见以下图示。

map reduce illustration 2
  1. The combiner phase (搜索技术)将接受 Map 阶段的输入,作为带有员工姓名和工资的键值对。使用搜索技术,合并器将检查所有员工的工资,以找出每个文件中工资最高的员工。请参阅以下代码片段。

<k: employee name, v: salary>
Max= the salary of an first employee. Treated as max salary

if(v(second employee).salary > Max){
   Max = v(salary);
}

else{
   Continue checking;
}

预期结果如下:

<satish,26000><gopal,50000><kiran,45000><manisha,45000>

<satish, 26000>

<satish, 26000>

<gopal, 50000>

<gopal, 50000>

<kiran, 45000>

<kiran, 45000>

<manisha, 45000>

<manisha, 45000>

  1. Reducer phase − 您将从每个文件中找出工资最高的员工。为了避免冗余,检查所有 <k,v> 对,并消除重复项(如果有)。相同的算法用于四个 <k,v> 对之间,这些对来自四个输入文件。最终输出应如下所示 −

<gopal, 50000>

Indexing

通常,索引用于指向特定数据及其地址。它对特定 Mapper 的输入文件执行批处理索引。

MapReduce 中通常使用的索引技术称为 inverted index. Google 和 Bing 等搜索引擎使用反向索引技术。让我们尝试借助一个简单示例了解索引的运作方式。

Example

以下文本是反向索引的输入。其中 T[0]、T[1] 和 t[2] 是文件名,其内容置于双引号中。

T[0] = "it is what it is"
T[1] = "what is it"
T[2] = "it is a banana"

应用索引算法后,我们得到以下输出 −

"a": {2}
"banana": {2}
"is": {0, 1, 2}
"it": {0, 1, 2}
"what": {0, 1}

此处 "a": {2} 表示术语 "a" 出现在 T[2] 文件中。类似地,"is": {0, 1, 2} 表示术语 "is" 出现在文件 T[0]、T[1] 和 T[2] 中。

TF-IDF

TF-IDF 是一种文本处理算法,是术语频率 - 逆向文件频率的缩写。它是常见的 Web 分析算法之一。在此,术语“频率”是指术语在文档中出现的次数。

Term Frequency (TF)

它测量特定术语在文档中出现的频率。它通过将单词在文档中出现的次数除以该文档中单词总数来计算。

TF(the) = (Number of times term the ‘the’ appears in a document) / (Total number of terms in the document)

Inverse Document Frequency (IDF)

它测量术语的重要性。它通过文本数据库中文件的数目除以特定术语出现的文件的数目来计算。

在计算 TF 时,所有术语都被认为同样重要。也就是说,TF 计算“is”、“a”、“what”等普通单词的术语频率。因此,我们需要在扩大罕见术语的比例时了解常见术语,通过计算以下内容:

IDF(the) = log_e(Total number of documents / Number of documents with term ‘the’ in it).

算法在以下一个小示例中得到解释。

Example

考虑一个包含 1000 个单词的文档,其中单词 hive 出现 50 次。则 hive 的 TF 为 (50/1000) = 0.05。

现在,假设我们有 1000 万份文档,单词 hive 出现在其中的 1000 份文档中。然后,IDF 计算如下:log(10,000,000 / 1,000) = 4。

TF-IDF 权重是这些数量的乘积 − 0.05 × 4 = 0.20。