2013-07-17 70 views
0

我們有一個工作可以在一個節點上運行,最多需要40米才能完成,而我們希望將M/R降到2米以下,但我們不確定該流程的哪些部分會進入map()以及reduce()map是否適合調用web服務和轉換xml數據?

當前進程:
對於關鍵字的列表,呼籲每個鍵的網絡服務,並得到XML響應;將xml轉換爲管道分隔格式;輸出在最後一個文件...

def keys = 100..9999 
def output = new StringBuffer() 
keys.each(){ key -> 
    def xmlResponse = callRemoteService(key) 
    def transformed = convertToPipeDelimited(xmlResponse) 
    output.append(transformed) 
} 
file.write(output) 

的Map/Reduce模式
這是我如何與地圖/減少,只是想確保我在正確的道路上仿照它...

Mapper
這些鍵從keys.txt中拉出;我呼籲每個鍵和存儲鍵/ XML對遠程服務......

public static class XMLMapper extends Mapper<Text, Text, Text, Text> { 
     private Text xml = new Text(); 
     public void map(Text key, Text value, Context context){   
      String xmlResponse = callRemoteService(key) 
      xml.set(xmlResponse) 
      context.write(key, xml); 
     } 
    } 

減速
對每個鍵/ XML對,我將XML管道分隔的格式,然後寫出來的結果......

public static class XMLToPipeDelimitedReducer extends Reducer<Text,Text,Text,Text> { 
     private Text result = new Text(); 
     public void reduce(Text key, Iterable<Text> values, Context context) { 
      String xml = values.iterator().next(); 
      String transformed = convertToPipeDelimited(xml); 
      result.set(transformed); 
      context.write(key, result); 
     } 
    } 

問題

  • reduce()中執行 轉換時調用map()中的Web服務是否是一種好的做法; map()做這兩項操作的好處?
  • 我不檢查reduce()中的重複項,因爲keys.txt 不包含重複鍵;那是安全的嗎?
  • 如何控制輸出文件的格式? TextOutputFormat看起來有趣;我希望它這樣寫的...
100|foo bar|$456,098 
101|bar foo|$20,980 
+0

Web服務不是真正的限制因素嗎? – Kayaman

+0

假設只有一個,是的,但它位於多個實例部署在多個節點上的代理之後。 – raffian

回答

1

你應該做的變換地圖邊,一對夫婦的原因:

  • 從XML談到鋪管分隔符將減少序列化並傳輸到reducer中的數據量。
  • 您將運行多個貼圖作業,但是隻能執行一個縮減作業,因此您想要轉換貼圖端以利用該並行性。
  • 由於所有的工作都是基於地圖的,您可以使用提供的IdentityReducer而不必爲此編寫自己的代碼。

如果你想要一個輸出文件,你需要使用一個reducer; map-reduce爲每個reducer生成一個輸出文件。

如果您確定沒有重複的鍵,那麼是的,應該可以安全地忽略重複的reduce-side。

我相信TextOutputFormat將默認將您的(鍵,值)對作爲製表符分隔的字符串寫入文件,因此不是您想要的格式。請參閱here瞭解如何改變這一點。

您的web服務將成爲一個限制因素。假設你希望你的40分鐘的工作在2分鐘內完成,你可能需要40個左右的工作來讀取它。它能處理40個併發讀者嗎?

您的其他限制因素將是減少方面。假設你想要一個按鍵排序的單個輸出文件,你將不得不使用一個reducer,它將不得不對所有輸入進行排序,這可能需要一點點。

一旦你的代碼工作,你將不得不運行一些實驗,看看什麼設置給你一個合理的運行時間。祝你好運。

+0

輸出不需要排序。所以'map()'是並行執行的,但是'reduce()'在這種情況下並不是因爲我需要一個輸出文件?如何配置M/R使用單個減速器? – raffian

+0

通過減速器的輸出始終排序。如果你需要一個輸出文件,你必須設置一個reducer類(甚至是IdentityReducer),它默認爲一個reducer實例。該數字可以在作業配置的驅動程序類中覆蓋。 – DPM

相關問題