本文詳細源代碼請參考 Github Perfect Examplesgit
該項目展現瞭如何使用 Swift 語言開發 Hadoop 流處理應用程序。github
該軟件使用SPM進行編譯和測試,本軟件也是Perfect項目的一部分。本軟件包可獨立使用,所以使用時能夠脫離PerfectLib等其餘組件。swift
請確保您已經安裝並激活了最新版本的 Swift 3.0 tool chain 工具鏈。服務器
咱們目前正在過渡到使用JIRA來處理全部源代碼資源合併申請、修復漏洞以及其它有關問題。所以,GitHub 的「issues」問題報告功能已經被禁用了。微信
若是您發現了問題,或者但願爲改進本文提供意見和建議,請在這裏指出.app
在您開始以前,請參閱目前待解決的問題清單.工具
本項目包括兩類 Hadoop 流處理應用程序:映射器 mapper 和 總結器 reducer。這兩類程序都是標準的控制檯終端程序,即從標準輸入讀數據readLine()
後推送到標準輸出print()
。oop
映射器的範例程序 mapper 是未來自標準輸入的文本拆分爲一個一個的英語單詞,而後採用下列格式進行打印(假設輸入內容是Hello, world! hello!
):性能
hello 1 world 1 hello 1
而總結器 reducer 的目標是將這些輸入進行統計,最後造成單詞統計表:測試
hello 2 world 1
兩個程序的結合使用便可提供單詞統計的功能。
Hadoop 的 Map Reduce 正是爲上述任務在大數據環境下而設計的,這裏的大數據指的是單個文件輸入達到 GB 甚至 TB。
import CoreFoundation // 處理每一行文本 public func lineMain() -> Bool { // 從輸入中讀取一行;若是爲nil則表示輸入已經關閉了 guard let line = readLine() else { return false } // 簡單處理一下文字,取小寫並過濾符號 let filter = line.lowercased().characters.filter{ $0 >= "a" && $0 <= "z" || $0 == " " } // 而後再把單詞輸出,並增長一個「1」 filter.split(separator: " ").forEach { raw in let word = String(raw) print("\(word)\t1") } return true } // 從輸入流中讀取全部文本行 while(lineMain()){}
import CoreFoundation // 單詞表 var dic: [String: Int] = [:] // 行處理器 public func lineMain() -> Bool { // 從標準輸入讀取一行數據 guard let line = readLine() else { return false } // 拆分紅單詞及其統計數量 let e = line.characters.split(separator: "\t") if e.count < 2 { return true }//end if // 保存到單詞表 let key = String(e[0]) let value = Int(String(e[1])) ?? 0 let count = dic[key] ?? 0 dic[key] = count + value return true } // 處理全部行 while(lineMain()){} // 打印結果 dic.keys.sorted().forEach { key in let value = dic[key] ?? 0 print("\(key)\t\(value)") }
因爲採用標準流程序開發,所以編譯這些應用不須要任何其餘依存關係。您只需打開一個終端窗口並運行swift build
命令便可:
$ cd mapper $ swift build $ cd ../reducer $ swift build
在部署到Hadoop 集羣以前,您能夠嘗試在普通的命令行環境下進行測試(testdata.txt 文件是一個常規的文本文件,採用ASCII或UTF-8編碼便可)。本工程目錄下包括了能夠用於測試的數據文件和腳本。
$ cat testdata.txt | ./mapper/.build/release/mapper | sort | ./reducer/.build/release/reducer
和上面的管道操做相似,試驗成功後您能夠嘗試在一個真正的 Hadoop 集羣上跑一下新編寫的程序了:
$ mapred streaming -input /user/rockywei/input -output /user/rockywei/output -mapper /usr/local/bin/mapper -reducer /usr/local/bin/reducer
若是任務成功,您能夠用下列命令在集羣上查看輸出:
$ hadoop fs -cat /user/rockywei/output/part-00000
上述映射-總結程序的細節解釋參考以下:
mapred streaming
: 向 Hadoop 集羣申請一個新的應用程序任務,採用流處理模式(即純文本)。
-input /user/rockywei/input
: 在HADOOP HDFS文件系統上的 輸入文件夾。典型狀況是您須要向Hadoop 管理員幫助您用hadoop fs -mkdir
命令行創建文件,而後再經過命令將待處理數據上傳到該文件夾:hadoop fs -put [cluster folder] /local/pathto/data.txt
。
-output /user/rockywei/output
: 在HADOOP HDFS文件系統上的 輸出文件夾。特別注意最後一個子目錄/output不該該建立,也就是說,只要您有/user/rockywei就好,mapreduce 會自動建立這個輸出文件夾。
-mapper /usr/local/bin/mapper
: 咱們剛編譯好的映射器,您能夠採用下列命令安裝到服務器本地文件夾: swift build; sudo mv ./.build/release/mapper /usr/local/bin
。
-reducer /usr/local/bin/reducer
: 咱們剛編譯好的總結器,您能夠採用下列命令安裝到服務器本地文件夾swift build; sudo mv ./.build/release/reducer /usr/local/bin
。
Hadoop 是一個大數據生態系統 —— 包括 HDFS 高性能多冗餘文件系統,Map-Reduce 文件處理程序和 YARN 集羣資源管理系統 —— 構成了最基本的大數據系統。
如上所示,在 Hadoop 上編寫流處理程序是一個很簡單的工做,也不須要依賴於特定的軟件體系。可是,除了編寫流處理程序以外,您還可使用 Perfect Hadoop 作更多更強大的事情——任務控制、大文件上下載、集羣節點監控——如今全部這些工做均可以使用Swift 語言實現了!
關於本項目更多內容,請參考perfect.org.
長按二維碼關注Perfect 官網
微信號:PerfectlySoft (公司名)
若是須要幫助,請註冊咱們在Slack上的中文頻道: http://perfect.ly/