什么是MapReduce?它是如何工作的?
我试过阅读一些链接,但无法清楚地理解这个概念。
任何人都可以用简单的方式解释一下吗?任何帮助,将不胜感激。
答案 0 :(得分:0)
mapreduce有一个Mapper和一个Reducer。
Map是一种常用的函数式编程工具,可对多个数据执行单个操作。例如,如果我们有数组
arr = [1,2,3,4,5]
并调用
map(arr,*2)
它将乘以数组的每个元素,结果将是:
[2,4,6,8,10]
在我看来,减少有点违反直觉,但并不像人们期望的那么复杂。 假设您已经获得了上面的映射数组,并且希望在其上使用reducer。 reducer获取数组,二元运算符和初始元素。 它的行动很简单。假设我们有上面的映射数组,二元运算符'+'和初始元素'0',则reducer按以下顺序反复应用运算符:
0 + 2 = 2
2 + 4 = 6
6 + 6 = 12
12 + 8 = 20
20 + 10 = 30.
它实际上取最后一个结果和下一个数组元素,并对它们应用二元运算符。在代表的情况下,我们得到了数组的总和。
答案 1 :(得分:0)
我将以示例解释。
考虑您是否有过去100年的温度数据,并且您想知道年度最高温度。假设数据的总大小为100PT。你将如何迎合这个问题?我们无法在Oracle中处理数据,如oracle,My SQL或任何sql数据库。
在hadoop中,主要有两个术语:
HDFS用于在分布式环境中存储数据。因此,HDFS会将您的100PT数据存储在群集中。它可能是2台机器集群或100台机器。默认情况下,您的数据将分为64MB块并存储在群集中的不同计算机中。
现在,我们开始处理数据。为了处理hadoop集群中的数据,我们使用Map-Reduce框架来编写处理逻辑。我们需要编写map-reduce代码来找到最高温度。
Map-Reduce代码的结构(只是为了理解,语法不对):
class XYZ{
static class map{
void map(){
//processing logic for mapper
}
}
static class Reduce{
void reduce(){
//processing logic for reducer
}
}
}
无论你在map()方法中编写什么,它都会在64MB数据块上并行运行所有数据节点并生成输出。
现在,所有映射器实例的输出都将进行混洗和排序。然后它传递给reduce()方法作为输入。
Reducer将生成最终输出。
在我们的例子中,假设hadoop在mapper下面启动3:
64 MB块数据 - >映射器1 - > (年,温度)(1901,45),(1902,34),(1903,44)
64 MB块数据 - >映射器2 - > (年,温度)(1901,55),(1902,24),(1904,44)
64 MB块数据 - >映射器3 - > (年,温度)(1901,65),(1902,24),(1903,46)
所有mapper的输出传递给reducer。
所有映射器的输出 - >减速机 - > (1901,65),(1902,34),(1903,46),(1904,44)