利用 Hadoop 雲技術框架實現通用的並行任務處理功能, 將原本只是單機程序改造成最終運行在 Hadoop 雲平台裡。
優點 :
1. 分布並行運行
基於 MapReduce 及 dfs (分布式文件系統)實現了分布並行運行,可實現一個NoSplitInputFormat 類用於支持單個 Map 任務運行 。
2. 出錯自動重試
Hadoop 框架具備可配置的出錯任務自動重試功能,配置參數為:
mapred.map.max.attempts 。
3. 可保留原始輸入重復運行以用於調試
當嘗試手動再次運行或調試上一個任務時, Hadoop 提供的 IsolationRunner 可實現保留原始輸入本地再次執行的功能。相應配置參數為:
keep.task.files.pattern 。
4. 網頁端運行狀態實時監控,比如可以實時動態顯示處理進度可實現 CustomerProcess 類,通過調用 TaskReporter 的 setProgress 方法實現網頁端進度條控制,可在 Map 任務的 setup 裡啟用一個心跳任務執行CustomerProcess 功能。
5. 方便的網頁端日志查詢
Hadoop 強大的網頁監控功能可提供日志的實時收集。
6. Hadoop 框架其它的優點,如大數據量存儲及處理利用大集群,大存儲實現單機可能沒法完成的任務。
缺點:
1. 只能直接處理來自 dfs 上的文件
由於任務的分布式運行特征,數據只能預先存儲在 dfs 上,當然也可以利用Hadoop 的 fuse-dfs 模塊實現 dfs 上的數據映射到本地文件系統。如調用 Oracle 的sqlldr 工具加載數據時,可采取這種形式,從而避免數據由 dfs 轉移至本地文件系統這一過程。
注:由於 fuse-dfs 自身的的限制,有些任務可能沒法這樣實現,特別是牽涉到寫文件功能時,如解壓縮功能等。
2. 不能直接支持對文件的隨機寫功能
由於某些 dfs 本身的限制無法提供輸出流的隨機寫功能( api 上直接沒有提供seek 功能),對於需要經常改寫較大文件的內容時,這時就沒有比較直接的處理方式了。
注意事項:
1. 要注意利用 Hadoop DistributedCache 技術實現依賴包和配置的分布由於任務的分布運行特性,為了保證產品的易維護性,可以將產品所依賴的 jar包和配置文件分發到 dfs 上。 Hadoop 框架分別提供了:
DistributedCache.addFileToClassPath ,可用於分發 jar 包DistributedCache.addArchiveToClassPath ,可用於分發配置文件。
2. 利用序列化將參數傳入每一個 map 任務,由於 Map 任務是以單獨的進程運行,在傳入參數時應采用 Hadoop 提供的序列化功能實現有可能跨機器不同進程間的參數傳入。 Hadoop 框架分別提供了:
DefaultStringifier.store , 可用於序列化
DefaultStringifier.load , 可用於反序列化
3. 利用持久化將返回參數傳出
在 Map 任務返回參數時也應采用序列化的方式將參數序列化至 dfs 上存儲。
4. 應仔細設計傳入參數
在設計傳入給每一個 Map 任務的參數時應仔細斟酌。比如設計 FTP 下載功能時,應采取如下策略:同時執行多個 Map 任務實現多個文件同時下載,而不是同時執行多個 Hadoop Job ,或是在一個 Map 任務裡多線程運行。具體實現可利用 Hadoop 的 InputFormat.getSplits 自行實現可控的支持並發運行多個 Map 任務的功能 。
5. 開發調試時可以讓 Hadoop 以 Local 方式運行
在做開發調試時,為避免多機器分布運行帶來的調試不便,可通過設置如下參數以支持 Hadoop 任務單機單進程運行:
fs.default.name 為 file:///
mapred.job.tracker 為 local