2013-06-21 31 views
8

首先,我是新來的Hadoop :)運行在HDFS上的特定文件/塊的map-reduce任務

我有gzip壓縮文件的大型數據集的gzip壓縮文件周圍的大小的文件(TBS每個100-500mb)。

基本上,我需要對我的map-reduce作業進行某種過濾。

我想以各種方式分析這些文件。許多這些工作只需要分析某種格式的文件(包括特定的長度,包含特定的詞等 - 各種任意的(倒置的)索引),並且爲每個作業處理整個數據集需要不合理的時間。所以我想創建指向HDFS中特定塊/文件的索引。

我可以手動生成所需的指標,但如何準確指定(千)特定的文件/塊我要處理的輸入,映射器?我能否在不將源數據讀入例如HBase的?我想要嗎?還是我解決這個問題完全錯了?

+0

所以,如果我理解正確,你正在尋找一種方式來處理輸入路徑只是將文件的一個子集?你如何以編程方式啓動工作? – climbage

+0

如何針對HDFS塊而不是針對不同格式(文件)運行不同的作業使您的任務更快?你能更詳細地闡述你的問題嗎? –

+0

對不起,太模糊了。我還沒有在hadoop堆棧中感到賓至如歸,所以我知道我的術語和思維方式略有偏差。下面的例子可能有助於解釋我想要達到的目標:給定1,000,000個文件和一個索引,告訴我哪些5,000個文件包含* sunshine *這個詞,運行一個map-reduce作業,分析包含* sunshine * 。 – jkgeyti

回答

2

假設你有一些方法,通過它可以知道X檔案的大語料庫文件來處理,你可以配置你的作業時使用org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPathFilter(Job, Class<? extends PathFilter>)方法。

你需要傳遞實現PathFilter一類。 Hadoop將創建這個類的一個新實例,並將通過boolean accept(Path path)方法向每個文件顯示語料庫中的每個文件。然後,您可以使用此選項將文件過濾爲針對實際流程圖任務(無論是基於文件名,大小,上次修改的時間戳等)。

針對特定塊,你需要實現自己的FileInputFormat的擴展,特別是重載getSplits方法。此方法使用listStatus方法確定輸入文件要處理的內容(以及前面提到的PathFilter的調用位置),然後確定如何將這些文件拆分爲拆分文件(如果文件可拆分)。因此,在此getSplits方法中,您將再次需要使用參考數據來定位您感興趣的特定分割。

至於存儲/檢索此目標文件並拆分信息,您有幾個持久存儲選項作爲一個鍵/值存儲(HBase的,當你在你的問題提到的),一個單獨的數據庫(MySQL等),倒排索引(Lucene的)等

1

運行在HDFS特定文件的map-reduce作業是指過濾器根據一些標準輸出文件。 Here是Antoine Amend發佈的好博客,會對您有所幫助。

2

因爲您想要根據文件內容(包含文字foobar)而不是文件元數據(文件名/大小等)過濾輸入,您實際上需要基於我創建的索引類型在Hadoop InputSplit上。見my blog

+0

很酷。自從我問這個問題實際上構建了一個類似的設置。我很高興你已經添加了基準測試,我會嘗試和我的稍微不同的方法進行比較。你有一個粗略的例子來說明你的數據是什麼樣的,所以我可以生成類似基準的東西? – jkgeyti

相關問題