2012-07-19 47 views
0

如何在reducer中設置變量,在所有任務完成執行後驅動程序都可以讀取執行後的變量?喜歡的東西:在reducer中設置Hadoop變量並在驅動中讀取

class Driver extends Configured implements Tool{ 
    public int run(String[] args) throws Exception { 
    ... 
    JobClient.runJob(conf); // reducer sets some variable 
    String varValue = ...; // variable value is read by driver 
    } 
} 

替代方法

我想出了這個 「醜」 的解決方法。主要思想是您創建一組計數器,其中您只保存一個計數器,其名稱是您希望返回的值(您忽略實際計數器值)。代碼如下所示:

// reducer || mapper 
reporter.incrCounter("Group name", "counter name -> actual value", 0); 

// driver 
RunningJob runningJob = JobClient.runJob(conf); 
String value = runningJob.getCounters().getGroup("Group name").iterator().next().getName(); 

對於映射器也是如此。雖然這解決了我的問題,但我認爲這種解決方案是「醜陋的」。因此我讓問題開放

+0

將一個值添加到'conf'並在驅動程序中讀取它?我不確定數據是否會從映射器/還原器返回給驅動程序,但值得一試。 :) – Nija 2012-07-19 20:27:44

回答

1

您不能修改map/reduce任務中的配置,並且希望將更改持久保存到其他任務和/或提交作業的作業客戶端中的配置中(可以說您在reducer中編寫了不同的值 - 哪一個'勝出'並且堅持回來?)。

然而,你可以自己寫文件到HDFS中,然後在你的作業返回時讀回它 - 確實不難看出,但沒有辦法不涉及其他技術(Zookeeper,HBase或任何其他NoSQL/RDB )保持你的任務結束和你能夠在工作成功時檢索值之間的值。