2013-07-02 25 views
1

HDFS(塊大小爲64MB)中有一個非常大的圖像(〜200MB)。我想知道以下內容:從HDFS中讀取大圖像在mapreduce中

  1. 如何讀取mapReduce作業中的圖像?

  2. 很多主題都提出了WholeInputFormat。有沒有其他的選擇,以及如何做到這一點?

  3. 當使用WholeInputFormat時,是否會有塊的並行處理?我覺得不是。

+0

它是如何存儲在HDFS中的,讀完它後你打算做什麼? – Tariq

+0

看到這些問題:http://stackoverflow.com/questions/10885039/reading-images-from-hdfs-using-mapreduce – Tariq

+0

http://stackoverflow.com/questions/10814534/how-to-read-multiple-image -files-as-input-from-hdfs-in-map-reduce – Tariq

回答

0

如果你的塊大小爲64 MB,最有可能會HDFS圖像文件已拆分成塊,並複製它在集羣,這取決於您的集羣配置是什麼。

假設您想要將圖像文件作爲1條記錄而不是多個塊/行逐行處理,以下是我可以考慮的用於處理整個圖像文件的幾個選項。

  1. 您可以實現自定義輸入格式和記錄閱讀器。輸入格式中的isSplitable()方法應返回false。 RecordReader.next(LongWritable pos,RecType val)方法應讀取整個文件並將val設置爲文件內容。這將確保 整個文件作爲單個記錄進入一個地圖任務。

  2. 您可以對輸入格式進行分類並覆蓋isSplitable()方法,以使其返回false。 This示例顯示如何創建子類
    SequenceFileInputFormat實現NonSplittableSequenceFileInputFormat。

+0

很明顯,圖像被分成幾塊。我的目標是並行處理塊(現在看起來不可能)。 而不是實現一個customInputFormat做一個沒有並行性的MapReduce,我會嘗試一個簡單的java程序。 – blackSmith

+0

如果圖像被分成幾個塊,地圖任務將自動並行運行(每個塊一個地圖任務) – Chaos

+0

是的,你是對的。但是,各個塊是否會包含關於要處理的圖像的一些有意義的信息?我不這麼認爲,因爲subImage無法在映射器中加載(我不確定)。 – blackSmith

0

雖然可以使用WholeFileInputFormat或SequenceFileInputFormat或定製的東西讀取圖像文件,實際的問題(在我看來)是畫出來的東西讀文件。 OK ..你已經閱讀過這個文件,現在怎麼處理你的圖像來檢測你的映射器中的任何對象。我並不是說這是不可能的,但是需要做很多工作。

恕我直言,你最好用類似HIPI的東西。 HIPI提供了一個用於在MapReduce框架之上執行圖像處理任務的API。

編輯:

如果你真的想這樣做,你的方式,那麼你需要編寫一個自定義的InputFormat。由於圖像不像文本文件,您不能使用分隔符如\n進行分割創建。一種可能的解決方法是根據給定的字節數創建分割。例如,如果您的映像文件爲200MB,則可以編寫一個InputFormat,它將創建100MB的分割(或您在作業配置中作爲參數提供的任何內容)。在處理一些二進制文件時,我很久以前就遇到過這樣的情況,而這個project幫了我很多。

HTH

+0

如果我理解正確,HIPI會將小圖像打包成大圖像以執行作業。所以它不處理我的問題。 – blackSmith

+0

嗯,這只是一個建議。你是對的。但這只是給你一些想法。 – Tariq

+0

請看看編輯。 – Tariq

0

我想這取決於你想要執行什麼類型的處理。如果您嘗試執行一些可以完成的任務,首先將大輸入分割爲較小的圖像文件,然後獨立處理塊,最後將輸出部分拼接回大的最終輸出 - 然後就可以了。我不是圖像專家,但假設如果您想將彩色圖像製作成灰度圖,那麼您可能會將大圖像裁剪成小圖像。然後使用MR並行轉換它們。一旦映射器完成後,將它們重新拼接成一個大的灰度圖像。

如果您瞭解圖像的格式,那麼您可以編寫自己的記錄讀取器,以幫助框架了解記錄邊界,防止在輸入映射器時發生腐敗。

+0

是的,這是最可能的解決方案。但是,這樣一個recordReader並不容易實現。與文本文件不同,圖像以順序方式不是很有意義。爲了將其分成更小的部分,必須通過原件進行幾次通過(=部件數量)。 – blackSmith

+1

不能使用javax.imageio(java的圖像處理API)來分割和連接圖像嗎?有一個叫做Graphics2D的類,值得研究。 –