2013-04-29 90 views
0

映射器的分裂的責任我想確認我理解正確EMR。我想知道 - 我所說的是否對EMR/Hadoop有意義?上彈性MapReduce(MYSQL + MongoDB的輸入)

目前,我有我的應用程序,檢查存儲在MySQL和MongoDB中(包括在不同的EC2實例)的數據,因此可以建議內容給用戶一個推薦引擎。這一切都運行良好,但現在,我們處於一個地步,現在它需要更長的時間來執行腳本,而不是它應該運行的時間間隔。這顯然是一個問題。

我考慮移動這個腳本EMR。我明白,我將能夠從我的映射腳本連接的MongoDB和MySQL(即它不需要是S3上的文件)。我想知道的是 - 如果我開始檢查MySQL/S3上的數據 - Hadoop是否有一些方法確保腳本不檢查每個實例上的相同記錄?我甚至能理解Hadoop的概念嗎?對不起,如果這個問題真的是菜鳥。

回答

1

是的,hadoop會確保來自數據庫的輸入記錄被拆分,然後僅傳遞給映射器,即相同的記錄不會被不同的映射器讀取(即使它們在同一個實例上運行)。

一般來說,分割數據的任務是高達選定InputFormat,從here引用:

的InputFormat的另一個重要工作是將輸入數據 源(例如,輸入文件)到片段這構成了 個人地圖任務的輸入。這些片段被稱爲「分割」,並且在InputSplit接口的實例中被封裝。最文件, 例子中,在底層塊的邊界在 HDFS分裂,並且由FileInputSplit類的實例表示。 其他文件可能無法解析,具體取決於應用程序特定的 數據。瓜分其他數據源(例如,來自一個數據庫表) 成分割將在一個不同的,專用 方式執行。在將數據分成輸入分組時,重要的是該過程快速且便宜。數據本身不應該需要 才能執行此過程(因爲它全部由在MapReduce作業開始時的單個 機器完成)。

您可能已經閱讀this,但是這對於hadoop的DBInputFormat是一個不錯的初始資源。

+0

很好的答案,謝謝。你會推薦使用類似Sqoop的東西,還是應該直接從我的PHP腳本連接到數據庫? – noel 2013-05-06 13:48:15

+0

如果您的數據庫的大小足夠大(50GB +),那麼我會建議您使用Sqoop,如果您需要定期在增量數據庫上運行hadoop作業,那麼Sqoop也不錯。即使您的數據庫不夠大,使用Sqoop可以更好地控制更新數據。 – Amar 2013-05-07 03:45:22