2015-07-10 79 views
1

我對reducer的理解是,它處理來自sort和shuffle的中間o/p文件的一個鍵值對。我不知道如何訪問具有排序的&混排鍵值對的中間文件。一旦我無法訪問中間文件,我無法在reducer模塊中編寫代碼來選擇最大的密鑰。我不知道如何編程一次接收一個K,V對的減速器,以便只將最大的鍵及其相應值輸出到最終輸出文件。在reducer功能中選擇max key

想,如果這是從中也經歷了排序和洗牌映射器中間文件..

2是

4本

我想什麼減速器只在最終輸出文件中打印「4這是什麼」。由於減速器內存中沒有整個文件。它不可能在減速器中寫入這個邏輯。我想知道是否有任何的API支持來接從中間文件的最後一行最終將有最大鍵(按鍵會被默認排序)

OR

我一定要改變默認的排序比較器做我想做的事情?

回答

0

一個簡單的解決方案就是讓一個Reducer(所有的鍵值對都去),並讓它跟蹤最大的鍵。

IntWritable currentMax = new IntWritable(-1); 

public void reduce(IntWritable key, Iterable<Text> values, Context context) { 
    if (key.compareTo(currentMax) > 0) { 
    currentMax.set(key.get()); 
    // copy 'values' somewhere 
    } 
} 

public void cleanup(Context context) { 
    Text outputValue = //create output from saved max values; 
    context.emit(currentMax, outputValue); 
} 

額外的優化將是要麼只能從映射器發出同樣的方式最大的關鍵,或使用本減速器實現作爲您的合班。

+0

這是棘手和不使用bigdata的力量。 – Turbero

+0

@ Matt D:謝謝。有效。我是map-reduce編程的新手,並沒有完全意識到安裝和清理功能。 –

-1

如果您只想寫入減速器中最大鍵的值,我建議在配置中保存在您的映射器中檢測到的最大鍵。就像這樣:

Integer currentMax = null; 

public void map(IntWritable key, Text value, Context){ 
    if (currentMax == null){ 
     currentMax = key.intValue(); 
    }else{ 
     currentMax = Math.max(currentMax.intValue(), key.get()); 
    } 
    context.write(key, value); 
} 

protected void cleanup(){ 
    if (currentMax!=null){ 
     context.getConfiguration().set("biggestKey", currentMax.toString()); 
    } 
} 

然後,在你減速機:

int biggestKey = -1; 
protected void setup(Context context){ 
    biggestKey = Integer.parseInt(context.getConfiguration().get("biggestKey")); 
} 

public void reduce(IntWritable key, Iterable<Text> values, Context context) { 
    if (biggestKey == key.get()) { 
    // write or whatever with the values of the biggest key 
    } 
} 

這樣你避免浪費內存和時間複製值。

+2

該配置是HDFS上不可變的XML文件。您無法以這種方式在映射器和縮減器之間共享數據。 –

+0

有點對 - -_- – Turbero

+0

@ Turbero:我不編程我的映射器來檢測我的問題中最大的關鍵。該映射器將會做其他事情。 –

1

您可以設置不同的比較對你的工作排序:

job.setSortComparatorClass(LongWritable.DecreasingComparator.class); 

例如,這將由LongWritable鍵遞減排序。

+0

我可以這樣做,所以到達reducer的中間數據文件將具有文件中出現FIRST的最大關鍵字。在這種情況下,我可以避免減速器。不過,我想知道是否有一種方法,我可以重寫記錄編寫器只從中間文件中獲取第一行(按降序排列),以便我的最終o/p文件將具有最大的鍵和其關聯的值列表。 –

0

感謝Thomas Jungblut更好的方法。

您的驅動程序:

job.setSortComparatorClass(IntWritable.DecreasingComparator.class); 

爲了您的減速機:

boolean biggestKeyDone = false; 

public void reduce(IntWritable key, Iterable<Text> values, Context context) { 
    if (!biggestKeyDone){ 
     // write or whatever with the values of the biggest key 
     biggestKeyDone = true; 
    } 
}