对MapReduce一些理解
来源:互联网 发布:mysql数据定义语言 编辑:程序博客网 时间:2024/06/05 03:21
统计词频的例子
[2]如果想统计下过去10年计算机论文出现最多的几个单词,看看大家都在研究些什么,那收集好论文后,该怎么办呢? 方法一:我可以写一个小程序,把所有论文按顺序遍历一遍,统计每一个遇到的单词的出现次数,最后就可以知道哪几个单词最热门了。 这种方法在数据集比较小时,是非常有效的,而且实现最简单,用来解决这个问题很合适。 方法二:写一个多线程程序,并发遍历论文。 这个问题理论上是可以高度并发的,因为统计一个文件时不会影响统计另一个文件。当我们的机器是多核或者多处理器,方法二肯定比方法一高效。但是写一个多线程程序要比方法一困难多了,我们必须自己同步共享数据,比如要防止两个线程重复统计文件。 方法三:把作业交给多个计算机去完成。 我们可以使用方法一的程序,部署到N台机器上去,然后把论文集分成N份,一台机器跑一个作业。这个方法跑得足够快,但是部署起来很麻烦,我们要人工把程序copy到别的机器,要人工把论文集分开,最痛苦的是还要把N个运行结果进行整合(当然我们也可以再写一个程序)。 方法四:让MapReduce来帮帮我们吧! MapReduce本质上就是方法三,但是如何拆分文件集,如何copy程序,如何整合结果这些都是框架定义好的。我们只要定义好这个任务(用户程序),其它都交给MapReduce。map函数和reduce函数
map函数和reduce函数是交给用户实现的,这两个函数定义了任务本身。 map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。 reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。 统计词频的MapReduce函数的核心代码非常简短,主要就是实现这两个函数。 map(String key, String value): // key: document name // value: document contents for each word w in value: EmitIntermediate(w, "1"); reduce(String key,Iterator values): // key: a word // values: a list of counts int result = 0; for each v in values: result += ParseInt(v); Emit(AsString(result)); 在统计词频的例子里,map函数接受的键是文件名,值是文件的内容,map逐个遍历单词,每遇到一个单词w,就产生一个中间键值对<w, "1">,这表示单词w咱又找到了一个;MapReduce将键相同(都是单词w)的键值对传给reduce函数,这样reduce函数接受的键就是单词w,值是一串"1"(最基本的实现是这样,但可以优化),个数等于键为w的键值对的个数,然后将这些“1”累加就得到单词w的出现次数。最后这些单词的出现次数会被写到用户定义的位置,存储在底层的分布式存储系统(GFS或HDFS)。工作原理
MapReduce执行流程
阅读全文
0 0
- 对MapReduce一些理解
- 我对MapReduce的理解
- 对MapReduce过程的理解
- 对MapReduce模型的理解
- Hadoop MapReduce编程的一些个人理解
- 对Java同步一些理解
- 对一些概念的理解
- 对Java同步一些理解
- 对Jazz的一些理解
- 对Java同步一些理解
- 对鼠标的一些理解
- 对Java同步一些理解
- 对委托的一些理解
- 对递归的一些理解
- 对Java同步一些理解
- 对零点的一些理解
- 对c++的一些理解
- 一些对二插树的理解
- Java基础——Servlet(五)
- FreeRTOS任务API函数的使用
- 外观模式
- 学习Opencv(一)
- Centos7-1611 安装LAMP
- 对MapReduce一些理解
- 1018. 锤子剪刀布 (20)
- leetcode 15. 3Sum
- 利用java 编写简易贪吃蛇游戏
- ChromeDriver cannot find Chrome binary问题解决
- Java Character
- HTML5 Canvas画布
- 第11章 持有对象
- 欢迎使用CSDN-markdown编辑器