hadoop - 将所有映射器中遇到的最大键作为参数传递给下一个作业

标签 hadoop

我有一系列 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/

相关文章:

macos - 使用docker-compose从mac osx的网桥网络上的docker容器访问IP

rest - Ambari-堆栈中不受支持或无效的服务

azure - Azure HDInsights 中的 headnodehost

java - MapReduce中是否可以在同一个键下输出多个值?

hadoop - 无法使用直线在配置单元表中插入值

linux - Spark sbin/folder 中的 stop-all.sh 没有停止所有从节点

hadoop - 停止配置单元将临时文件写入 s3

hadoop - Cassandra nodetool快照创建快照目录,但不在指定的数据目录中

hadoop - 使用 Cloudera Hbase 需要任何许可证吗?

hadoop - 如何使用 Spark 编写 avro 文件?