我想在自定义分区器(甚至是默认的 HashPartitioner)中捕获一些关于键及其值的信息。
我可以通过访问“上下文”变量在映射器和减速器中使用自定义计数器。但是,在 Partitioner 内部,无法访问“context”变量。
有没有办法:-1- 从 Partitioner 访问“context”变量?或-2-如何向分区器添加计数器?
谢谢你。
我想在自定义分区器(甚至是默认的 HashPartitioner)中捕获一些关于键及其值的信息。
我可以通过访问“上下文”变量在映射器和减速器中使用自定义计数器。但是,在 Partitioner 内部,无法访问“context”变量。
有没有办法:-1- 从 Partitioner 访问“context”变量?或-2-如何向分区器添加计数器?
谢谢你。
通过分区器的每个键/值对要么(1)由映射器写入上下文,要么(2)将传递给reducer的reduce()方法。您可以将代码放在这两个位置中的任何一个中,以编写自定义计数器并将其递增到上下文。
如果您必须在分区器中编写代码,请尝试让您的分区器实现 JobConfigurable。这应该使 hadoop 在第一次实例化分区器时使用 JobConf 对象调用您的分区器。您可以将信息放入您的配置中(例如将信息输出到的顺序文件或文本文件的名称)并以这种方式将其传递给您的分区器。
无法访问分区器中的上下文(因此也无法访问计数器)。
不知道为什么你不能像 Chris Gerken 建议的那样在映射器中添加你的逻辑,但是类似/替代的方法是创建一个映射包装类,在其中创建一个 Mapper.Context 包装类,然后委托给实际的 map 方法你想要的 Mapper 类与这个包装的上下文 - 然后你可以拦截 context.write 方法调用并做你想做的事 - 与仅仅更新映射器代码没有任何不同。