我有一系列 Map/Reduce 作业:
Job1 将带有时间戳的数据作为键,将一些数据作为值并对其进行转换。
对于 Job2,我需要将 Job1 中所有映射器中出现的最大时间戳作为参数传递。 (我知道如何将参数传递给Mappers/Reducers)
我可以跟踪 Job1 的每个映射器中的最大时间戳,但是如何获取所有映射器的最大值并将其作为参数传递给 Job2?
我想避免仅仅为了确定最大时间戳而运行 Map/Reduce 作业,因为我的数据集大小达到 TB+ 规模。
有没有办法使用 Hadoop 或 Zookeeper 来完成此任务?
最佳答案
2 个 map 无法相互通信。因此,只有作业(job1)的 map 无法获得全局最大值。时间戳。但是,我可以想到以下两种方法。
我假设您的 job1 目前只是一个 map 作业,并且您正在从 map 本身写入输出。
A.更改映射器以使用 MultipleOutputs 而不是 Context 或 OutputCollector 写入主输出。使用 context.write() 将附加的 (key,value) 对作为 (constant,timestamp) 发出。这样,您只对 (constant,timestamp) 对进行洗牌添加一个计算最大值的 reducer 。在它收到的值中。运行作业,将reducer的数量设置为1。从mapper写入的输出将为您提供原始输出,而从reducer写入的输出将为您提供全局最大值。时间戳。
B.在 job1 中,写入最大值。每个映射器中的时间戳作为输出。您可以在 cleanup() 中执行此操作。使用 MultipleOutputs 写入原始输出以外的文件夹。 一旦 job1 完成,假设 job1 中有“x”个映射器,输出文件夹中就会有“x”个零件文件。您可以对此文件夹执行 getmerge,将所有零件文件放入一个本地文件中。该文件将具有“x”行每行包含一个时间戳。您可以使用独立的 java 程序读取此内容,查找全局最大值。时间戳并将其保存在某个本地文件中。使用 distrib 缓存将此文件共享到 job2 或传递全局最大值。作为参数。
关于hadoop - 将所有映射器中遇到的最大键作为参数传递给下一个作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16652155/