- 浏览: 2183199 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
FileSplit:文件的子集--文件分割体
简介:
这篇文档描述在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案例中的wordcount程序,它的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类都要同时指定。
我们以wordcount为例,假设有个6400M的文件,100台hadoop机器(准确地说应该是tasktracker机),默认block大小为64M,这样每台执行map的文件刚好是一个64M的block文件(假设这个分发过程已经完成,同时忽略备份数之类的细节),并且我们使用10个reduce任务来归并文件。Hadoop的mapreducer的执行过程如下:
这100台机器上面的map都是并发、独立的执行,以wordcount为例,步骤如下:
1、 每个map任务使用默认的textinputformat类的LineRecordReader方法按行读取文件,这个读取的行数据就被交给map函数去执行,wordcount的map做的就是提取里面的单词,并以单词为key,1为value作为输出,格式为:<wordinteger(1)>。
2、 如果有combine,先对第一步的输出结果就行combine操作。Combine就是个小reduce操作,作用就是对某个map自己的输出结果先进行一次归并,把相同word的计数累加,这样假设某个map输出结果做如果有50%的重复word,那combine后的中间结果大小可以减少一半,可减少后续的patition、copy、sort等的开销,提高性能。
3、 每个map对自己的输出文件进行patition操作。上面提到有10个reducer任务,那默认的patition操作就是对map的输出kay进行hash,并对10求余(hash(key)),并提供10个文件(内存足够的话可以是链表等内存数据结构),假设是r1、r2….r10这10个文件,把不同key的放到不同的文件,这次操作就可以把相同key聚合到同一个文件。由于算法一样,保证了每个map的输出结果经过这个操作后,相同key的肯定在同一个聚合文件里,比如某个单词word肯定都在r1文件里。
4、 接下来就是copy文件的过程了,10个reducer任务各自从所有map机器上取到属于自己的文件,比如reducer1会从100台map机器上取到所有r1文件,reducer2取所有r2的文件,这样同一类word已经到了同一台reducer机器上了。
5、 每个reducer合并(meger)自己取到的文件,reducer1就是合并100个r1文件(实际过程是在上面第4步操作中会边copy边meger,在内存中)。
6、 合并好后进行下sort(排序)操作,再次把不同小文件中的同一个单词聚合在一起。作为提供给reduce操作的数据。
7、 进行reduce操作,对同一个单词的value列表再次进行累加,最终得到某个单词的词频数。
8、 Outputformat操作,把reduce结果写到磁盘。
所以,总的流程应该是这样的:
* Inputformat——》map——》(combine)——》partition——》copy&merge——》sort——》reduce——》outputformat
由此我们也可以看出,执行reduce的代价还是有些的,所以如果我们的应用只使用map就能搞定的话,那就尽量不要再有reduce操作在其中。
from:
http://autumnice.blog.163.com/blog/static/55520020101196941188/
参考:
http://blog.csdn.net/HEYUTAO007/archive/2010/07/10/5725379.aspx
http://blog.csdn.net/wh62592855/archive/2010/07/19/5745188.aspx
http://www.cnblogs.com/spork/archive/2010/01/11/1644342.html
http://www.cnblogs.com/spork/archive/2010/01/11/1644346.html
http://www.cnblogs.com/spork/archive/2010/01/11/1644350.html
简介:
这篇文档描述在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案例中的wordcount程序,它的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类都要同时指定。
我们以wordcount为例,假设有个6400M的文件,100台hadoop机器(准确地说应该是tasktracker机),默认block大小为64M,这样每台执行map的文件刚好是一个64M的block文件(假设这个分发过程已经完成,同时忽略备份数之类的细节),并且我们使用10个reduce任务来归并文件。Hadoop的mapreducer的执行过程如下:
这100台机器上面的map都是并发、独立的执行,以wordcount为例,步骤如下:
1、 每个map任务使用默认的textinputformat类的LineRecordReader方法按行读取文件,这个读取的行数据就被交给map函数去执行,wordcount的map做的就是提取里面的单词,并以单词为key,1为value作为输出,格式为:<wordinteger(1)>。
2、 如果有combine,先对第一步的输出结果就行combine操作。Combine就是个小reduce操作,作用就是对某个map自己的输出结果先进行一次归并,把相同word的计数累加,这样假设某个map输出结果做如果有50%的重复word,那combine后的中间结果大小可以减少一半,可减少后续的patition、copy、sort等的开销,提高性能。
3、 每个map对自己的输出文件进行patition操作。上面提到有10个reducer任务,那默认的patition操作就是对map的输出kay进行hash,并对10求余(hash(key)),并提供10个文件(内存足够的话可以是链表等内存数据结构),假设是r1、r2….r10这10个文件,把不同key的放到不同的文件,这次操作就可以把相同key聚合到同一个文件。由于算法一样,保证了每个map的输出结果经过这个操作后,相同key的肯定在同一个聚合文件里,比如某个单词word肯定都在r1文件里。
4、 接下来就是copy文件的过程了,10个reducer任务各自从所有map机器上取到属于自己的文件,比如reducer1会从100台map机器上取到所有r1文件,reducer2取所有r2的文件,这样同一类word已经到了同一台reducer机器上了。
5、 每个reducer合并(meger)自己取到的文件,reducer1就是合并100个r1文件(实际过程是在上面第4步操作中会边copy边meger,在内存中)。
6、 合并好后进行下sort(排序)操作,再次把不同小文件中的同一个单词聚合在一起。作为提供给reduce操作的数据。
7、 进行reduce操作,对同一个单词的value列表再次进行累加,最终得到某个单词的词频数。
8、 Outputformat操作,把reduce结果写到磁盘。
所以,总的流程应该是这样的:
* Inputformat——》map——》(combine)——》partition——》copy&merge——》sort——》reduce——》outputformat
由此我们也可以看出,执行reduce的代价还是有些的,所以如果我们的应用只使用map就能搞定的话,那就尽量不要再有reduce操作在其中。
from:
http://autumnice.blog.163.com/blog/static/55520020101196941188/
参考:
http://blog.csdn.net/HEYUTAO007/archive/2010/07/10/5725379.aspx
http://blog.csdn.net/wh62592855/archive/2010/07/19/5745188.aspx
http://www.cnblogs.com/spork/archive/2010/01/11/1644342.html
http://www.cnblogs.com/spork/archive/2010/01/11/1644346.html
http://www.cnblogs.com/spork/archive/2010/01/11/1644350.html
评论
3 楼
the_small_base_
2016-04-09
之前看过你的文章觉得都还不错,这篇文章我认为实在太差了,有些语段根本就没说通
也知道是转载还是原创的。毫无借鉴之处
也知道是转载还是原创的。毫无借鉴之处
2 楼
qindongliang1922
2014-11-06
如果指定的10个reduce,应该是随机的运行10个reduce任务
1 楼
wwwwxiaoxiu
2014-11-06
咨询一个问题,在wordcount这个例子解释中,每个reducer从100台节点上拿到属于自己分区的文件,那10个reducer任务,对于其中一个reducer,是有hadoop分配随机分配一个节点上运行,还是所有节点上都运行这个reducer?
发表评论
-
Apache Flink在阿里的使用(译)
2019-02-21 21:18 1173Flink是未来大数据实时 ... -
计算机图形处理的一些知识
2018-04-25 17:46 1228最近在搞opencv来做一些 ... -
如何在kylin中构建一个cube
2017-07-11 19:06 1267前面的文章介绍了Apache Kylin的安装及数据仓 ... -
Apache Kylin的入门安装
2017-06-27 21:27 2144Apache Kylin™是一个开源的分布式分析引擎,提供 ... -
ES-Hadoop插件介绍
2017-04-27 18:07 1991上篇文章,写了使用spark集成es框架,并向es写入数据,虽 ... -
如何在Scala中读取Hadoop集群上的gz压缩文件
2017-04-05 18:51 2129存在Hadoop集群上的文件,大部分都会经过压缩,如果是压缩 ... -
如何收集项目日志统一发送到kafka中?
2017-02-07 19:07 2791上一篇(http://qindongliang.iteye. ... -
Hue+Hive临时目录权限不够解决方案
2016-06-14 10:40 4702安装Hue后,可能会分配多个账户给一些业务部门操作hive,虽 ... -
Hadoop的8088页面失效问题
2016-03-31 11:21 4448前两天重启了测试的hadoop集群,今天访问集群的8088任 ... -
Hadoop+Hbase集群数据迁移问题
2016-03-23 21:00 2523数据迁移或备份是任何 ... -
如何监控你的Hadoop+Hbase集群?
2016-03-21 16:10 4919前言 监控hadoop的框架 ... -
Logstash与Kafka集成
2016-02-24 18:44 11624在ELKK的架构中,各个框架的角色分工如下: Elastic ... -
Kakfa集群搭建
2016-02-23 15:36 2645先来整体熟悉下Kafka的一些概念和架构 (一)什么是Ka ... -
大数据日志收集框架之Flume入门
2016-02-02 14:25 4186Flume是Cloudrea公司开源的一款优秀的日志收集框架 ... -
Apache Tez0.7编译笔记
2016-01-15 16:33 2522目前最新的Tez版本是0.8,但还不是稳定版,所以大家还 ... -
Bug死磕之hue集成的oozie+pig出现资源任务死锁问题
2016-01-14 15:52 3831这两天,打算给现有的 ... -
Hadoop2.7.1和Hbase0.98添加LZO压缩
2016-01-04 17:46 26031,执行命令安装一些依赖组件 yum install -y ... -
Hadoop2.7.1配置NameNode+ResourceManager高可用原理分析
2015-11-11 19:51 3177关于NameNode高可靠需要配置的文件有core-site ... -
设置Hadoop+Hbase集群pid文件存储位置
2015-10-20 13:40 2848有时候,我们对运行几 ... -
Hadoop+Maven项目打包异常
2015-08-11 19:36 1564先简单说下业务:有一个单独的模块,可以在远程下载Hadoop上 ...
相关推荐
通过以上步骤,初学者可以逐步熟悉Windows环境下Hadoop的安装、配置和开发流程,从而顺利入门Map/Reduce编程。随着经验的增长,可以进一步探索更复杂的数据处理任务和优化策略,如Combiner的使用、Shuffle和Sort过程...
例如,`org.apache.hadoop.mapred.MapTask`和`org.apache.hadoop.mapreduce.ReduceTask`分别对应Map和Reduce任务的实现,开发者可以通过阅读这些源码了解任务执行的详细流程。 7. **工具集成**:有许多开源工具可以...
JobTracker负责调度和监控所有的Map和Reduce任务,确保任务的正确执行和资源的有效分配。然而,在Hadoop 2.x版本中,JobTracker被YARN(Yet Another Resource Negotiator)取代,YARN成为资源管理和任务调度的中心,...
ebsdi-apps则包含具体的MapReduce作业,它们简单调用ebsdi-domain中的接口来执行业务逻辑。 实现MapReduce程序的流程大致如下: 1. 创建输入实体类,确保属性与HDFS中的原始数据字段匹配,并实现MREntity抽象类的...
**任务执行与环境**:Map-Reduce框架提供了丰富的API,允许用户监控任务的执行状态,包括任务进度、错误日志、内存使用情况等,有助于及时发现和解决执行过程中的问题。 **作业提交与监控**:用户可通过Hadoop...
然后,Master、Worker、Map 操作(M 个)、Reduce 操作(R 个)是构成执行程序的主要部分,其中 Map/Reduce 的处理任务会由 Master 伴随物联网的快速发展和广泛应用,人们可以有效利用物联网来实现信息交换和通信的...
map reduce的全部执行流程,源码分析视图
#### 六、Map-Reduce 的执行流程 Map-Reduce 的执行过程主要包括以下几个步骤: 1. **数据切分**:输入数据按照一定的规则被切分成多个部分,每个部分由一个 Map 任务处理。 2. **Map 任务**:每个 Map 任务处理一...
输入分片处理是 Map-Reduce 工作流程的关键部分。每个输入分片对应一个 Map 任务。处理流程如下: 1. **分片信息获取**:通过输入格式化器 (`InputFormat`) 获取输入分片信息。 2. **分片信息写入**:将分片信息...
在本文的研究中,作者首先对MapReduce作业的执行流程进行了深入研究,并分析了现有的开源ETL项目,以理解大数据ETL处理的现状。通过对MapReduce特性和ETL需求的综合考虑,作者提出了一个改进的链式MapReduce框架。这...
Map/Reduce的工作流程可以分为以下几个步骤: 1. **Input**:用户应用程序需要提供Map和Reduce函数。输入数据会被分成多个片段,每个片段由一个Map任务处理。 2. **Map**:Map函数会对输入的数据进行处理,生成键值...
- **执行引擎**:将执行计划转换为一系列Map-Reduce任务,并调度执行。 - **日志和服务监控**:记录系统的运行日志并对服务进行监控。 **3.2 查询生命周期** 一个典型的Hive查询生命周期大致分为以下几个步骤: 1...
Reduce阶段接收来自多个Map任务的中间键值对,对每个键执行一次Reduce函数。Reduce函数的主要任务是对一组键值对进行聚合操作,生成新的键值对作为输出。这一步骤通常用于计算汇总信息,例如求和、计数等。 五、...
因此,研究中提出了Map/Reduce化的Apriori算法处理流程,包括用户请求处理、任务分配、数据映射处理、支持度计算和局部频繁项集生成等步骤。通过Master节点的调度,各个DataNode节点并行扫描处理,最终确定全局支持...
它通过将任务分解为一系列可并行执行的Map任务和Reduce任务,实现了对海量数据的有效处理。在这个名为"MapReduceProject.rar"的压缩包中,我们将会深入探讨MapReduce在实现WordCount案例中的应用,同时涵盖了自定义...
通过熟练掌握Hadoop API,开发者可以构建复杂的数据处理流程,执行分布式计算任务,实现大数据分析和处理。Hadoop API不仅限于文件操作,还包括读取、写入、追加数据,以及更复杂的MapReduce任务,如数据过滤、聚合...
Hadoop是一个开源的分布式计算平台,其核心组件Hadoop Distributed File System(HDFS)和Map/Reduce编程模型能够有效地处理海量数据。Hadoop在数据挖掘领域中的应用,主要是通过并行算法的框架实现对大规模数据集的...