找到过去50年来温度最高的城市

时间:2017-10-01 16:26:55

标签: hadoop mapreduce

我正在学习Mapreduce概念。并且遇到了一个我想要了解的学习案例研究。

假设我有5个城市的数据(A,B,C,D,E)过去50年的温度,那么map reduce如何在此查询中起作用?我认为它需要不止一个级别的减速器组来获得最终结果。 (在Hadoop map reduce框架中它是否正确?)

步骤:

过去50年的所有50个城市数据(HDFS)

分成三个块(Mapper 1,Mapper 2,Mapper 3,这些是群集中的不同节点,我是否正确?)

随机排序(在这个位置我也有一个问题,它是代码在数据块上执行的地方吗?)它知道哪些城市的最高温度超出了特定的数据块。

减速器 - 来自差异排序和洗牌的最高温度的城市将出现减速器。

所以我的问题是,同样的减速器还会计算出具有最高温度的城市或者还有一个减速器将会出现在最高温度的城市?

第二个我的问题是,在哪一点(Mapper或Sort Shuffle或Else)代码开始处理数据?

1 个答案:

答案 0 :(得分:1)

让Mapper输出过去50年来的所有城市数据。如果您使用的是Pig或Spark,则可以使用"main": "output/main.js", "typings": "output/main.d.ts", "files": [ "output/" ] ... 命令。 HIVE将是filter条款。否则,它在代码中是一个简单的WHERE

理论上,你可以让一个减速器收集过去50年所有温度的所有城市,然后全部扫描,但这会破坏MapReduce的并行性。多个map / reduce阶段没有任何问题。实际上,Pig,Hive,Cascading以及所有其他更高级别的MR工具都可以做到这一点。

因此,(第一个)减速器将被交给任何给定城市的温度集合。它需要做的就是找到最大值,然后输出(city,max)元组。每个reducer将为每个城市每行输出一个元组。

A(第二个)Mapper可以像以前一样使用相同的InputFormat,但这次,Reducer可用于收集之前避免的所有城市。这个时间更有效率,因为可以减少数据。然后,可以找到绝对最大值。

在Hive中,您只需附加if-else即可获得答案。

  

分成三个块(Mapper 1,Mapper 2,Mapper 3,这些是群集中的不同节点,我是否正确?)

映射任务可以在相同的节点上运行,理想情况下,只要存在数据的HDFS块,就可以运行。映射器的数量由块大小,InputSplits以及输入文件的大小控制。

代码在每个阶段都在运行数据。 The output of the mapper will optionally be sent to a Combiner, a Partitioner, then shuffled and sorted to a Reducer