Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2022-06-27, 05:00

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 4 篇文章 ] 
發表人 內容
 文章主題 : 請問如何讓一個job不繼續作下去
文章發表於 : 2011-01-07, 00:55 
離線

註冊時間: 2010-09-28, 13:23
文章: 10
如題,我想讓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

出現。

請問有高手可以提供一些方法嗎@@

萬分感謝!!!


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請問如何讓一個job不繼續作下去
文章發表於 : 2011-01-16, 12:40 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
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


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請問如何讓一個job不繼續作下去
文章發表於 : 2011-01-19, 14:50 
離線

註冊時間: 2010-09-28, 13:23
文章: 10
感謝j大回應,

且日前也已經在朝您說的方向進行了,

還是感謝啦!!


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請問如何讓一個job不繼續作下去
文章發表於 : 2011-01-19, 22:58 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
kof2000kyo 寫:
感謝j大回應,
且日前也已經在朝您說的方向進行了,
還是感謝啦!!


那天有嘗試用 System.exit(0) 來跳出 mapper,
不過這樣 Local Mode 的話,這樣會整個 java process 都被砍掉。
還在找有沒有其他替代方案,看樣子得找到一個比較恰當的方式結束 mapper。

- Jazz


回頂端
 個人資料 E-mail  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 4 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 4 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
正體中文語系由 竹貓星球 維護製作