kof2000kyo 寫:
如題,我想讓wordcount這個例子比對到我要的關鍵字後就不再繼續作下去,然後產生output。
我google發現網路上也有人問相同問題 ,
http://0rz.tw/g9OvT在他們的討論中是使用killjob() , 看似簡單,我也覺得簡單,於是我在 WordCount.java 中 class TokenizerMapper
的public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { }
裡面的while裡 加上 if 讓他比對到我的關鍵字就 killjob ( 另外整個 wordcount reducer 不做事)。 只是run之後只有第一次
成功 , 有output產生 , 之後 run 就是fail , 或也是成功 , 但是在output 資料夾裡面沒有作完的結果檔。
我猜想是因為在沒有任何map作完前 , 整個job就被kill掉了 , 所以output資料夾會沒有東西。
於是我試著在killjob()之前加上 void commitTask(TaskAttemptContext context) , 想說照他說的可以
Move the files from the work directory to the job output directory , 結果則是會有錯誤
Error running child java.lang.IllegalStateException: Job in state DEFINE instead of RUNNING
出現。
請問有高手可以提供一些方法嗎@@
萬分感謝!!!
我覺得用 killjob() 的作法有點過度暴力,我想把問題拆開來看。
第一個是您把 kill 放在 map 是因為您比對的動作是放在 map。
因此條件將發生在第一次有輸入檔案滿足條件就砍掉所有 Map,
很可能連 Reduce 都還沒跑。我覺得這樣太暴力了。
引言回覆:
結論一:您若是比對是發生在 Reduce 就不會造成沒有輸出的狀況。
其次,請記住這是平行分散式運算,相同邏輯會在不同機器中運行。
如果您想做的是每個檔案在做 Map 時,遇到特定字串,就結束 Map。
假設有四個檔案,有四個 Map,四個都在遇到條件滿足時,結束 Map,
然後讓 Reduce 把最後結果算出來。這種作法只要在 Map 程式中結束
Map 程序即可。
然而如果您要的邏輯是四個輸入檔案只要有任一檔案滿足條件,
就結束所有 Map 程序,那可能將需要一個機制去停止其他三個仍在比對的
Map 程序。這與 MapReduce 的基本精神有些許牴觸,目前我想到的方法
是運用 memcached 來作 Map 程序間的溝通,在 map 的迴圈中每次都先
去問 memcached 某個 STATE 變數,一旦有人更動了 STATE 變數(Ex.
False 變 True),就結束 Map。這樣才有辦法比較『斯文地』結束 Map,
並交給 Reduce 去產生輸出。
純就邏輯面來解釋這個問題,有空再設計一個範例來驗證。
- Jazz