2010-12-03 14 views
1

即使經過一些Google搜索,我還沒有找到答案。我的輸入文件是由一個進程產生的,當文件觸及1GB時,它會將它們分塊。現在,如果我要運行一個mapreduce作業,該作業在dfs中處理輸入目錄,那麼在hadoop作業運行的同時,如何確保此作業選取添加到同一輸入目錄的文件?我有一種感覺這幾乎是不可能的,因爲當一個hadoop作業運行時,它會計算剩餘時間和所有這些東西,所以當我的輸入持續堆積或其他條件是「可變的」時,Hadoop不會「不知道如何管理它 - 這是我的猜測。我想知道你對此的看法,以及最佳替代方法!感謝你的幫助。Apache Hadoop:它可以做「時變」輸入嗎?

回答

1

從架構上講,Hadoop可以處理這個問題,但是您需要構建一些前端(或者與幾個開放源代碼一起工作)並允許Hadoop完成其工作。

與任何良好的系統一樣,Hadoop不能也不應該做所有事情,但您有一些選擇可供探索。

如果你花費一點時間和開發一些帶有數據庫(或隊列)的腳本,你可以相當快地解決這個問題(假設你可以用Ruby或Python編寫某些東西,偶爾也可以調用一個bash腳本)這非常簡單,即使你使用Java,複雜性也不過是將bash腳本與Ruby或Python的外層混合在一起)。

第1步:文件滾動(基於您的參數[1GB或任何]到目錄/持有和插入的文件被「滾動」插入到表(或隊列)...如果你不能插入當滾動然後你可以掃描目錄(通過cron),並將文件移動到一個新的目錄,並插入到db有名稱和位置。

第2步:cron(無論你想要的時間框架,說每小時一次)另一個腳本去數據庫(或隊列),並得到所有你想要的MapReduce文件。

步驟3:在步驟2的腳本中創建一個循環的文件,你找到並在多個線程(或if你更好地使用Ruby來分叉)並推送這些文件進入Hadoop。我說push是因爲這個方法可能是一個簡單的「hadoop df -put」(你可以使用從ruby或python腳本調用的bash腳本)......或者一些定製的jar文件加載器,這取決於你需要什麼......你可能需要另一個表格來保存這些文件與某些工作有關,但我會將這些文件留給您。

第4步:運行作業(從第三個腳本使您的表具有事件的一些概念,或者在您將文件推送到Hadoop之後作爲最後一行),然後讓您的輸出執行您想要的操作。

開源選項

您可以使用Oozie的http://yahoo.github.com/oozie/releases/2.2.1/這是Hadoop的開放式工作流程解決方案通過雅虎來源,你可能會發現一些使用過,但一切都取決於你將得到多少走出努力的你放進去。對於你正在做的事情來說,聽起來像是在一組自定義腳本中的一些努力是自動化你的工作流程的方式......但是看看Oozie。

Hadoop的另一個工作流是阿茲卡班http://sna-projects.com/azkaban/

最後,您可以考慮使用流媒體架構將您的文件移動到HDFS ......現在,天有3種方法(卡夫卡是新的,剛剛發佈了幾個天回更queing其核心架構後面比其他兩個)

1)水槽https://github.com/cloudera/flume/wiki

2)抄寫HDFS http://hadoopblog.blogspot.com/2009/06/hdfs-scribe-integration.html

3)卡夫卡http://sna-projects.com/kafka/

3

您正在描述Hadoop沒有設計用於處理的用例。 Hadoop掃描輸入目錄並在運行map/reduce函數之前確定分割。因此,如果在確定分割之後添加了更多數據,那麼您運氣不佳。

看來你需要一個更實時的處理系統。 Hadoop是爲面向批處理的流程而設計的。我不確定你的數據處理要求是什麼,所以很難推薦一個解決方案。也許微量批處理和更頻繁地使用少量數據運行Hadoop作業可能會有所幫助?

+0

行..你的答案似乎非常有效。但是,您是否認爲微量批處理和更經常地使用少量數據運行Hadoop作業是解決此問題的好方法?這聽起來像對我來說是一個駭人的... – Jay 2010-12-03 20:30:08

+0

如果你想堅持使用Hadoop,那麼恕我直言微配料是一個完美的方法。如果您的需求的延遲仍然很高,那麼除了Hadoop上的批處理作業外,您可能還需要其他工具 – bajafresh4life 2010-12-06 16:08:39