Map Reduce 简明教程

MapReduce - Hadoop Implementation

MapReduce 是一个框架,用于编写应用程序,以便在大量商用硬件集群上可靠地处理海量数据。本章将带您了解在 Hadoop 框架中使用 Java 进行 MapReduce 操作。

MapReduce Algorithm

MapReduce 范式通常基于将 map-reduce 程序发送到实际数据所在的计算机。

  1. 在 MapReduce 作业期间,Hadoop 会将 Map 和 Reduce 任务发送到集群中的相应服务器。

  2. 该框架会管理数据传递的所有细节,如发出任务、验证任务完成情况,以及在节点间在集群周围复制数据。

  3. 大多数计算都会在具有本地磁盘数据的节点上进行,这样可以减少网络流量。

  4. 在完成给定任务后,集群会收集并减少数据以形成适当的结果,并将它发送回 Hadoop 服务器。

map reduce algorithm

Inputs and Outputs (Java Perspective)

MapReduce 框架对键值对进行操作,即该框架将作业的输入视为一组键值对,并将一组键值对作为作业的输出生成,想象中不同类型。

键和值类必须是可序列化框架,因此需要实现 Writable 接口。此外,键类必须实现 WritableComparable 接口,以利于框架进行排序。

MapReduce 作业的输入和输出格式都是键值对形式−

(Input) <k1, v1> → map → <k2, v2>→ reduce → <k3, v3> (Output)。

Input

Output

Map

<k1, v1>

list (<k2, v2>)

Reduce

<k2, list(v2)>

list (<k3, v3>)

MapReduce Implementation

下表显示了有关组织用电量的资料。该表包括连续五年的每月用电量和年平均值。

Jan

Feb

Mar

Apr

May

Jun

Jul

Aug

Sep

Oct

Nov

Dec

Avg

1979

23

23

2

43

24

25

26

26

26

26

25

26

25

1980

26

27

28

28

28

30

31

31

31

30

30

30

29

1981

31

32

32

32

33

34

35

36

36

34

34

34

34

1984

39

38

39

39

39

41

42

43

40

39

38

38

40

1985

38

39

39

39

39

41

41

41

00

40

39

39

45

我们需要编写应用程序,处理给定表中的输入数据,找到用电量最大的年份、用电量最小的年份,等等。对于记录数量有限的程序员来说,这项任务很简单,因为他们只需编写逻辑来生成所需的输出,并将数据传递到编写的应用程序。

现在我们来增加输入数据的规模。假设我们必须分析一个特定州的所有大型产业的用电量。当我们编写应用程序来处理这种大量数据时,

  1. 它们执行需要很长时间。

  2. 当我们把数据从源数据移动到网络服务器时,网络流量将会很大。

为了解决这些问题,我们有MapReduce框架。

Input Data

以上数据存储在 sample.txt 中,并作为输入提供。输入文件如下所示。