2011-07-21 49 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