分享

mr任务输入多个文件的情况

jchubby 发表于 2016-2-25 23:02:28 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 23605
假设map要读取file1和file2的内容并进行处理,那么使用FileInputFormat.setInputPaths(job, inPath1,inPath2);的话

问题1:读取文件的顺序是什么样子的?先path1后path2,还是随机读取?做过测试,map会先输出一行path2的内容之后将path1全部输出,之后再输出path2的剩余部分,将path1,2颠倒之后的结果一样,只做了两次测试,不知道准不准。

问题2:如果我需要在map中对两个文件的内容做一些聚合,例如:file1的第三行和file2的第二行合并起来输出,可是map是一行一行读取文件的,也就是说两个文件的某行没机会进行合并,请问这个怎么解决?

考虑过MultipleInputs.addInputPath();设置多个输入路径,但是每个输入的文件都在不同的map中处理,更没机会进行聚合了。
也考虑过ChainMapper进行链式的map过程,但是这是对于一个输入路径多个map处理的情况下使用的吧?
如果在Mapper类中设置一个成员属性专门来保存file1的内容,使得读取到file2的第二行时可以取出file1的第三行进行聚合,但是还是第一个问题,如果是随机读取文件,那么如果当读取到file2的第二行时,file1的第三行还没有读到,仍然没办法进行聚合。

描述的有点乱,希望有高手解答一下疑惑~

已有(5)人评论

跳转到指定楼层
atsky123 发表于 2016-2-26 09:08:49
楼主思考的不少。
不过还需要多找资料。
第一个问题:
这个先后顺序不是关键的。
很有可能是并发读的。输出的快慢,在于job的完成早与晚

第二个问题:
楼主最好先熟悉mapreduce join和hive join
对于mapreduce join属于笛卡尔积,这个还是比较难以办到的
而且即使是sql,也是同行,而不能错行。
楼主为何要错行?原因是什么?




回复

使用道具 举报

jchubby 发表于 2016-2-26 09:34:50
atsky123 发表于 2016-2-26 09:08
楼主思考的不少。
不过还需要多找资料。
第一个问题:

其实我的目的是这样的:要对file2的内容做一些处理,而处理过程是要根据file1中对应的内容来做的,如果没有先全部load file1的内容的话,那么处理file2的时候就有可能出现找不到对应数据的情况。网上看过一些demo,他们都是直接FileInputFormat.setInputPaths(job,path1,path2)之后就直接在一个map函数中写了处理两种文件的逻辑,并行写入的话这种做法好像是错误的呀
回复

使用道具 举报

atsky123 发表于 2016-2-26 10:11:08
jchubby 发表于 2016-2-26 09:34
其实我的目的是这样的:要对file2的内容做一些处理,而处理过程是要根据file1中对应的内容来做的,如果没 ...

文件的都是分割的,而且会被分发到多台机器。
不像传统的软件单机加载的过程
回复

使用道具 举报

jchubby 发表于 2016-2-26 10:15:35
atsky123 发表于 2016-2-26 10:11
文件的都是分割的,而且会被分发到多台机器。
不像传统的软件单机加载的过程

查了一下资料,貌似使用DistributedCache将file1缓存起来,在map中读取是可行的,需要测试一下~
回复

使用道具 举报

szcountryboy 发表于 2016-3-6 23:30:18
你file1第三行和file2第二行,是如何对应上的?

如果对应条件已知,则在map里面只处理相关数据,最后在reduce里面进行合并,可以去了解下wordCount, 举一反三下
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条