2013-07-12 29 views
1

我有幾十個全天空地圖,二進制格式(FITS)每個大約有600MB。在全天空地圖上處理源處理hadoop

對於每張天空地圖,我已經有了幾千個來源的位置目錄,即恆星,星系,無線電源。

對於每個源,我想:

  • 打開整個天空地圖
  • 提取相關的部分,通常是20MB以下
  • 對它們運行的​​一些統計數據
  • 聚集輸出到目錄

我想運行hadoop,可能使用python通過接口streaming進行並行處理。

我覺得輸入到映射器應該是目錄中的每個記錄, 那麼python映射器可以打開全天空圖,做加工和打印輸出到stdout

  1. 這是一個合理的方法嗎?
  2. 如果是這樣,我需要能夠配置hadoop,以便將完整天空圖本地複製到正在處理其來源之一的節點。我怎樣才能做到這一點?
  3. 此外,將輸入數據提供給hadoop的最佳方法是什麼?對於每個源我有一個參考全天空地圖,經度和緯度

回答

2

雖然聽起來不像幾十個天空地圖是一個非常大的數據集,我已經成功地使用Hadoop作爲一種編寫分佈式應用程序/腳本的簡單方法。

對於您所描述的問題,我會嘗試使用Pydoop實施解決方案,具體爲Pydoop Script(完整免責聲明:我是Pydoop開發人員之一)。

您可以設置一個作業,輸入想要處理的天空地圖的部分列表,以某種文本格式序列化,每行一個記錄。每個地圖任務都應該處理其中的一個;您可以使用標準的NLineInputFormat輕鬆實現分割。

只要地圖任務可以訪問存儲該地圖的文件系統,您就不需要將天空地圖本地複製到所有節點。使用pydoop.hdfs模塊,地圖功能可以讀取需要處理的天空地圖部分(給定它作爲輸入接收的座標),然後按照您所說的發出統計數據,以便它們可以彙總在減速器中。 pydoop.hdfs可以從「標準」安裝的文件系統和HDFS中讀取。

雖然問題域是完全無關的,這個應用程序可以作爲一個例子:

https://github.com/ilveroluca/seal/blob/master/seal/dist_bcl2qseq.py#L145 

它採用了同樣的策略,準備「座標」的列表中進行處理,它們序列化到一個文件,然後啓動一個簡單的pydoop作業,將該文件作爲輸入。

希望有幫助!