簡體   English   中英

Python MapReduce Hadoop Streaming Job需要多個輸入文件?

[英]Python MapReduce Hadoop Streaming Job that requires multiple input files?

我的群集File AFile 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()

現在,我想你已經想到了這一點,但對我來說,有一個像這樣的映射器是有道理的:

  1. 打開FileA
  2. 逐行讀取FileA(在循環中)並將其加載到地圖中,以便您可以輕松查找鍵並找到其值(是,否)。
  3. 從stdin讀取主循環。 在循環內,對於每一行(在FileB中),檢查您的地圖(參見步驟2)以確定您是否有水果......等。

請看一下這個例子,因為它與您正在尋找的內容非常直接相關。

一種方法是將此作為兩個工作。

  1. 過濾FileB,以便僅保留包含水果的行
    • Map1:“食物項目”的復合鍵,以及數據來自哪個文件。 對“食品項目”進行分區,並對該行是否包含“Is_A_Fruit”信息進行二次排序(以確保每個食品的減速器首先讀取該信息)。
    • Reduce1:使用二級排序,排序數據中的第一行將指示此Food Item是否為水果(在這種情況下reducer將輸出它)或不是(在這種情況下它不會)。
  2. 使用供應商作為密鑰來計算每個供應商的水果數量。
    • 現在第一個作業的MapReduce輸出與FileB具有相同的結構,但是所有行都是Fruits,所以這更像是wordcount,以Vendor Name作為鍵,然后計算行數。
    • 如果您需要獨特的水果,您可能需要再次使用二級排序,以消除將與每個供應商相關的所有水果加載到內存中的需要。

這就是說:@cabad建議的解決方案最好是文件足夠小。

如果沒有,那么二次分類的方法是最好的。 在@ Simplefish的答案中查看 本教程中的建議,了解如何在分區中進行二級排序(這些關鍵字將指向正確的方向來執行您想要的操作:保證與數據的順序相關聯給定的密​​鑰傳遞給reducer)。

最后一點:你的問題不是“如何從多個文件中讀取”,因為你設計的任何解決方案都不能依賴於知道輸入來自哪個文件(你需要依賴數據的結構,盡管如此在這個例子中不是問題)。

您只會將包含文件的目錄提供給hadoop。 Hadoop框架將讀取它們。 你沒有。

Hadoop會將您編碼的地圖類應用於所有文件內容。

然后,hadoop會將您編碼的reduce類應用於map類的所有輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM