2012-01-26 35 views
1

想象一下,您有一個大文件存儲在包含結構化數據的hdtf中。現在,我們的目標是隻處理文件中的一部分數據,就像文件中第二列值介於兩者之間的所有行一樣。是否有可能啓動MR作業,以便hdfs僅傳輸文件的相關部分,而不是將所有內容都傳輸到映射器。在HDFS文件的一部分上運行MR作業

原因是我想通過僅對需要的部分進行工作來加快工作速度。可能有一種方法是運行MR作業來創建一個新文件,但我想知道是否可以避免這種情況?

請注意,目標是保持數據在HDFS中,我不想讀寫數據庫。

回答

2

HDFS將文件存儲爲塊中的一堆字節,並且沒有索引,因此無法只讀取部分文件(至少在撰寫本文時)。此外,任何給定的映射器可能會得到該文件的第一個塊或第400個,並且您無法控制該文件。

也就是說,MapReduce的重點是將負載分配到多臺機器上。在我們的集羣中,我們一次最多可以運行28個映射器(4個節點上每個節點7個),所以如果我的輸入文件是1TB,則每個映射槽最終可能只會讀取總文件的3%,即大約30GB。您只需在映射器中執行所需的過濾器,並僅處理您感興趣的行。

如果您確實需要過濾訪問,則可能需要考慮將數據存儲在HBase中。它可以作爲MapReduce作業的本地源,提供過濾讀取並將其數據存儲在HDFS上,因此您仍然處於分佈式環境中。

+1

協處理器還可以用於過濾出類似的過濾器的數據。不完全確定協處理器和過濾器之間有什麼區別。我能想到的一件事是,過濾器是在客戶端定義的,而協處理器是在服務器上定義的。所以,協處理器可以在客戶端重用。有一件事要注意,過濾器和協處理器都在服務器上執行並減少了發送給客戶端的數據。 –

+0

好點Praveen。但我的理解是,協處理器是基礎而已,不是純HDFS M/R –

+0

克里斯 - 你的意思是HBase的,而不是基地?什麼阻止協處理器用於MR?我在HBase組織中發佈了一個關於協處理器和過濾器之間差異的查詢,但沒有得到答覆。 –

1

一個答案是看蜂巢解決這個問題的方式。數據在「表格」中,它們實際上只是關於磁盤上的文件的元數據。 Hive允許您設置表格分區的列。這爲每個分區創建一個單獨的文件夾,所以如果你是通過劃分日期的文件,你將有:

/mytable/2011-12-01 
/mytable/2011-12-02 

裏面的日期目錄將是你實際文件。所以,如果你再運行一個查詢,如:在/ MYTABLE/2011-12-01

SELECT * FROM mytable WHERE dt ='2011-12-01' 

只有文件將被送入工作。

最重要的是,如果你想要這樣的功能,你要麼移動到更高級別的語言(蜂巢/豬),要麼你需要推出自己的解決方案。

+0

只是FYI,這種技術被稱爲「分區」。它在相關數據庫中使用了相當長的一段時間。 – Olaf

0

處理成本的很大一部分是數據解析,以便爲映射器生成鍵值。我們在那裏(通常)爲每個值+某個容器創建一個java對象。無論是在CPU和垃圾收集器壓力方面都是昂貴的
我會建議解決方案「在中間」。你可以編寫輸入格式來讀取輸入流並在早期跳過不相關的數據(例如通過查看字符串的第一個字節)。
因此,您將讀取所有數據,但實際解析並將其傳遞給Mapper - 僅其一部分。
我會考慮的另一種方法是使用RCFile格式(或其他列式格式),並注意相關和不相關的數據將位於不同的列中。

0

如果要處理的文件具有關於文件名的某些唯一屬性(如擴展名或部分文件名匹配),還可以使用FileInputFormat的setInputPathFilter方法忽略除MR作業以外的所有文件。 Hadoop默認忽略所有「。xxx「和_xxx」文件/目錄,但可以使用setInputPathFilter進行擴展。

正如其他人上面提到的,你可能會得到次優表現出來集羣做這樣的事情,打破範式「每一個映射塊」的,但有時這是可以接受的。有時需要更多的「不正確」,尤其如果你正在處理的數據量小的&來重新設計和/或時間重新轉儲到HBase的計劃將影響到運行作業的子所需的額外時間最佳。在0.92引入

相關問題