分享

RecordReader 里的initinitialize 为什么回执行了两次??

dsy198816 发表于 2016-12-21 15:41:18 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 6810
我在myrecordreader里 的initinitialize 里把一些日志写入本地文件,打开本地文件发现竟然输出了两次,这是为什么? 这个函数mapreduce执行时初始化用的吗? 初始化完了,在一条一条解析自定义的内容返回给map。

已有(5)人评论

跳转到指定楼层
starrycheng 发表于 2016-12-21 16:46:53
本帖最后由 starrycheng 于 2016-12-21 17:24 编辑

执行两次,说明有两个mapreduce【确切的是两个map】,初始化了两次。
每一个map在读取数据的时候RecordReader 会被调用,初始化一次。
回复

使用道具 举报

dsy198816 发表于 2016-12-21 17:01:43
非常感谢楼上的回答。。。但是我的分片函数是这么写的啊。。。
protected boolean isSplitable(Configuration conf, Path path) {
             return false;
        }
回复

使用道具 举报

dsy198816 发表于 2016-12-21 17:03:48
启动任务输出:
16/12/21 17:03:19 INFO mapreduce.JobSubmitter: number of splits:1

        Job Counters
                Launched map tasks=1
                Launched reduce tasks=1
                Data-local map tasks=1
回复

使用道具 举报

dsy198816 发表于 2016-12-21 17:04:20
不解为何有两个mapreduce...
回复

使用道具 举报

starrycheng 发表于 2016-12-21 17:34:10
本帖最后由 starrycheng 于 2016-12-21 17:35 编辑
dsy198816 发表于 2016-12-21 17:04
不解为何有两个mapreduce...


Mapper的处理过程:

1.1. InputFormat 产生 InputSplit,并且调用RecordReader将这些逻辑单元(InputSplit)转化为map task的输入。其中InputSplit是map task处理的最小输入单元的逻辑表示。

1.2. 在客户端代码中调用Job类来设置参数,并执行在hadoop集群的上的MapReduce程序。

1.3. Mapper类在Job中被实例化,并且通过MapContext对象来传递参数设置。可以调用Job.getConfiguration().set(“myKey”, “myVal”)来设置参数。

1.4. Mapper的run()方法调用了自身的setup()来设置参数。

1.5. Mapper的run()方法调用map(KeyInType, ValInType, Context)方法来依次处理InputSplit中输入的key/value数据对。并且可以通过Context参数的Context.write(KeyOutType, ValOutType)方法来发射处理的结果。用户程序还可以用Context来设置状态信息等。同时,用户还可以用Job.setCombinerClass(Class)来设置Combiner,将map产生的中间态数据在Mapper本地进行汇聚,从而减少传递给Reducer的数据。

1.6. Mapper的run()方法调用cleanup()方法。

上面是map任务的过程,map需要调用RecordReader,这时候他需要初始化一次



个人观点,楼主也可以找出向左的资料,相互探讨

来自:
关于Mapper、Reducer的个人总结
http://www.aboutyun.com/forum.php?mod=viewthread&tid=7066

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条