Hadoop 概述
Hadoop是实现Google云计算系统的开源系统,包括并行计算模型Map/Reduce、分布式文件系统HDFS、分布式数据库Hbase。同时,也有大量的Hadoop相关项目。 ZooKeeper、Pig、Chukwa、Hive、Hbase、Mahout、flume 等
通过这篇文章,我们将详细解释其中的概念,以便大家能够了解什么是Hadoop。
1. 什么是Map/Reduce?请参阅下面的各种解释。
(1)MapReduce是Hadoop的核心组件之一,包括两部分:分布式文件系统hdfs和mapreduce。简而言之,MapReduce使得在Hadoop平台上运行分布式计算编程变得很容易。
(2)Mapreduce是一种编程模型、编程方法、抽象理论。
(3) 下面是一个程序员妻子解释什么是MapReduce 的故事。文章很长,请耐心阅读。
我问我的妻子:“你真的想了解MapReduce是什么吗?”她坚定地回答:“是的。” 所以我问:
我:你怎么做洋葱辣椒酱? (以下并非具体食谱,请勿在家尝试)
妻子:将洋葱切碎,与盐和水混合,然后在搅拌机中研磨。洋葱辣椒酱现在就准备好了。
妻子:但这和MapReduce 有什么关系呢?
我:等一下。创建完整的图以确保您在15 分钟内了解MapReduce。
妻子:好的。
我:好吧,假设你想制作一种由薄荷、洋葱、西红柿、辣椒和大蒜混合而成的辣椒酱。你会怎么办?
妻子:取一把薄荷叶、1个洋葱、1个番茄、1个辣椒、1个大蒜,切碎,加一些盐和水,用搅拌机研磨。将辣椒酱倒入瓶中混合。
我:好的,让我们将MapReduce 概念应用到菜谱中。 Map和Reduce实际上是两个操作。我会详细解释。
地图(Mapping): 切洋葱、西红柿、辣椒和大蒜是对这些对象进行操作的地图操作。所以,如果你给地图一个洋葱,地图就会帮你切洋葱。 同样,如果你将一个辣椒、一个大蒜和一个西红柿带到地图上,你会得到各种碎片。 因此,在切洋葱等蔬菜时,要进行贴图操作。地图操作适用于每种类型的蔬菜,并相应地生成一种或多种类型的部分(在本例中为蔬菜部分)。洋葱在与地图交互时可能会破裂。扔掉任何坏洋葱。因此,如果存在坏洋葱,Map操作会过滤掉坏洋葱,而不会产生坏洋葱块。
减少(简化): 此阶段,将各种切碎的蔬菜放入研磨机中研磨,即可得到一瓶辣椒酱。也就是说,要做一瓶辣椒酱,需要把所有的原料都磨碎。因此,绞肉机通常会将切碎的蔬菜与贴图操作结合起来。
妻子:这就是MapReduce吗?
我:说“是”也可以,说“不”也可以。 事实上,这只是MapReduce的一部分。 MapReduce 的强大之处在于分布式计算。
妻子:什么是分布式计算?请解释。
我可以。
我:假设您参加了辣酱比赛,并且您的食谱赢得了最佳辣酱奖。获奖后,您的辣酱配方变得非常受欢迎,以至于您想开始销售自己品牌的辣酱。假设你每天需要生产10,000 瓶辣椒酱,你会怎么做?
妻子:我正在寻找可以批量供应材料的供应商。
我:是的,没错。那么,你能自己完成制作吗?这是否意味着您自己切割所有材料? 只需一台粉碎机就够了吗?现在我们还需要供应不同类型的辣椒酱,例如洋葱辣椒酱,辣椒辣椒酱,番茄辣椒酱等。
妻子:当然,我们会雇更多的工人来切菜。我们还需要更多研磨机,以便更快地制作辣酱。
我:嗯,现在我们需要分担工作。您需要几个人一起切蔬菜。相当于每个人都必须处理一袋袋蔬菜,每个人都必须执行简单的地图操作。每个人从袋子里取出一种蔬菜,一次切或切碎一种蔬菜,直到袋子变空。
当每个人都完成切割后,洋葱丁、西红柿丁和蒜末被放在工作台上(每个人工作的地方)。
妻子:但是你如何制作不同类型的番茄酱呢?
我:现在你会看到MapReduce 中缺失的阶段:搅拌阶段。 MapReduce 混合了基于键的映射操作产生的所有输出蔬菜废料。搅拌是自动完成的。您可以假设键是成分的名称,例如洋葱。 因此,所有洋葱键都混合在一起并转移到洋葱研磨机中。洋葱辣椒酱现在就准备好了。同样,将所有西红柿转移到标有“西红柿”的研磨机中,然后就会制作出西红柿辣椒酱。
(4)上面是对MapReduce是什么的理论解释。我们从MapReduce生成的流程和代码的角度来理解这个问题。
如果你想统计过去10年计算机论文中出现频率最高的单词,看看大家都在研究什么,收集完论文后你会做什么?
方法一:
你可以编写一个小程序,按顺序遍历所有论文,统计每个单词出现的次数,最后找出哪些单词最受欢迎。 这种方法在数据集比较小时非常有效,而且实现起来最简单,非常适合解决这个问题。
方法二:
编写一个同时处理论文的多线程程序。
从理论上讲,此问题可能会高度并发,因为一个文件的计数不会影响另一个文件的计数。如果您的计算机是多核或多处理器,则方法2 显然比方法1 更有效。然而,编写多线程程序比方法1困难得多。例如,您必须自己同步共享数据,以防止两个线程复制统计文件。
方法三:
将作业传递给多台计算机来完成。
您可以使用方法一中的程序,将其部署到N台机器上,将论文集合分成N部分,并在每台机器上运行一个作业。虽然这种方法运行得足够快,但它需要手动将程序复制到其他机器,手动分离论文集合,并且最麻烦的是整合N 次运行的结果(当然可以做到)。 (我也写程序)。
方法四:
让MapReduce 来帮忙吧!
MapReduce本质上是第三种方法,但是文件集如何分割,程序如何复制,结果如何整合,都是由框架定义的。您只需定义此任务(您的用户程序),然后让MapReduce 完成其余的工作。
映射和归约函数
Map和Reduce函数由用户实现并定义任务本身。
Map函数:接受一个键值对并生成一组中间键值对。 MapReduce框架将map函数生成的中间键值对中具有相同键的值传递给Reduce函数。
reduce 函数:采用一个键和一组关联值,并将该组值组合起来产生一组较小的值(通常只有一个或零个值)。
统计词频的MapReduce函数的核心代码很短,主要实现了这两个函数。
映射(字符串键,字符串值):
//key: 文档名称
//value: 文档内容
对于value: 中的每个单词w
EmitIntermediate(w, '1');
减少(字符串键,迭代器值):
//key:字
//value: 计数列表
整数结果=0;
每个值v 为:
结果+=ParseInt(v);
发出(AsString(结果));
在统计单词频率的例子中,map函数接受的key是文件名,每次遇到单词w(中间key)就遍历一个单词的值。 - 生成值对w, '1',代表单词w。又发现了一对。 MapReduce将具有相同键(都是单词w)的键值对传递给Reduce函数。 reduce函数是一个包含单词w和值'1'的字符串(最基本的实现看起来像这样,但是你可以优化它),它的数量是键w的键和值的数量等于对,然后将这些'1' 累加即可得到单词w 出现的次数。最后,这些单词的出现被写入用户定义的位置并存储在底层分布式存储系统(GFS或HDFS)中。
工作原理
上图是论文中描述的流程图。一切都从顶部的用户程序开始,它链接到MapReduce库并实现最基本的Map和Reduce功能。图中的执行顺序已编号。
1. MapReduce库首先将用户程序输入文件分割成M部分(M是用户定义的),然后分割成split0到4,如图左侧所示。使用fork将用户进程复制到集群中的其他机器上。
2. 用户程序的一个副本称为主程序,其他副本称为工作程序。 master负责调度作业(map作业或reduce作业)并将其分配给空闲的worker。工人的数量也可以由用户指定。
3.分配给Map作业的worker开始读取其相应分片上的输入数据。 Map作业的数量由M决定,Map作业从输入中提取键值对。数据,每个键值对作为参数传递给map函数,map函数产生的中间键值对缓存在内存中。
4. 缓存的中间键值对定期写入本地磁盘,R的大小由用户定义。未来,每个区域将对应一个Reduce作业的位置。中间键值对被传送给主节点,主节点负责将该信息转发给Reduce工作节点。
5. master告诉分配给Reduce作业的worker负责的分区位于哪里(必须有多个位置,并且每个Map作业产生的中间键值对在所有R之间共享(可能映射到不同的分区) 。当Reduce Worker放置所有内容时,在读取所有负责的中间键值对后,首先对其进行排序,以便收集具有相同键的键值对。排序是必要的,因为不同的键可以映射到相同的分区,即相同的Reduce作业(分区数量较少)。
6.Reduce工作线程遍历排序后的中间键值对,并将每个唯一键的键和关联值传递给Reduce函数。由Reduce 函数生成的输出将附加到该分区的输出文件中。
6. 一旦所有Map和Reduce作业完成,master启动常规用户程序,MapReduce函数调用返回用户程序代码。
所有执行完成后,MapReduce 输出将被放入R 分区中的输出文件中,每个分区对应一个Reduce 作业。通常,用户不需要合并这些R文件,而是将它们用作另一个MapReduce程序的输入进行处理。整个过程中,输入数据从底层分布式文件系统(GFS)获取,中间数据放在本地文件系统上,最终输出数据写入底层分布式文件系统(GFS)。您还应该了解Map/Reduce 作业和Map/Reduce 函数之间的区别。由于Map作业处理输入数据的分片,因此您可能需要多次调用Map函数来处理每个输入键值对。分区的中间键值对。同时,对于每个不同的key都会调用一次reduce函数,reduce作业最终对应到输出文件。
概括:
现在您了解了MapReduce 是什么、键是什么、如何过滤有效数据以及如何获取您需要的数据。
MapReduce是一种可以使用Java和C++实现的编程思想。 Map的作用是对原始数据进行过滤,Reduce是对这些数据进行处理,得到你想要的结果,比如你想做番茄辣椒酱。这意味着,例如,在日志处理后使用Hadoop 来获取您需要或感兴趣的数据。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。