要使用计数器,我需要能够访问Reporter对象。
Reporter对象作为参数传递给map()和reduce(),因此我可以这样做: 记者.incrCounter(NUM_RECORDS,1);
但我需要在MultipleOutputFormat类中使用计数器(我正在使用方法 generateFileNameForKeyValue)
问题:如何访问MultipleOutputFormat类中的Reporter对象?
答案 0 :(得分:1)
您可以创建自己的MultipleOutputFormat
类,MyMultipleOutputFormat
(听起来有点像你)并创建一个接收Reporter
的函数(以及其他参数)然后调用基础generateFileNameForKeyValue
。
如果有办法,您可以从需要录制的地方访问Job
。您可以从context
job
获取context.getConfiguration()
,然后递增计数器(context.getCounter(YOUR_COUNTER.HERE).increment(1);
)
我不知道你的具体情况,但是试图在一个应该对单个记录起作用的函数中使用计数器似乎是不必要的,并且可能在“外部”进行访问Reporter
/ Context
很简单。我可能是错的,那里需要你的情况/使用计数器,但是我建议你检查一下你是否真的需要它,或者它是否也可以在外面完成。
编辑:回应几个不清楚的观点;
创建一个包含Reporter
的函数:由于您要扩展MultipleOutputFormat
,因此可以添加其他函数。如果您添加generateFileNameForKeyValueAndTrack(K key, V value, String name, Reporter reporter)
的函数定义,则可以在该函数中执行计数器递增,并让generateFileNameForKeyValue
调用key
,value
和name
在内部使用计数器似乎不需要:我假设您在generateFileNameForKeyValue
函数内调用了map
。如果该假设错误,用任何函数替换map
。创建一个集合(不管在什么类型,只要它可以做我描述的)你存储生成的文件名。每次生成文件名时,您都可以检查它是否存在于集合中并递增相应的计数器。
我可以看到在generate...
函数中执行它的吸引力,以避免重复数据,所以我(在我的头脑中)可能会创建附加函数(如上所述)。
我希望这有助于澄清我的建议。
如果您对此帖有任何意见/疑问,请保持通讯畅通(并通知我),请使用为此帖添加评论,而不是添加答案。