2016-01-05 29 views
1

我想我的問題讓每個人都感到困惑。更清晰一點。 我正在嘗試訂購我的數據。 說我的數據(記錄數)是這樣強制Hadoop將地圖任務設置爲1

0 1 2 3 4 
1 3 8 9 2 
2 8 7 9 7 

和我的塊大小爲128 MB和文件大小爲380 MB(3塊) 我想給一個訂單號碼到我的記錄。

1,0 1 2 3 4 
2,1 3 8 9 2 
3,2 8 7 9 7 

爲了給出正確的數字,我需要將數據導入1張地圖,否則,如果我得到3張地圖任務,我的編號不會是正確的。

所以如果我這樣做,我會得到整個數據,因爲它是正確的? 輸入到我的映射器類的數據不會發生變化,它將成爲我的原始數據,不是嗎?

一旦我使用

-D mapreduce.job.maps=1 

沒有設定映射器的1
conf.setInt("mapreduce.job.running.map.limit", 1); 

我的輸出產生3部分-M-000 *文件

我使用Hadoop 2.6。 0-cdh5.4.7 cloudera版本。

我做錯了什麼? 請指教

+0

所以,即使在設置mapreduce.job.maps = 1之後,你還在說3個映射器?這是你的擔心嗎? –

+0

@ManjunathBallur:是的 –

回答

0

如果您想對數據進行排序,那麼重要的是減少是您工作的一部分。 如果你想有n個排序的文件,那麼普通的減少會做,如果你想有一個輸出文件,那麼你需要設置減速器的數量爲1(類似於你爲地圖做的)。

將mappers的數量設置爲1對您試圖實現的目標沒有影響,然後放慢速度!

+0

我的意圖不是對數據進行排序。我需要爲我的數據提供訂單號 –

+0

好的,我明白了。你是否也關閉了減少?想想你需要設置reducer的數量爲0:conf.setNumReduceTasks(0) – oae

+0

是的我的reducer設置爲0. –

0

而不是將映射器的數量設置爲1,通過在映射器端使用輔助排序以不同方式解決問題。

通過對鍵對象的格式進行輕微操作,二級排序使我們能夠在排序階段考慮該值。

看看這個article在java中的工作代碼示例。

看一看這個問題太:hadoop map reduce secondary sorting

如果仍然只需要一個地圖的任務,你PARAMATERS越來越被框架忽略,去非易分裂的hadoop壓縮文件類型,如gzip的(未壓縮數據的大小小於1 GB)

查看此presentation瞭解更多詳情。

說明
+0

但仍然是這樣的情況下整理值正確嗎?我的意圖是我需要在地圖中獲取完整的數據。 –

+0

數據集的大小是多少?使用不可分割的壓縮文件。在這種情況下,只有一個映射器處理數據。 –

+0

大小約爲380 MB –

0

mapreduce.job.mapshere聲明

忽略時mapreduce.jobtracker。地址是「本地」

因此,如果您在本地機器上運行,這可能可以解釋爲什麼您有3個映射器。

即將進行排序,其中應用程序代碼寫入的映射方法適用於單個輸入。所以,如果你想排序發生映射階段變得複雜。另一方面,如果你在減少方面做這種事情,它幾乎是直截了當的。可用於指定的每個作業映射器任務的默認數量的地圖

-Dmapreduce.job.maps=1 

這的

+0

我在集羣下運行它 –

1
  • 號碼。

    但是,當你提交作業時,JobSubmitter覆蓋此參數的基礎上,拆分的數量:

    LOG.debug("Creating splits at " + jtFs.makeQualified(submitJobDir)); 
    int maps = writeSplits(job, submitJobDir); 
    conf.setInt(MRJobConfig.NUM_MAPS, maps); 
    

    在上面的代碼,MRJobConfig.NUM_MAPS是:

    public static final String NUM_MAPS = "mapreduce.job.maps"; 
    

    連帶設置爲分割數,按writeSplits()方法計算。

    因此,您的設置不生效。

  • 映射限制

    conf.setInt("mapreduce.job.running.map.limit", 1); 
    

    此設置只控制同步映射器的最大數量。

+0

還有什麼其他方法可以將映射器設置爲1 –

+0

我會檢查並確認。我需要檢查Hadoop代碼。我會更新答案,一旦我找到東西 –

+0

我不認爲你可以改變它。即使'Job'對象也有'setNumReduceTasks()'方法。但是,它沒有'setNumMapTasks()'方法。 –