![](/img/trans.png)
[英]Python MapReduce Hadoop Streaming Job that requires 3 input files?
[英]Python MapReduce Hadoop Streaming Job that requires multiple input files?
我的群集File A
和File B
有兩個文件,包含以下數據 -
檔案A.
#Format:
#Food Item | Is_A_Fruit (BOOL)
Orange | Yes
Pineapple | Yes
Cucumber | No
Carrot | No
Mango | Yes
檔案B.
#Format:
#Food Item | Vendor Name
Orange | Vendor A
Pineapple | Vendor B
Cucumber | Vendor B
Carrot | Vendor B
Mango | Vendor A
基本上我想知道每個供應商銷售多少水果?
預期產量:
Vendor A | 2
Vendor B | 1
我需要使用hadoop流式傳輸python map reduce。
我已經閱讀了如何進行基本的單詞計數,我從sys.stdin
讀取並為reducer發出k,v
對然后減少。
我該如何處理這個問題?
我主要關注的是如何讀取多個文件,然后在Hadoop Streaming中進行比較。
我可以在普通的python中做到這一點(即沒有MapReduce和Hadoop,它很簡單。)但是對於我擁有的龐大數據大小它是不可行的。
文件A真的那么大嗎? 我會把它放在DistributedCache中並從那里讀取它。 要將其放入分布式緩存中,請在Hadoop流式調用中使用此選項:
-cacheFile 'hdfs://namenode:port/the/hdfs/path/to/FileA#FileA'
(我想以下應該也可以,但我還沒試過:)
-cacheFile '/the/hdfs/path/to/FileA#FileA'
請注意, #fileA
是用於使文件可供映射器使用的名稱。
然后,在你的映射器,你會讀到FILEB從sys.stdin
(asuming你叫使用Hadoop流-input '/user/foo/FileB'
)AND,讀FILEA,你應該做這樣的事情:
f = open('FileA', 'r')
...
f.readline()
現在,我想你已經想到了這一點,但對我來說,有一個像這樣的映射器是有道理的:
請看一下這個例子,因為它與您正在尋找的內容非常直接相關。
一種方法是將此作為兩個工作。
這就是說:@cabad建議的解決方案最好是文件足夠小。
如果沒有,那么二次分類的方法是最好的。 在@ Simplefish的答案中查看 本教程中的建議,了解如何在分區中進行二級排序(這些關鍵字將指向正確的方向來執行您想要的操作:保證與數據的順序相關聯給定的密鑰傳遞給reducer)。
最后一點:你的問題不是“如何從多個文件中讀取”,因為你設計的任何解決方案都不能依賴於知道輸入來自哪個文件(你需要依賴數據的結構,盡管如此在這個例子中不是問題)。
您只會將包含文件的目錄提供給hadoop。 Hadoop框架將讀取它們。 你沒有。
Hadoop會將您編碼的地圖類應用於所有文件內容。
然后,hadoop會將您編碼的reduce類應用於map類的所有輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.