2011-07-21 51 views
0

我想从用户那里得到一个输入,并将它传递给我创建的映射类,但是每当该值总是初始化为零而不是使用用户输入的实际值时。发送一个变量到Mapper类

如何确保每当我得到变量时始终保持相同的值。我注意到了job1.setMapperClass(Parallel_for.class);创建类的实例,从而强制变量重新初始化为其原始值。以下是两个班级的链接。我试图从RunnerTool类中获取时间的值。在映射器

Link to Java TestFor class

Link to RunnerTool class

//设置方法

@Override 
public void setup(Context context) { 
    int defaultValue = 1; 
    times = context.getConfiguration().getInt("parallel_for_iteration", defaultValue); 
    LOG.info(context.getConfiguration().get("parallel_for_iteration") + " Actually name from the commandline"); 
    LOG.info(times + " Actually number of iteration from the commandline"); 
} 

// RunnerTools类

conf.setInt(迭代中,倍);

回答

0

Mapper get通过反射初始化,因此您不能让用户与映射器类交互。

相反,你有你的Configuration对象,你必须提供,如果你设置你的工作。在那里你可以使用conf.set("YOUR KEY", "YOUR VALUE")进行设置。在您的Mapper课程中,您可以覆盖名为setup(Context context)的方法,您可以使用context.getConfiguration().get("YOUR KEY")获取该值。也许保存到你的映射器局部变量。

+0

我尝试使用配置,但我得到空的属性,它会返回默认值。我做错了什么? – asembereng

+0

在您的代码中,您永远不会将密钥放入配置中,该如何工作? –

+0

我用conf.setInt(ITERATION,times);迭代被定义为受保护的最终静态字符串ITERATION = \t“parallel_for_iteration”; – asembereng

1

您应该注意,映射器类将在许多群集节点上重新创建,因此在运行作业时对映射器类实例执行的初始化操作不会影响其他节点。技术上相关的jar文件将分布在节点中,然后映射器将在那里创建。 正如上面的答案所指出的,将信息传递给映射器的唯一方法是使用配置类。

+0

我尝试使用配置,但我得到的属性为空,它会返回默认值。我做错了什么? – asembereng

+0

请在设置配置值时给出代码片段。 –

+0

// RunnerTools类 final static String ITERATION =“parallel_for_iteration”; conf.setInt(ITERATION,times); conf.setInt(ITERATION,times); – asembereng