Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2022-07-02, 13:28

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




發表新文章 回覆主題  [ 8 篇文章 ] 
發表人 內容
 文章主題 : 如何让Mapreduce的结果输出到标准输出,而不是输出到文件中???
文章發表於 : 2013-12-05, 10:08 
離線

註冊時間: 2013-12-05, 10:05
文章: 8
如题所示。比较急,望各位大牛能够帮小弟解决这个问题


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 如何让Mapreduce的结果输出到标准输出,而不是输出到文件中???
文章發表於 : 2013-12-06, 00:52 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
trageman 寫:
如题所示。比较急,望各位大牛能够帮小弟解决这个问题

trageman 寫:
我需要對hadoop進行改寫,將Mapreduce的輸出改成STDOUT,而不是輸出到HDFS上去?求論壇的大牛指點


如果 MapReduce 的 main() 是自己寫的,呼叫 hadoop fs -cat 的指令把結果印出來,最快又不用改寫。
追 FsShell.java , -cat 是透過 IOUtils.copyBytes( FileSystem.open(PATH) , System.out, Configure, false ) 處理的

若要讓結果直接輸出到 STDOUT,就得自訂 OutputFormat 了。

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 如何让Mapreduce的结果输出到标准输出,而不是输出到文件中???
文章發表於 : 2013-12-06, 08:38 
離線

註冊時間: 2013-12-05, 10:05
文章: 8
jazz 寫:
trageman 寫:
如题所示。比较急,望各位大牛能够帮小弟解决这个问题

trageman 寫:
我需要對hadoop進行改寫,將Mapreduce的輸出改成STDOUT,而不是輸出到HDFS上去?求論壇的大牛指點


如果 MapReduce 的 main() 是自己寫的,呼叫 hadoop fs -cat 的指令把結果印出來,最快又不用改寫。
追 FsShell.java , -cat 是透過 IOUtils.copyBytes( FileSystem.open(PATH) , System.out, Configure, false ) 處理的

若要讓結果直接輸出到 STDOUT,就得自訂 OutputFormat 了。

- Jazz

有個疑問,如何讓Mapreduce不輸出它的控制流信息到STDOUT,如下所示:
packageJobJar: [/tmp/hadoop-rojia/hadoop-unjar4103527870650339912/] [] /tmp/streamjob8029198157569001982.jar tmpDir=null
13/12/05 03:11:57 INFO hdfs.DFSClient: Created HDFS_DELEGATION_TOKEN token 1792690 for rojia on 10.103.102.200:8020
13/12/05 03:11:57 INFO security.TokenCache: Got dt for hdfs://ares-nn.vip.ebay.com:8020/tmp/ha ... 2.200:8020
還有就是把結果輸出到STDOUT,會不會和這些控制信息衝突呢?


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 如何让Mapreduce的结果输出到标准输出,而不是输出到文件中???
文章發表於 : 2013-12-06, 14:42 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
trageman 寫:
有個疑問,如何讓Mapreduce不輸出它的控制流信息到STDOUT,如下所示:
packageJobJar: [/tmp/hadoop-rojia/hadoop-unjar4103527870650339912/] [] /tmp/streamjob8029198157569001982.jar tmpDir=null
13/12/05 03:11:57 INFO hdfs.DFSClient: Created HDFS_DELEGATION_TOKEN token 1792690 for rojia on 10.103.102.200:8020
13/12/05 03:11:57 INFO security.TokenCache: Got dt for hdfs://ares-nn.vip.ebay.com:8020/tmp/ha ... 2.200:8020
還有就是把結果輸出到STDOUT,會不會和這些控制信息衝突呢?


簡要回答:
(1) 將控制流信息導向其他 File Descriptor - 寫在 main() 中
(2) 當 (1) 成立時,也可以達成將結果輸出到 STDOUT 的目標,不會衝突。

我大致上從 Linux File Descriptor 的概念來想,pseudo code 可能類似底下列的步驟,不太好圖解,只能畫個示意。
若您有 Unix pipe + file descriptor 的觀念,就能比較清楚知道我在畫什麼。

代碼:
        fs = open("/tmp/myjob_log",rw)
        dup(STDOUT, fs)
        close(STDOUT)
        reduce_pipe = someway_to_get_from_all_reducers()
        dup(reduce_pipe, STDOUT)
   
  main()
    |
    +----- STDOUT (="/proc/$PID/fs/1" -> "/dev/pts/1") -> dup() -> fs (="/tmp/myjob_log")
              |
              V
            close()

  reduce()
    |
    +----- reduce_pipe (="pipe:XXXX") -> dup() -> STDOUT(="/dev/pts/1")


複雜回答:

控制流訊息主要是 main() 的 process 的 STDOUT
而您要的輸出到 STDOUT 則是 reducer process 的 STDOUT
所以難度在於 reducer process 若是多個,必須要把全部的 STDOUT 匯集到同一個 file descriptor。
這也是為何很多人認為您想做的事情只能存在單機模式(Standalone Mode, local mode)

當運行於全分散模式(Full Distributed Mode)底下時,問題就變得更複雜了。
main process 可能在您執行 hadoop jar 的筆電 (Ex. hostname = myPC)
reducer process 可能存在 TT1 , TT5, TT9 三台主機,所以三台主機的 STDOUT 如何變成 myPC 的 STDOUT
就必須網路是互通的狀態,myPC 若在 NAT 底下,若 TT1, TT5, TT9 在 private IP 叢集內部,
那能否透過 pipe , RPC , socket 的連線模式做匯集?這些都有技術上的瓶頸。

這也是為何 hadoop MapReduce Job 的 history 是放在 HDFS 上,因為 HDFS 是全部分散節點的共通空間。

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 如何让Mapreduce的结果输出到标准输出,而不是输出到文件中???
文章發表於 : 2013-12-06, 15:39 
離線

註冊時間: 2013-12-05, 10:05
文章: 8
jazz 寫:
trageman 寫:
有個疑問,如何讓Mapreduce不輸出它的控制流信息到STDOUT,如下所示:
packageJobJar: [/tmp/hadoop-rojia/hadoop-unjar4103527870650339912/] [] /tmp/streamjob8029198157569001982.jar tmpDir=null
13/12/05 03:11:57 INFO hdfs.DFSClient: Created HDFS_DELEGATION_TOKEN token 1792690 for rojia on 10.103.102.200:8020
13/12/05 03:11:57 INFO security.TokenCache: Got dt for hdfs://ares-nn.vip.ebay.com:8020/tmp/ha ... 2.200:8020
還有就是把結果輸出到STDOUT,會不會和這些控制信息衝突呢?


簡要回答:
(1) 將控制流信息導向其他 File Descriptor - 寫在 main() 中
(2) 當 (1) 成立時,也可以達成將結果輸出到 STDOUT 的目標,不會衝突。

我大致上從 Linux File Descriptor 的概念來想,pseudo code 可能類似底下列的步驟,不太好圖解,只能畫個示意。
若您有 Unix pipe + file descriptor 的觀念,就能比較清楚知道我在畫什麼。

代碼:
        fs = open("/tmp/myjob_log",rw)
        dup(STDOUT, fs)
        close(STDOUT)
        reduce_pipe = someway_to_get_from_all_reducers()
        dup(reduce_pipe, STDOUT)
   
  main()
    |
    +----- STDOUT (="/proc/$PID/fs/1" -> "/dev/pts/1") -> dup() -> fs (="/tmp/myjob_log")
              |
              V
            close()

  reduce()
    |
    +----- reduce_pipe (="pipe:XXXX") -> dup() -> STDOUT(="/dev/pts/1")


複雜回答:

控制流訊息主要是 main() 的 process 的 STDOUT
而您要的輸出到 STDOUT 則是 reducer process 的 STDOUT
所以難度在於 reducer process 若是多個,必須要把全部的 STDOUT 匯集到同一個 file descriptor。
這也是為何很多人認為您想做的事情只能存在單機模式(Standalone Mode, local mode)

當運行於全分散模式(Full Distributed Mode)底下時,問題就變得更複雜了。
main process 可能在您執行 hadoop jar 的筆電 (Ex. hostname = myPC)
reducer process 可能存在 TT1 , TT5, TT9 三台主機,所以三台主機的 STDOUT 如何變成 myPC 的 STDOUT
就必須網路是互通的狀態,myPC 若在 NAT 底下,若 TT1, TT5, TT9 在 private IP 叢集內部,
那能否透過 pipe , RPC , socket 的連線模式做匯集?這些都有技術上的瓶頸。

這也是為何 hadoop MapReduce Job 的 history 是放在 HDFS 上,因為 HDFS 是全部分散節點的共通空間。

- Jazz


我大致理解了你的意思。如果我在myPC上運行hadoop fs -cat HDFSfilename -,結果就會輸出到myPC的STDOUT,這個命令的運行過程是不是就像你在複雜回答里說的那樣呢——在全分散模式(Full Distributed Mode)底下時,把幾個DataNode的STDOUT匯集到myPC的STDOUT呢?


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 如何让Mapreduce的结果输出到标准输出,而不是输出到文件中???
文章發表於 : 2013-12-06, 16:12 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
trageman 寫:
我大致理解了你的意思。如果我在myPC上運行hadoop fs -cat HDFSfilename -,結果就會輸出到myPC的STDOUT,這個命令的運行過程是不是就像你在複雜回答里說的那樣呢——在全分散模式(Full Distributed Mode)底下時,把幾個DataNode的STDOUT匯集到myPC的STDOUT呢?


在 myPC 的 main() 中呼叫 FsShell 的 void cat(final String src, boolean verifyChecksum)
會比較簡單,而且也不用處理 File Descriptor 的 pipe 接來接去,還要斷開等繁雜的步驟。

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 如何让Mapreduce的结果输出到标准输出,而不是输出到文件中???
文章發表於 : 2013-12-06, 22:37 
離線

註冊時間: 2013-12-05, 10:05
文章: 8
jazz 寫:
trageman 寫:
我大致理解了你的意思。如果我在myPC上運行hadoop fs -cat HDFSfilename -,結果就會輸出到myPC的STDOUT,這個命令的運行過程是不是就像你在複雜回答里說的那樣呢——在全分散模式(Full Distributed Mode)底下時,把幾個DataNode的STDOUT匯集到myPC的STDOUT呢?


在 myPC 的 main() 中呼叫 FsShell 的 void cat(final String src, boolean verifyChecksum)
會比較簡單,而且也不用處理 File Descriptor 的 pipe 接來接去,還要斷開等繁雜的步驟。

- Jazz

我不是直接編寫一個Mapreduce程序,而是使用streaming pipe來執行c程序,將結果輸出到STDOUT。這樣的話如何定制output format呢?


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 如何让Mapreduce的结果输出到标准输出,而不是输出到文件中???
文章發表於 : 2013-12-09, 21:06 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
trageman 寫:
我不是直接編寫一個Mapreduce程序,而是使用streaming pipe來執行c程序,將結果輸出到STDOUT。這樣的話如何定制output format呢?


確認一下,是用 Hadoop Pipes API (C++) 還是用 Hadoop Streaming 呢?

- Jazz


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

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


誰在線上

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


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

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