hadoopMap器/还原器重用

0kjbasz6  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(405)

mapper/reducer示例如何在一个一直保持活动的jvm中重用?
例如,假设我想这样做:

  1. public class MyMapper extends MapReduceBase implements Mapper<K1, V1, K2, V2> {
  2. private Set<String> set = new HashSet<String>();
  3. public void map(K1 k1, V1 v1, OutputCollector<K2, V2> output, Reporter reporter) {
  4. ... do stuff ...
  5. set.add(k1.toString()); //add something to a list so that it can be used later
  6. ... do other stuff ...
  7. if(set.contains("someString"))
  8. emitSomeKindOfOutput(output);
  9. else
  10. emitSomeOtherKindOfOutput(output);
  11. }
  12. }

如果同一Map器可用于多个任务/作业,则成员集可能会导致问题,因为它仍将包含以前任务/作业中的其他垃圾。这种重用在hadoop中可能吗?减速机呢?

uurv41yg

uurv41yg1#

据我所知,hadoop是基于shared nothing架构的,因此您的“private set”变量不会在不同的Map器之间共享。所以,不应该有任何问题得到,如你所说-'垃圾从以前的Map'。

ippsafx7

ippsafx72#

你绝对安全。Map器和reducer示例不可重用。如果需要执行一些初始化或清理,可以重写这两种方法 configure 以及 close 由mapreducebase提供。这不是您的代码示例所要求的。
如果 set 是一个静态变量 clear 把它放在盒子里 close() 方法是安全的,即使大多数站点配置都不需要它(基本上,默认情况下,每个Map都会派生一个新的jvm),也必须进行配置 reuse.jvm.num.tasks 支持jvm重用)。两个map任务永远不会在同一个jvm中同时运行。

相关问题