2012-10-03 46 views
-1

有人在大數據上提交作業時遇到任何問題。數據大約爲5-10 TB未壓縮,大約在500K文件中。當我們嘗試提交一個簡單的java map reduce作業時,它大部分時間花在getsplits()函數調用上。並需要多個小時才能出現在工作追蹤器中。有沒有可能的解決方案來解決這個問題?Hadoop - 在大數據上提交作業的時間

回答

0

它很大程度上取決於您的提交服務器(或您的筆記本電腦客戶端)的「強大」,也許您需要升級RAM和CPU以使getSplits調用速度更快。

我相信你會遇到交換問題,並且計算時間會比平常長多倍。

1

帶有500k個文件,您正花費大量時間樹步行來查找所有這些文件,然後需要將其分配給InputSplits列表(getSplits的結果)。

正如Thomas在他的回答中指出的那樣,如果執行作業提交的機器的JVM的內存分配量較低,那麼您將發現JVM執行垃圾回收的問題以嘗試查找內存需要建立這些500K文件的分割。

更糟糕的是,如果這些500K文件是可拆分的,並且大於單個塊大小,那麼您將得到更多的輸入拆分來處理文件(大小爲1GB的文件,塊大小爲256MB,假設輸入格式和文件壓縮支持分割文件,默認情況下會獲得4個地圖任務來處理該文件)。如果這適用於您的工作(查看您的工作產生的地圖任務數量,是否有超過500k?),那麼您可以通過修改mapred.min.split.size配置屬性的大小來強制創建較少的映射器:塊大小(前面的例子設置爲1GB意味着你將得到一個映射器來處理文件,而不是4)。這將有助於getSplits方法的性能,getSplits的結果列表將更小,需要更少的內存。

問題的第二個症狀是將輸入拆分序列化到文件(客戶端),然後在作業追蹤器結束時的反序列化時間所需的時間。 500K +拆分需要時間,如果JVM內存限制較低,jobtracker將具有類似的GC問題。

相關問題