Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 将所有映射程序中遇到的最大密钥作为参数传递给下一个作业_Hadoop - Fatal编程技术网

Hadoop 将所有映射程序中遇到的最大密钥作为参数传递给下一个作业

Hadoop 将所有映射程序中遇到的最大密钥作为参数传递给下一个作业,hadoop,Hadoop,我有一个映射/减少作业链: Job1将带有时间戳的数据作为键,将一些数据作为值,并对其进行转换 对于Job2,我需要将Job1中所有映射器上显示的最大时间戳作为参数传递。(我知道如何将参数传递给映射器/还原器) 我可以跟踪Job1的每个映射器中的最大时间戳,但是如何获得所有映射器中的最大时间戳并将其作为参数传递给Job2 我希望避免仅仅为了确定最大时间戳而运行Map/Reduce作业,因为我的数据集的大小是TB+级的 有没有办法用Hadoop或者Zookeeper来实现这一点?我建议你做以下几点

我有一个映射/减少作业链:

Job1将带有时间戳的数据作为键,将一些数据作为值,并对其进行转换

对于Job2,我需要将Job1中所有映射器上显示的最大时间戳作为参数传递。(我知道如何将参数传递给映射器/还原器)

我可以跟踪Job1的每个映射器中的最大时间戳,但是如何获得所有映射器中的最大时间戳并将其作为参数传递给Job2

我希望避免仅仅为了确定最大时间戳而运行Map/Reduce作业,因为我的数据集的大小是TB+级的


有没有办法用Hadoop或者Zookeeper来实现这一点?

我建议你做以下几点:,创建一个目录,在该目录中,您可以将每个映射器的最大值放入一个文件中,即映射器名称+id。这样做的目的是拥有第二个输出目录,并且为了避免并发问题,只需确保每个映射器都写入一个唯一的文件。保留最大值作为变量,并将其写入每个映射器
cleanup
方法上的文件


作业完成后,在辅助输出目录上迭代以找到最大值是很简单的。

两个映射无法相互通信。因此,仅映射作业(job1)无法获得全局最大时间戳。但是,我可以考虑以下两种方法

我假设您的job1当前是一个仅映射的作业,并且您正在从映射本身写入输出

A.更改映射器,使其使用MultipleOutputs而不是Context或OutputCollector写入主输出。使用Context.write()将附加(键、值)对作为(常量、时间戳)发出。这样,您只需将(常量、时间戳)对混洗到reducer。添加一个在接收到的值中调整最大值的reducer。运行作业,还原数设置为1。从mapper写入的输出将为您提供原始输出,而从reducer写入的输出将为您提供全局最大时间戳

B.在job1中,将每个映射器中的最大时间戳作为输出写入。您可以在cleanup()中执行此操作。使用MultipleOutputs写入原始输出以外的文件夹。
作业1完成后,假设作业1中有“x”映射器,则输出文件夹中有“x”个零件文件。您可以在此文件夹上执行getmerge,将所有零件文件合并到单个本地文件中。此文件将有“x”行,每个行包含一个时间戳。您可以使用独立java程序读取此文件,找到全局最大时间戳并将其保存在某个本地文件中。使用distrib cache将此文件共享给job2,或将全局最大时间戳作为参数传递。

基本上我的问题是:如何将所有映射器的最大时间戳传递给下一个作业(作为参数)?我可能会使用HBase或其他数据库,但在Hadoop中有办法做到这一点吗?你确定写入分布式缓存不会出现问题吗?这个页面说“…缓存文件不应该被应用程序修改,也不应该在作业执行时被外部修改。”在过去,我用它来进行像这样的最小写入(注意它在清理中),但根据这一点,我很幸运。不过我会改变我的答案,谢谢你指出这条线。