Mapreduce多个map和reducer
Posted
技术标签:
【中文标题】Mapreduce多个map和reducer【英文标题】:Mapreduce multiple map and reducer 【发布时间】:2014-03-10 12:01:28 【问题描述】:我有csv文件,数据如下
lat,lng
18.1234,77.3443
18.345,77.335
18.356,77.345
所以基本上包含纬度和经度,每个CSV文件最大为1mb,我需要从CSV的第一条记录和第二条记录计算纬度和经度的距离。
i.e 18.1234, 77.3443 and 18.345, 77.335.
但是从映射器它会一次读取一行,所以我想在行之间添加分隔符('|'),所以上面的 CSV 文件记录将变成一行并输入映射器
Key->Filename
values-> All csv records as one line (all records seprated by delimetr) as text.
filename 18.1234,77.3443|18.345,77.335|18.356,77.345....
在 Reducer 中,我将按分隔符分割并计算后续记录[第一和第二坐标]之间的距离。
所以如果我有 30 个 CSV 文件,我想要 30 个映射器和 30 个减速器来处理这个 CSV 文件。 我还需要将此数据存储在 mysql 中。如纬度、经度、距离
【问题讨论】:
如果mapper和reducer之间存在1对1的映射,我看不出有reducer的原因。你最好只做一个 map 工作,因为在 mapper 和 reducer 之间没有数据混洗,所以效率更高。 csv 文件中的数据是相互关联的[上一条记录与下一条记录有关],所以我想像 OneFile->Map1->Readucer1.... 那样制作 mapreduce。我在做什么正确吗 我认为@PraveenSripati 是对的。您能描述一下您要解决的问题吗?也许它可以用另一种方式解决,而不是你想象的那样。 感谢您的回复,我也在主线程中描述了我的问题陈述。 【参考方案1】:如果每个 csv 文件小于默认块大小,只需获取当前映射器的 id 并将其作为键发出即可。
我相信您可以从映射器的配置中使用conf.get("mapred.tip.id")
获取此 id。
【讨论】:
谢谢.. 只是想知道 csv 文件是否大于块大小,是否有可能。 一个简单的解决方案是增加默认块大小,将其设置为大于最大的 csv 文件。否则,您可以获取输入文件的文件名并相应地设置地图输出键。以上是关于Mapreduce多个map和reducer的主要内容,如果未能解决你的问题,请参考以下文章