Hadoop介绍
Hadoop是实现谷歌云计算系统的开源系统,包括并行计算模型Map/Reduce、分布式文件系统HDFS、以及分布式数据库Hbase。 另外,ZooKeeper、Pig、Chukwa、Hive、Hbase、madoop的相关项目也很丰富
请看以下各种解释,了解什么是图/读。
)1) MapReduce是hadoop的核心组件之一。 hadoop分散包括两部分。 一个是分布式文件系统hdfs,另一个是分布式计算盒,是MapReduce。 不可缺少。 即,通过MapReduce可以在hadoop平台上容易地进行分布式计算编程。
)2) Mapreduce是一种编程模型,是一种编程方法、抽象理论。
如果你想数一下过去十年里计算机论文中出现最多的单词,看看大家都在研究什么,收集完论文后该怎么办?
方法1 :
我写了一个小程序,按顺序遍历所有论文,数遇到的单词的出现次数,最后就能知道哪个单词最受欢迎。 该方法在数据集较小时非常有效,且实现最简单,适合解决此问题。
方法2 :
写多线程程序,同时遍历论文。
理论上,这个问题可能高度同时发生。 因为合并一个文件时,不会影响合并另一个文件。 如果我们的机器是多核或多处理器,方法2一定比方法1更高效。 但是写多线程程序比方法难多了,所以我们必须自己同步和共享数据。 例如,两个线程必须避免重复统计文件。
方法3 :
把作业交给多台电脑。
我们使用方法1的程序,配备n台机器,将论文集分为n,一台机器可以跑一个作业。 这种方法跑得足够快,但引进起来很麻烦。 我们必须人工将程序复制到另一台机器上,论文集必须人工划分,最痛苦的是整合n个执行结果(当然我们也可以再写一个程序)
方法4 :
让MapReduce帮你吧!
MapReduce本质上是方法3,但框架定义了如何分割文件集、如何复制程序以及如何合并结果。 我们定义了这个任务(用户程序)后,其他的就交给MapReduce了。
map和reduce函数
map和reduce函数由用户实现,这两个函数定义任务本身。
map函数:接受" key-value pair "并生成中间密钥和值对。 MapReduce框架会将中间键值和中间键值与map函数生成的中间键值相同的值传递给reduce函数。
reduce函数:接受一组键和关联的值。 合并此组值将生成一组较小的值。 通常只有一个或0个值。
数词的MapReduce函数的核心代码非常短,主要是实现这两个函数。
字符串密钥,字符串值(map ) :
//key :文档名称
//value :文档内容
for each word w in value:
EMITintermediate(w,'1);
reduce (字符串密钥,迭代器值) :
//key: a word
//values: a list of counts
int result=0;
for each v in values:
result=parseint(v;
emit (资产);
在统计数字的示例中,map函数接收的密钥是文件名,值是文件的内容。 map逐个遍历单词,每次遇到单词w时生成中间键值对w,'1'。 这意味着又找到了一个单词w; Mapreduce会将键相同(全部为单词w )的键值对传递给reduce函数。 这样Reduce函数接收的键是单词w,值是一系列的)1) ),最基本的实现是这样的,但是可以优化),个数与键是w的键值对的个数相等,累计这些)1)就可以得到单词w的出现次数这些单词的最后出现次数会写入用户定义的位置并存储在底层分布式存储系统(GFS或HDFS )中。
工作原理
上图为论文所示流程图。 一切从最上面的用户程序开始。 user program链接MapReduce库,实现了最基本的Map和Reduce函数。 图中执行的所有顺序都用数字标记。
1.MapReduce库首先将user program的输入文件分成m部分(m为用户定义),每个一般为16MB到64MB,如图左边所示,分成split0~4。 然后,使用fork将用户进程复制到群集中的其他计算机。
2.us
er program的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的。3.被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。
4.缓存的中间键值对会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。
5.master通知分配了Reduce作业的worker它负责的分区在什么位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区),当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。因为不同的键可能会映射到同一个分区也就是同一个Reduce作业(谁让分区少呢),所以排序是必须的。
6.reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。
6.当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。
所有执行完毕后,MapReduce输出放在了R个分区的输出文件中(分别对应一个Reduce作业)。用户通常并不需要合并这R个文件,而是将其作为输入交给另一个MapReduce程序处理。整个过程中,输入数据是来自底层分布式文件系统(GFS)的,中间数据是放在本地文件系统的,最终输出数据是写入底层分布式文件系统(GFS)的。而且我们要注意Map/Reduce作业和map/reduce函数的区别:Map作业处理一个输入数据的分片,可能需要调用多次map函数来处理每个输入键值对;Reduce作业处理一个分区的中间键值对,期间要对每个不同的键调用一次reduce函数,Reduce作业最终也对应一个输出文件。
面试题部分:https://blog.csdn.net/wyqwilliam/article/details/81009792