Hadoop Partitioner 中的自定义计数器
Posted
技术标签:
【中文标题】Hadoop Partitioner 中的自定义计数器【英文标题】:Custom Counter inside the Hadoop Partitioner 【发布时间】:2013-04-16 18:17:07 【问题描述】:我想捕获一些关于键及其值的信息 一个自定义的 Partitioner(甚至是默认的 HashPartitioner)。
我可以通过访问“上下文”变量在映射器和缩减器中使用自定义计数器。 但是,在 Partitioner 内部,无法访问“context”变量。
有没有办法: -1- 从分区器访问“上下文”变量? 或者 -2- 如何在 Partitioner 中添加计数器?
谢谢。
【问题讨论】:
【参考方案1】:每个通过分区器的键/值对要么 (1) 由映射器写入上下文,要么 (2) 将传递给 reducer 的 reduce() 方法。您可以将代码放在这两个位置中的任何一个中,以编写自定义计数器并将其递增到上下文。
如果您必须在分区器中编写代码,请尝试让您的分区器实现 JobConfigurable。这应该使 hadoop 在第一次实例化分区器时使用 JobConf 对象调用您的分区器。您可以将信息放入您的配置中(例如将信息输出到的顺序文件或文本文件的名称)并以这种方式将其传递给您的分区器。
【讨论】:
感谢克里斯的回答。正如您所说,可以在映射器或化简器上添加计数器。但我真正需要的是这些值的拦截器,而无需访问映射器或减速器代码。有什么办法可以在 Hadoop 中编写拦截器?【参考方案2】:无法访问分区程序中的上下文(因此也无法访问计数器)。
不确定为什么不能像 Chris Gerken 建议的那样在映射器中添加逻辑,但类似/替代方法是创建一个映射包装类,在其中创建一个 Mapper.Context 包装类,然后委托给带有此包装上下文的所需 Mapper 类的实际 map 方法 - 然后你可以拦截 context.write 方法调用并做你想做的事情 - 与仅更新映射器代码没有任何不同。
【讨论】:
以上是关于Hadoop Partitioner 中的自定义计数器的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop Mapreduce 中的Partitioner
学习笔记Hadoop(十五)—— MapReduce编程进阶