我有一系列Map / Reduce工作:
Job1将带有时间戳的数据作为键,将一些数据作为值进行转换。
对于Job2,我需要传递Job1中所有映射器上显示的最大时间戳作为参数。 (我知道如何将参数传递给Mappers / Reducers)
我可以跟踪Job1的每个映射器中的最大时间戳,但是如何在所有映射器中获得最大值并将其作为参数传递给Job2?
我想避免运行Map / Reduce Job只是为了确定最大时间戳,因为我的数据集的大小是以TB级为单位。
有没有办法使用Hadoop或Zookeeper来实现这一目标?
答案 0 :(得分:1)
我建议执行以下操作,创建一个目录,您可以将每个Mapper的最大值放在一个映射器名称+ id的文件中。我们的想法是拥有第二个输出目录并避免并发问题,只需确保每个映射器都写入一个唯一的文件。将最大值保留为变量,并将其写入每个映射器cleanup
方法的文件中。
一旦作业完成,迭代辅助输出目录以找到最大值是微不足道的。
答案 1 :(得分:1)
2个地图无法相互通信。因此,只有地图的作业(job1)无法让你获得全局最大化。时间戳。但是,我可以想到两种方法如下。
我假设你的job1目前只是一个地图工作,你正在从地图本身写出输出。
一个。更改映射器以使用MultipleOutputs而不是Context或OutputCollector.Emit附加(键,值)对使用context.write()将(主,时间戳)对写入主输出。这样,您只需对(常量,时间戳)对进行洗牌减速器。添加一个最大化的减速器。它收到的值之间。运行,减速器的数量设置为1.从映射器写入的输出将为您提供原始输出,而从reducer写入的输出将为您提供全局最大值。时间戳。
B中。在job1中,写下最大值。每个映射器中的时间戳作为输出。您可以在cleanup()中执行此操作。使用MultipleOutputs写入除原始输出之外的文件夹。 一旦job1完成,你在输出文件夹中有'x'部分文件,假设你在job1中有'x'映射器。你可以对这个文件夹进行getmerge,将所有部分文件放到一个本地文件中。这个文件将有'x'行每个都包含一个时间戳。你可以使用一个独立的java程序读取它,找到全局最大值。时间戳并将其保存在某个本地文件中。使用distrib缓存将此文件共享到job2或传递全局最大值。作为参数。