2013-05-03 61 views
0

hadoop和mapreduce的新用戶,我想創建一個mapreduce作業來對圖像執行一些度量。這就是爲什麼我想知道我是否可以將圖像作爲輸入映射到mapreduce?如果是的話?任何種類的例子使用圖像創建mapreduce作業作爲輸入

感謝

回答

0

號。你不能直接,因爲它使用特定類型的網絡優化序列化的數據類型傳遞一個圖像到MapReduce工作。我不是一個圖像處理專家,但我會建議看看HIPI框架。它允許以方便的方式在MapReduce框架之上進行圖像處理。

或者,如果你真的想這樣做,本機Hadoop的方式,你可以首先將圖像文件轉換爲Hadoop Sequence file,然後使用SequenceFileInputFormat處理文件做到這一點。

+0

任何如何將圖像轉換成hadoop sequene文件的例子? – devosJava 2013-05-03 23:38:39

+0

只是幾分鐘,我寫了一個小代碼來做到這一點,因爲我沒有意識到任何這樣的鏈接。我很快就會貼上你的。 – Tariq 2013-05-04 00:16:13

+0

http://pastebin.com/RWttXN62 – Tariq 2013-05-04 01:07:50

0

是的,你完全可以做到這一點。

由於提供的信息有限,我只能給你一個非常一般的答案。無論哪種方式,你需要: 1)您將需要編寫一個自定義的InputFormat,而不是在HDFS位置(如TextInputFormat和SequenceFileInputFormat做)中的文件塊,它實際上傳遞給每個地圖任務圖像的HDFS路徑名稱。從中讀取圖像不會太難。如果你打算在圖像的框架中傳遞一個Reduce階段,你將需要: 2)你需要創建一個「ImageWritable」類來實現Writable(或者WritableComparable,重新鍵入圖像)。在你的write()方法中,你需要將你的圖像序列化爲一個字節數組。當你這樣做時,我要做的是首先向輸出寫入一個int/long,它是你要寫入數組的大小。最後,你需要將數組寫爲字節。在您的read()方法中,您將首先讀取一個int/long(它將描述圖像的有效載荷),創建一個此大小的字節數組,然後將字節完全讀入您的字節數組中到你捕獲的int/long的長度。

我不完全確定你在做什麼,但這就是我如何去做。

+0

我正在尋找與C++不工作,因爲我想使用opencv來計算臉部特徵 – devosJava 2013-05-04 00:07:36

+0

@Mike:說明用戶是Hadoop的新手,編寫自定義InputFormat並不容易。這就是爲什麼我提到Seq文件的原因。即使InputFormat對於他來說是可用的,如果他必須明確地讀取文件,他將如何處理路徑? – Tariq 2013-05-04 00:15:23