2015-12-29 70 views
1

我正在研究MapReduce程序,我需要將實體插入到數據庫中。由於某些性能問題,將實體插入數據庫應該在組合器中完成。我的程序沒有減速器,所以只有映射器和組合器。由於Hadoop引擎可能不會執行組合器(組合器是可選的),我如何執行它來運行組合器?如何執行一個mapreduce程序來執行組合器?

+0

答案應該是顯而易見的:在減速器中執行(添加一個)。 –

+0

我不想在Reducer中執行這個操作的原因是我不希望我的應用程序經歷洗牌/排序的昂貴階段。 –

回答

2

MapReduce框架沒有提供強制執行組合器的支持方式。組合器可以被稱爲0,1或多次。該框架可以自由地對此做出自己的決定。

當前實現決定在映射任務執行期間基於溢出發生的磁盤運行組合器。 mapred-default.xml的Apache Hadoop文檔記錄了幾個可能影響溢出活動的配置屬性。

<property> 
    <name>mapreduce.map.sort.spill.percent</name> 
    <value>0.80</value> 
    <description>The soft limit in the serialization buffer. Once reached, a 
    thread will begin to spill the contents to disk in the background. Note that 
    collection will not block if this threshold is exceeded while a spill is 
    already in progress, so spills may be larger than this threshold when it is 
    set to less than .5</description> 
</property> 

<property> 
    <name>mapreduce.task.io.sort.factor</name> 
    <value>10</value> 
    <description>The number of streams to merge at once while sorting 
    files. This determines the number of open file handles.</description> 
</property> 

<property> 
    <name>mapreduce.task.io.sort.mb</name> 
    <value>100</value> 
    <description>The total amount of buffer memory to use while sorting 
    files, in megabytes. By default, gives each merge stream 1MB, which 
    should minimize seeks.</description> 
</property> 

此外,還有一個未記錄的配置屬性,mapreduce.map.combine.minspills,它定義在運行組合器之前所需溢出的最小數目。如果未指定,則默認值爲3

有人可能會調整這些配置屬性,恰好設置觸發足夠溢出的條件超過mapreduce.map.combine.minspills,因此保證至少有一次對組合器的調用。不過,我不能推薦,因爲它會非常脆弱。邏輯對外部因素非常敏感,例如輸入數據的大小。另外,它將依賴當前MapReduce代碼庫的具體實現細節。內部算法可能會發生變化,這些變化可能會破壞您的假設。實際上沒有用於強制組合器運行的公開API。

此外,請記住,與縮減器不同,組合器可能無法獲取與特定鍵相關的所有值的完整圖片。如果多個地圖任務使用相同的密鑰處理記錄,則減速機是唯一可以保證將所有這些值組合在一起的地方。即使在單個地圖任務中,組合器也可以使用從處理的輸入分割中拉出的不同密鑰值的子集執行多次。

有關將數據從Hadoop導出到關係數據庫的問題的更標準解決方案,請考慮DBOutputFormatSqoop