2011-01-29 105 views
1

由於我們需要在一堆文件中讀取到映射器,在非Hadoop的 環境中,我使用os.walk(dir)file=open(path, mode)來讀取 中的每個文件。STDIN或文件作爲Hadoop環境中的映射器輸入?

然而,在Hadoop的環境,因爲我讀了HadoopStreaming轉換 文件輸入到減速機的映射,與CONVER標準輸出的標準輸入到文件 輸出,我有幾個問題如何輸入文件:

  1. 我們是否必須在mapper.py中設置STDIN的輸入,並讓 HadoopStreaming將hdfs輸入目錄中的文件轉換爲STDIN?

  2. 如果我想單獨讀取每個文件並解析每一行,如何在mapper.py中設置輸入文件的輸入方式 ?

我非Hadoop的環境套以前的Python代碼: 根目錄,文件在os.walk文件( '非HDFS的路徑') .....

然而,在Hadoop環境中,我需要將'非hdfs的路徑'更改爲 HDFS的路徑,其中我copyFromLocal爲,但我嘗試了許多沒有 的成功,例如os.walk('/user/hadoop/in') - 這是我通過運行bin/hadoop dfs -ls,和os.walk('home/hadoop/files') - 這個 是我在非Hadoop環境下的本地路徑,甚至是os.walk('hdfs:// host:fs_port/user/hadoop/in') .. ..

任何人都可以告訴我,我是否可以通過在mapper.py中使用文件 操作從文件輸入或我必須從STDIN輸入?

謝謝。

回答

1

Hadoop流式傳輸需要STDIN的輸入。我認爲您遇到的困惑是您正在嘗試編寫代碼來完成Hadoop Streaming爲您做的一些事情。我剛開始創建Hadooping時就這麼做了。

Hadoop流可以讀取多個文件甚至多個壓縮文件,然後將它一次一行地解析到映射器的STDIN中。這是一個有用的抽象,因爲您然後將您的映射器寫入文件名/位置獨立。然後,您可以使用您的映射器和簡化器來處理稍後方便的任何輸入。另外,你不希望你的映射器試圖抓取文件,因爲你無法知道你稍後會有多少映射器。如果文件被編碼到映射器中,那麼如果單個映射器失敗,則永遠不會從在該映射器中硬編碼的文件獲得輸出。因此,讓Hadoop進行文件管理,讓您的代碼儘可能通用。

+0

嗨@JD Long,我在hdfs目錄中有很多csv文件,我想從目錄中讀取所有csv文件,你能建議我該怎麼做。我很困惑該怎麼做。正如我在本地從目錄讀取csv文件的腳本測試。如果我在服務器上運行它,它會在輸入流上工作,所以我讀取文件時發生異常(流式傳輸命令失敗)。我是新的python for hadoop,所以我不知道該怎麼做。請建議我該怎麼做 – MegaBytes

+0

你試過了什麼?看看這個,然後嘗試破解一些東西。如果遇到困難,請將其形成StackOverflow問題。然後重複這個過程:http://blog.cloudera.com/blog/2013/01/a-guide-to-python-frameworks-for-hadoop/ –

相關問題