2013-10-07 53 views
0

我正在處理一個希望在hadoop mapreduce程序中處理圖像(最終部署到亞馬遜的彈性mapreduce)的項目。該過程的輸入將是所有文件的列表,每個文件都附帶一些額外的數據(左下角的緯度/長度位置 - 這些是航空照片)Hadoop:在Python代碼中處理圖像文件

實際處理需要發生在Python代碼,以便我們可以利用Python圖像庫。我可以找到的所有Python流式處理示例都使用stdin和處理文本輸入。我可以通過stdin將圖像數據發送給Python嗎?如果是這樣,怎麼樣?

我用Java編寫了一個Mapper類,它獲取文件列表並將名稱,額外數據和二進制內容保存到序列文件中。我在想,也許我需要編寫一個定製的Java映射器,它接收序列文件並將其傳送給Python。這是正確的方法嗎?如果是這樣,那麼Java應該怎樣把圖像傳出來,並用Python來讀取它們呢?

如果不是很明顯,我對Java或Python並不熟悉,所以它也有可能讓我咬牙切齒,因爲我對這兩種語言都有所介紹......

回答

0

有,我可以看到一些可能的方法:

  1. 同時使用額外的數據和文件內容輸入到你的Python程序。這裏棘手的部分將是編碼。坦率地說,我不知道流媒體如何處理原始二進制內容,我假設基本答案是「不好」。主要問題是進程之間的stdin/stdout通信是基於文本的,依靠用製表符和換行符分隔輸入以及類似的東西。您需要擔心圖像數據的編碼,並可能需要某種預處理步驟或自定義的InputFormat,以便您可以將圖像表示爲文本。
  2. 只使用額外的數據和文件位置作爲python程序的輸入。然後該程序可以獨立讀取文件中的實際圖像數據。這裏的打嗝是確保該文件可用於python腳本。請記住,這是一個分佈式環境,因此這些文件必須位於HDFS或類似的位置,並且我不知道在python中是否有用於從HDFS讀取文件的好庫。
  3. 你自己做java-python交互。編寫一個使用Runtime類的java映射器來啓動python進程本身。通過這種方式,您可以完全控制兩個世界之間的通信方式,但顯然它的代碼更多,涉及更多。