Mapreduce:在单个作业中同时从 mapper 和 reducer 写入
Posted
技术标签:
【中文标题】Mapreduce:在单个作业中同时从 mapper 和 reducer 写入【英文标题】:Mapreduce: writing from both mapper and reducer in single job 【发布时间】:2015-07-30 23:40:40 【问题描述】:我需要只将选定的记录从映射器发送到减速器,然后将过滤器记录从映射器本身写入 hdfs。 Reducer 将写入记录发送到 reducer。我的工作是处理 20TB 的海量数据,它使用 30K 映射器,所以我相信我也不能从映射器的清理方法中写入,因为从 30K 映射器的输出文件(30k 文件)加载数据将是下一个工作的另一个问题.我正在使用 CDH4。有没有人用任何其他不同的方法实现了类似的场景?
【问题讨论】:
一个非常有趣的问题! (+1)。我曾经遇到过这个问题,除了将映射器的记录也发送到reducer,然后从reducer 中写入所有内容(过滤哪些记录需要进一步处理之后),我什么也没找到。当然,这是非常低效的,而不是直接从映射器写东西 【参考方案1】:当你想将数据写入HDFS时,是通过java客户端和HDFS吗?如果是,那么您可以编写条件逻辑以写入 HDFS 并写入输出位置,reducer 将从该位置拾取。不满足条件的记录可以使用 mapper 写入输出位置,然后由 reducer 提取。 默认情况下,输出位置也是 HDFS 位置,但您必须根据自己的情况查看希望数据在 HDFS 中的哪种方式。
【讨论】:
感谢您的回复。我正在使用许多自定义公式实现地图侧连接,需要通过 MR 程序进行。我的问题是,当我从映射器写入时,它会创建许多文件(等于工作中没有映射器,并且每个映射器都创建了自己的文件,在我的例子中是 40 个映射器)。这是读取这些文件(在我的情况下为 40K 文件)的下一个后续工作的问题。有没有办法可以组合这些文件或来自映射器的 o/p 数据,这样我就可以控制从映射器写入的文件的数量。 为什么不给目录名,以便后续作业。输出文件的数量,应该不是问题,除非你有需求左右。 如果您没有更多的小文件(40k+),大多数情况下,hadoop 都在努力将路径和其他元信息保留在内存中以进行所有读取操作。对我来说,当我的下一个作业触发并尝试加载这些 40K 文件时,它会挂起 CDH4 集群。 您可以查看here 进行合并。大多数情况下 getmerge 应该为您解决问题。一旦你有了一个文件,它就取决于你了。注意将其合并到本地 m/c以上是关于Mapreduce:在单个作业中同时从 mapper 和 reducer 写入的主要内容,如果未能解决你的问题,请参考以下文章
Spark:从具有不同内存/核心配置的单个JVM作业同时启动
基于大数据开发套件定时调度带资源文件的MapReduce作业