2012-01-12 66 views
0

我有一個系統,我從某個模塊獲取圖像(jpg)。我一次獲得10個對象(單個對象1000張圖像)的圖像(每次總共10000張圖像)。我需要使用Hadoop集羣對這些圖像進行一些處理。將一組圖像作爲輸入映射到mapreduce

我想知道我應該如何去做這件事。就像我應該如何形成輸入。我想在一個映射器或縮減器中完全處理一個對象(及其圖像= 1000)。例如:第一個映射器中的第一個對象,第二個映射器中的第二個對象等。

我想到的一些方法是: 1.對於每個對象創建一個目錄並將其所有圖像放入該目錄。然後tar,壓縮目錄,這將作爲一個輸入到單個映射器。

  1. 做同樣的事情,如上所述,但只是tar文件(不壓縮)。實現InputFormat接口並使「isSplittable()」返回false。

  2. 爲每個對象創建序列文件。 Sequensfile將爲每個對象圖像包含一個鍵值對。在這裏,我不知道如何告訴MapReduce只給一個映射器提供序列文件。

+0

多一個選項是:3.對於每個對象創建sequencefile。 Sequensfile將爲每個對象圖像包含一個鍵值對。在這裏,我不知道如何告訴MapReduce只給一個映射器提供序列文件。 – sunillp 2012-01-12 09:31:08

回答

0

在這裏,我不知道如何告訴MapReduce的給予sequencefile只是一個映射。

FileInputFormat#isSplitable是你的朋友在這裏所有的文件輸入格式。 SequenceFileInputFormat擴展FileInputFormat。

+0

當我的文件大小比如說10MB(小於HDFS塊大小)時,此方法是否可用()可用。即使在這種情況下,我希望每個文件都由一個映射器進行處理,並且不希望映射器處理多個文件(因爲可能有一個文件被拆分,例如:如果SplitSize = HDFS Size = 64MB,則一個映射器可以獲得6個10MB的文件和7個文件的一部分,其他的第7個文件的portin可以轉到另一個映射器)。 Will isSplitable()在這裏有幫助嗎? – sunillp 2012-01-13 14:47:56

+0

不考慮文件/ hdfs大小,每個映射器只會處理來自單個文件的數據,除非[CombineFileInputFormat](http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapreduce/ lib/input/CombineFileInputFormat.html)。建議購買[Hadoop - 權威指南](http://shop.oreilly.com/product/0636920010388.do)一書。 – 2012-01-13 15:00:55

+0

感謝您澄清我的懷疑。我肯定會購買Hadoop的書。還有一個小問題。假設我有一個包含100個文件的目錄來處理每個5MB的文件。我知道只有20個映射器插槽可用(假設我的程序只使用映射器,沒有縮減器)。然後,爲了在20個映射器上安排100個文件,我需要做一些特殊的事情,比如確保5個文件由一個映射器進行處理,或者hadoop MR負責這個調度部分並確保最終使用20個映射器處理所有100個文件。 – sunillp 2012-01-13 15:11:57

-1

IN HADOOP處理圖像使用的MapReduce HIPI:

HIPI是Hadoop的圖像處理接口。這提供了一套工具和Inputformat來處理使用Hadoops分發文件系統(HDFS)和Mapreduce的大量圖像。

STPES參與其中:

在HIPI整個過程可以在被分類至2份。

1)將所有圖像轉換爲大容量文件(HIPI Image Bundle)。

2)使用HIPI的圖像輸入格式處理創建的圖像批量文件。 剔除(卡勒類)是使用過濾掉具有低清晰度的圖像或缺陷

問題同HIPI:

爲了模擬我的散裝圖像處理的情況下,我使用的java程序來創建相同的圖像的多個拷貝在一個目錄中使用不同的名稱。然後通過使用HIPI的實用程序,我將所有圖像轉換爲大容量文件(在HIPI中稱爲HIP文件)。

要檢查所有圖像是否存在於批量文件中,我完成了相反的過程(將HIP文件轉換爲多個圖像)。還有另一個實用工具可以做同樣的事情。但我沒有收回所有圖像,並發現使用HIPI我丟失了一些圖像。

我無法使用HIPI繼續使用我的POC,並想到創建一個使用mapreduce處理批量圖像的新框架。

新的圖像處理框架:

爲了避免產卵多張地圖(每個文件中的每個)我們必須做的像HIPI做,那就是,所有的圖像轉換成一個單一的包文件。

該包文件作爲map-reduce的輸入。圖像輸入格式解析包文件並創建與每個圖像對應的緩衝圖像對象。

影像輸入格式重要的類:

圖像合成:

在到單個包文件結合多個圖像。

ImageInputFormat:

返回ImageRecordRreader和管理分裂

ImageRecordReader: 管理讀取每個分割。 將文件指針的初始搜索執行到每個分割的開始處。 nextKeyValue()方法從分割中讀取每個圖像並轉換爲BufferedImage。 BufferedImageWritable:

由於map reduce的鍵值類應該是可寫的可序列化類型,所以我們無法將BufferedImage直接保留爲map方法中的值。 這是一個只包含BufferedImage的包裝類。

BufferedImageWritable { BufferedImage img;

  @Override 
      public void readFields(DataInput arg0) throws IOException { 
      } 

     @Override 
      public void write(DataOutput arg0) throws IOException { 
      } 

      @Override 
      public int compareTo(byte[] o) { 
       return 0; 
      } 

}

未實現readFiled(),write()方法,因爲在我的情況的compareTo()方法,我不想存儲法師回HDFS。

如果您想要回寫HDFS中的任何圖像(在map或reduce中),您可能必須實現所有這些方法。在write()中,您可能需要編寫邏輯來存儲圖像,就像我們在創建批量文件時用於寫入圖像一樣。 readFiled()應該包含write()的相反邏輯。 compareTo()不需要實現,因爲我們從不將這個圖像保存爲map-reduce中的關鍵字(在map-reduce的排序過程中調用compareTo())。

由於您將圖像作爲BufferedImages(用於圖像處理的常見Java類)獲取圖像,因此很容易在其上執行大部分操作。但是在HIPI的情況下,圖像的值可以像Hipi的FloatImage類一樣在地圖的值中使用,並且您可能會感到操作難度高。

我已經成功地使用這個自定義輸入格式和OpenCV實現了facedetection程序。

,我用於開發相同的代碼將在GitHub

很快共享http://worldofbigdata-inaction.blogspot.in/2017/02/processing-images-in-hadoop-using.html

相關問題