http://wiki.apache.org/hadoop/HadoopMapReduce
简介:
这篇文档描述在hadoop中map和reduce操作是怎样具体完成的。如果你对Google的MapReduce各式模式不熟悉,请先参阅MapReduce--http://labs.google.com/papers/mapreduce.html
Map
由于Map是并行地对输入的文件集进行操作,所以它的第一步(FileSplit) 就是把文件集分割成一些子集.如果一个单个的文件大到它已影响到查找效率时,它会被分割成一些小的分割体。要指出的是分割这个一步是不知道输入文件的内部 逻辑结构的,比如,以行为逻辑分割的文本文件会被以任意的字节界限分割,所以这个具体分割要自己去指定也可以用hadoop已经定义的几个简单分割。然后 每个文件分割体都会对应地有一个新的map任务。
当单个map任务开始时,它会对每个配置过的reduce任务开启一个新的输出书写器(writer).紧接着它(writer)会用从指定的特定InputFormat里得到的RecordReader去读它的文件分割体。InputFormat类分析输入文件并产生key-value键值对.同时InputFormat必需要处理在以文件分割时边界处的记录。比如TextInputFormat会读取分割边界的文件分割体有最后一行,如果当读取的分割体不是第一个时,TextInputFormat会忽略第一行的内容。
InputFormat类并不需要产生一些对有意义的键值对。比如TextInputFormat类的默认输出是以输入文本的行内容为value,以行偏移量为key--大多数应用只用到而很少用到偏移量。
传给用户配置的mapper的键值对都是从RecordReader读入的,用户提供的Mapper类就可以对键值对进行任意的操作再调用OutputCollector.collect 方法来重新收集自己定义后的键值对。产生的输出必需用一个Key类和一个value类,这是因为Map的输出结果要被以SequenceFile的形式写入磁盘,这种形式包括每个文件的类型信息和所有的记录都是同类形的(如果你想输出不同的数据结构你可以继承个子类出来)。Map的输入和输出键值对不需要在类型上有联系.
当Mapper的输出被收集后,它们会被Partitioner类以指定的方式区分地写出到输出文件里。默认是以HashPartitioner类用key类的哈希函数产生的hashcode来区分(因此就要有一个很好的哈希函数,才可以使在各个reduce任务时负载匀衡)。详细可以查看MapTask类。N个输入可以产生M个map任务去跑,每个map任务会产生配置的reduce任务数个输出文件。每个输出文件都会面向一个特定的reduce任务同时所有从map任务产生的键值对都会被送到reduce里。所以在一个特定的reduce任务中对于一个给定的key所有的键值对都会被处理。
Combine
当map操作输出它的键值对时他们已经在内存中存在了。为了性能和效率的考虑,有时候提供一个拥有reduce功能的合成器是有好处的。如果有 合成器,那么map的键值对就不会被马上写入到输出里,他们会被收集在list里,一个key值一个list,当写入一定数量的键值对时,这部分缓冲会被 送进合成器,每个key都的所有value都会被送进合成器的reduce方法里并且就像原先map输出的键值对一样。
比如,hadoop案例中的word count程序,它的map操作输出是(word,1)键值对,在输入中的词的计数可以用合成器来加速这个操作。一个合成操作会在内存中收集处理lists,一个词一个list。当一定数量的键值对输出到内存中时,就调用合成操作的reduce方法,每次都以一个唯一的词为key,values是list的迭代器。然后合成器输出(word, count-in-this-part-of-the-input)键值对。从Reduce操作的观点来说合成器也拥有Map输出中相同的信息,但是这样会比原先远远减少硬盘的读写。
Reduce
当一个reduce任务开始时,它的输入是分散在各个节点上的map的输出文件里。如果在分布式的模式下,他们需要先在拷贝步骤里拷贝到本地文件系统上。详细可以查看ReduceTaskRunner类
一旦所有的数据都在本地有效时,它会在添加步骤里加到一个文件里。然后这个文件会被合并分类这样相同的key的键值对就可以排在一起(分类步骤)。这样可以使真正的reduce操作变得简单,这个文件会被顺序地读入,值(values)会从输入文件里用一个迭代器传给reduce方法-直到下一个key。详细可以查看ReduceTask类。
最后,输出由每个reduce任务的输出文件组成。面他们的格式可以由JobConf.setOutputFormat类指定,如果用到JobConf.setOutputFormat类,那么输出的key类和value类都要同时指定。
分享到:
相关推荐
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
应用广泛的嵌入式操作系统——ZZ-Linux.pdf
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
在实际操作中,ZZ Fibo Trader EA会监控市场动态,依据斐波那契回调线和抛物线SAR发出的信号,自动执行买卖操作。用户可以通过调整参数来控制EA的敏感度,如斐波那契回调的百分比、抛物线SAR的步长和加速因子等,以...
通过“ZZ-2022010 机器人技术应用赛项”,学生将有机会将理论知识与实际操作相结合,提高问题解决能力,培养创新思维。这样的比赛对于准备技能大赛的中职学生来说,是一次宝贵的实践经验,有助于他们在未来的职业...
- 可以在autoexec.bat中设置编译器可执行文件的路径,或创建批处理文件setpath.bat来简化操作流程。 #### 七、宏程序的编译执行过程 1. **编译源程序**: - 使用MComp0命令编译宏程序源文件 (*.src),若编译无误...
wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。
我们研究了四轻子最终状态ℓ+ℓ-ℓ+ℓ-的产生,这些状态主要由一对弱电Z玻色子ZZ产生。 使用LoopSim方法,我们合并ZZ和ZZ + jet的NLO QCD结果,并获得ZZ产生的近似NNLO预测。 还包括对ZZ过程的精确胶子融合环平方的...
在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。
在实际应用中,理解并掌握DT_ZZ_optimized指标的原理和优化细节至关重要。用户应根据自身的交易习惯和市场理解,调整脚本中的参数,进行回测验证,以找到最适合自己的设置。同时,结合其他技术分析工具和基本面信息...
cad标高归零,好用的
在实际使用中,用户首先需要解压“ZZ_MODIFIED_GEEBINF.ENS.zip”文件,获取到“ZZ_MODIFIED_GEEBINF.ENS”文件。接着,在EndNote软件中选择“样式”菜单,点击“管理样式”,然后点击“导入”按钮,找到并导入这个...
ZZ公司的安全生产守则是为了保障公司生产建设的正常运行,强调各级员工对安全生产重要性的认知,遵循科学管理和法制观念。这份守则包含以下关键知识点: 1. **安全生产的重要性**:安全生产被视为企业的首要任务,...
在这个案例中,“dist”可能包含了适用于不同操作系统(如Windows的.exe文件或Linux的可执行脚本)的服务器端口关闭工具zz的二进制文件,以及可能的文档、许可证文件等。 总结来说,这个“服务器端口关闭工具zz”是...
`ExecutorService`是线程池服务的入口,它定义了线程池的主要操作,如执行任务、关闭线程池等。而`ThreadPoolExecutor`是其最常见的实现,包含了线程池的核心逻辑。 线程池的五大核心参数如下: 1. **corePoolSize...
在本压缩包“Google-Map-Api.rar”中,包含了一份关于Google Map API的重要文档——“Google Map Api.doc”以及一个名为“zz.txt”的文本文件。这个文档详细介绍了如何使用Google Map API进行地图相关的编程工作,是...
学习C语言图像处理不仅仅是理解语法,还包括熟悉图像数据结构(如RGB颜色模型)、文件格式规范,以及如何使用外部库进行实际操作。通过研究这些代码,学习者可以掌握如何用C语言打开图像文件、访问像素数据、执行...
总的来说,《zz809.com留言本》不仅是一个实际的网络应用,也是学习Web开发,尤其是PHP或相关技术的一个实例教程。对于初学者而言,这是一个宝贵的资源,可以帮助他们在实践中提高技能;对于有经验的开发者,它则...
ZZ8L-2.5(4)型煤电钻综合保护装置是一种专为煤矿作业设计的安全设备,旨在确保煤电钻操作过程中的人员安全和设备稳定性。...在实际操作中,必须严格按照规程执行,以确保所有保护措施都能正常发挥作用。
这个压缩包中的"ZZ-2021008 工程测量赛项规程"文件,很可能是详细的比赛规程说明书,涵盖了比赛的各项规定、评分标准以及技术要求。 工程测量是一门应用广泛的学科,它在建筑工程、道路建设、地质勘查等多个领域中...