2011-12-19 22 views
4

我想在一個hadoop流式作業中使用CPython,它需要訪問保存在hadoop文件系統中的面向行文件的補充信息。通過「補充」我的意思是這個文件是除了通過標準輸入提供的信息。補充文件足夠大,我不能將它寫入內存並解析出行尾字符。是否有一種特別優雅的方式(或庫)一次處理一行文件?從CPython內部一次處理hdfs文件數據的最佳方法(不使用stdin)?

感謝,

的setjmp

回答

3

退房this documentation for Streaming使用Hadoop中數據流的作業Hadoop Distributed Cache。您首先將文件上傳到hdfs,然後在運行作業之前告訴Hadoop將其複製到任意位置,然後在作業的工作目錄中方便地放置符號鏈接。然後,您可以使用python的open()來讀取for line in f或其他任何文件。

分佈式緩存是推送文件(開箱即用)作爲資源利用的最有效方式。您不僅希望從流程中打開hdfs文件,因爲每個任務都會嘗試通過網絡流式傳輸文件...使用分佈式緩存,即使在同一節點上運行多個任務,也會下載一個副本。


首先,在運行作業時將-files hdfs://NN:9000/user/sup.txt#sup.txt添加到您的命令行參數中。

然後:

for line in open('sup.txt'): 
    # do stuff 
+0

請注意,我將鏈接更改爲文檔並稍微更新了我的答案。我引用了舊版本的文檔。它應該是最新的。 – 2011-12-19 03:21:17

1

你在找這個?

http://pydoop.sourceforge.net/docs/api_docs/hdfs_api.html#module-pydoop.hdfs

with pydoop.hdfs.open("supplementary", "r") as supplementary: 
    for line in supplementary: 
     # process line 
+0

看起來有前途的!我將在本週密切關注。謝謝。 – SetJmp 2011-12-19 02:55:31

+0

小心點。每個地圖任務都將通過網絡傳輸該文件。分佈式緩存在性能方面優越。這絕對會工作。 – 2011-12-19 02:57:34

+0

我已經成功嘗試了Pydoop方法和分佈式緩存。 Pydoop引入了對特定版本的Boost C++庫以及Hadoop版本的依賴關係。由於這個和其他原因,我選擇了文件作爲兩種方法中較好的一種。 – SetJmp 2011-12-23 21:53:11

相關問題