2012-10-29 99 views
-2

我是MapReduce的新手,並希望您對以下任務的最佳MapReduce方法有所意見。MapReduce來計算對的出現次數

我有一個大型文檔格式

1 2 3 
2 
2 3 4 5 

每一行都有編號的列表。我想在任何一行中列出每個可能的(對)數字組合。我想要包含每個給定對的行數。

,結果會是怎樣

element1 element2 occurrences 
1  1  1 
1  2  1 
1  3  1 
2  2  3 
2  3  2 
3  3  2 
3  4  1 
3  5  1 

大約有2M線路中的文件,以及約1.5M不同的數字。將會有大約2.5G不同的數字對被計數。

的挺直向前僞代碼是這樣的: 調用的地圖每行的文件

Map(int lineId, list<int> elements) 
{ 
    for each pair of integers in elements 
    emit(pair, 1) 
} 

Reduce((int, int) pair, list<int> counts) 
{ 
    return sum(counts) 
} 

在但這種方法需要2M映射器和2.5G減速。這是一種合理的方式嗎? 計劃在Azure上嘗試Hadoop。

+0

什麼是單位「G」?通常情況下,您將#of文件作爲mappers和一個reducer的數量。 –

+0

M = 10^6。 G = 10^9。因此,如果我使用列出的僞代碼,我將擁有2,000,000個映射器和2,500,000,000個reducer。 – user628904

+0

什麼?你認爲它會爲每條記錄產生一個映射器嗎?它將爲每個64mib塊啓動一個映射器,具體取決於可能的塊大小。您可以手動設置減速器的數量,您應該爲大約1gb的數據分配一個減速器。你的情況我沒有看到2mio映射器。 –

回答

3

但是,這種方法將需要2M映射器和2.5G減速器。這是一種合理的方式嗎?規劃在Azure上嘗試Hadoop。

這個假設是不正確的。

FileInputFormat的映射器數量等於輸入拆分的數量。輸入拆分可映射到HDFS中的塊,默認爲64MB。所以,如果輸入文件是1024 MB,那麼將啓動16個地圖任務。

可使用參數mapred.reduce.tasks默認爲1來配置減速機的數量。另請注意,combiner可用於使作業更快完成。

爲了更好地理解MapReduce和Hadoop,建議通過Hadoop - The Definitive Guide

0

總之,我不是專家,但我會做到這一點。 @Thomas Jungblut的觀點很重要 - 每個文件的每個塊都會映射一個映射器(大小是可配置的,並且達到最大值),因此您不會有像您想象的那樣多的映射器,除此之外 - 使用平臺像Hadoop,在一定程度上,就是讓它弄清楚。你的邏輯是正確的。