使用 Swift語言進行 Hadoop 數據流應用程序開發

本文詳細源代碼請參考 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。

映射器 mapper

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()){}

總結器 reducer

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 上運行程序

和上面的管道操做相似,試驗成功後您能夠嘗試在一個真正的 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

下一步:Perfect Hadoop

Hadoop 是一個大數據生態系統 —— 包括 HDFS 高性能多冗餘文件系統,Map-Reduce 文件處理程序和 YARN 集羣資源管理系統 —— 構成了最基本的大數據系統。

如上所示,在 Hadoop 上編寫流處理程序是一個很簡單的工做,也不須要依賴於特定的軟件體系。可是,除了編寫流處理程序以外,您還可使用 Perfect Hadoop 作更多更強大的事情——任務控制、大文件上下載、集羣節點監控——如今全部這些工做均可以使用Swift 語言實現了!

更多信息

關於本項目更多內容,請參考perfect.org.

長按二維碼關注Perfect 官網
微信號:PerfectlySoft (公司名)

Perfect 官網

若是須要幫助,請註冊咱們在Slack上的中文頻道: http://perfect.ly/

相關文章
相關標籤/搜索