本文章是由機器翻譯。

在 F # MapReduce

剖析記錄檔使用 F #、 MapReduce 和 Windows Azure

Noah 禮物

下載程式碼範例

身為 longtime 的 Python 程式設計人員,我已由面試 Don Syme,架構設計人員的 F # 語言與參加。在面談 Don 提過,"有些人看見 [F #] 做為強型別 Python,一直到語法的差異。這可以擊中我為項目值得進一步調查.

結果,F # 是粗體而令人興奮新程式設計語言仍然是一個許多開發人員的秘訣。F # 中有近年來輕鬆一下 (並列文字) 和 Python 程式設計人員的產能提供相同的優點。像 (並列文字) 和 Python,F # 是具有最小的語法和雅運算式的高階語言。F # 真正唯一在於它與複雜型別推斷系統的最佳意見中的功能性程式設計世界許多結合這些為了顧及現實的功能。這樣便會將 F # 中具有幾個對等電腦的類別。

但新的高生產力程式設計語言今天不只有趣的新技術可供您使用。

廣泛的定域機組平台,例如 Windows Azure 的可用性會讓分散式的儲存和運算資源提供給單一開發人員或企業大小公司。連同定域機組存放區有來自像可讓您快速地撰寫程式碼中,可以快速地分析及排序可能驚人的資料集的水平調整 MapReduce 演算法的有效工具。

工具喜歡這可讓您撰寫幾行程式碼,將它部署到定域機組,和在下午工作操作 gb 的資料。驚人的東西。

在本文中我希望共用一些關於 F #、 Windows Azure 和 MapReduce 我開發。我會一起提取所有意見中,顯示您如何可以使用 F # 與 MapReduce 演算法來剖析 Windows Azure 的記錄檔。首先,我將介紹一些原型技術,以使 MapReduce 程式設計較不複雜。 然後,我將介紹結果 … 來定域機組。

駭客使用 F #

若要使用的工作的新樣式的其中一個。NET 程式設計人員使用 F # 是許多 Perl、 Python 和 (並列文字) 的程式設計師已習慣的互動式工作流程。這種程式設計時常樣式會使用互動式程式碼撰寫環境如 Python 殼層本身或 IPython,提供了 readline 完成等工具。這可讓開發人員從模組匯入類別、 執行個體化,然後使用 tab 鍵自動完成探索方法與在物件上的資料。

應該不陌生的互動式開發常用的方法。NET 開發人員是直接在 Visual Studio 中撰寫程式碼,並傳送到 F # 互動式視窗執行的程式碼片段。程式碼片段會傳送目前選取的文字,或 Alt + SingleQuote 使用 Alt + Enter 按鍵組合為單一行。圖 1 這種技巧的範例顯示作用中。

圖 1使用 F # 互動式視窗

這種方法適合用來方便應急 F # 程式的偵錯,且您正在開發的 F # 指令碼中使用 IntelliSense 及索引標籤完成。

第二種方法是重新撰寫程式碼,在 Visual Studio 中,但再複製一段程式碼從 Visual Studio 和貼上它直接將獨立 F # 互動式主控台 (請參閱 圖 2)。如果您採用這項技術,您必須將兩個分號放在您貼上的程式碼之後,請記得。這可讓您與另一個優點的 tab 鍵自動完成您的程式碼互動。您或許會發現自己使用這項技術,如您習慣在互動性更強的方式中進行程式設計。

圖 2的 F # 互動式主控台

您也可以開發以互動方式使用 F # 藉由直接從 Windows PowerShell 執行您的程式碼 — 也就是說,藉由將指令碼傳遞至 fsi.exe (F # 互動式主控台可執行檔) 本身。這種方法的優點是它可讓您原型快速指令碼,並列印至標準輸出結果。此外,您可以編輯程式碼反覆使用輕量型文字編輯器,例如 [記事本] + +。圖 3 顯示對應減少指令碼的範例] 輸出我將在整篇文章中,會使用從 Windows PowerShell 執行時。

圖 3 執行 Windows PowerShell F # 指令碼

PS C:\Users\Administrator\Desktop> & 'C:\Program Files (x86)\FSharp-2.0.0.0\bin\fsi.exe' mapreduce.fsscript
192.168.1.1, 11
192.168.1.2, 9
192.168.1.3, 8
192.168.1.4, 7
192.168.1.5, 6
192.168.1.6, 5
192.168.1.7, 5

這些不同的方式來撰寫程式碼,所有派上用場中協助您處理複雜的演算法、 網路程式設計和定域機組。您可以撰寫巧妙的原型,並從要查看是否同時提供您所預期的結果更多的命令列加以執行。然後您可以開始建置大型專案在 Visual Studio 中上一步。

使用此背景資訊開,讓我們來深入一些實際的程式碼。

正在剖析的 MapReduce 樣式記錄檔

除了互動式程式設計上述的優點,F # 程式碼還有簡潔有力。在範例 圖 4 少於 50 行程式碼,但它包含所有地圖減少演算法來計算一組記錄檔中的前 10 個 IP 位址的重要部分。

圖 4 MapReduce 演算法剖析記錄檔

open System.IO
open System.Collections.Generic

// Map Phase
let inputFile = @"web.log"
let mapLogFileIpAddr logFile =
  let fileReader logFile = 
    seq { use fileReader = new StreamReader(File.OpenRead(logFile))
      while not fileReader.EndOfStream do
        yield fileReader.ReadLine() }    

  // Takes lines and extracts IP Address Out, 
  // filter invalid lines out first
  let cutIp = 
    let line = fileReader inputFile 
    line
    |> Seq.filter (fun line -> not (line.StartsWith("#")))
    |> Seq.map (fun line -> line.Split [|' '|])
    |> Seq.map (fun line -> line.[8],1)
    |> Seq.toArray
  cutIp

// Reduce Phase
let ipMatches = mapLogFileIpAddr inputFile
let reduceFileIpAddr = 
  Array.fold
    (fun (acc : Map<string, int>) ((ipAddr, num) : string * int) ->
      if Map.containsKey ipAddr acc then
        let ipFreq = acc.[ipAddr]
        Map.add ipAddr (ipFreq + num) acc
      else
        Map.add ipAddr 1 acc)
    Map.empty
    ipMatches

// Display Top 10 Ip Addresses
let topIpAddressOutput reduceOutput = 
  let sortedResults = 
    reduceFileIpAddr
    |> Map.toSeq
    |> Seq.sortBy (fun (ip, ipFreq) -> -ipFreq) 
    |> Seq.take 10
  sortedResults
  |> Seq.iter(fun (ip, ipFreq) ->
    printfn "%s, %d" ip ipFreq);;

reduceFileIpAddr |> topIpAddressOutput

這個獨立版本中,稍後會成為網路版本,可以分成三個主要階段:「 地圖 」 階段、 「 縮小 」 階段和 「 顯示 」 階段。

階段 1 是 「 地圖 」 階段。 函式 mapLogFileIpAddr 會會將記錄檔做為參數。 在這個函式內定義是另一個函式,fileReader,以延遲產生一行文字記錄檔中 (雖然語言如 C# 與 Python 也有這) 會使用功能的程式設計技巧。 接下來,cutIp 函式剖析輸入的每一行,就會捨棄註解行,然後傳回的 IP 位址和一個整數,1。

若要知道這有延遲,反白顯示整個對應的程式碼區塊,在 F # 互動式視窗中,與線條一起執行:

let ipMatches = mapLogFileIpAddr inputFile

您會看到下列輸出:

val ipMatches : seq<string * int>

請注意沒有任何實際已完成,且已經讀取的記錄檔。 唯一從未發生過的是運算式已評估過。 透過這種方式,直到實際需要,而不只是為了的評估運算式的記憶體中提取資料將會延遲執行。 這是功能強大的技術來處理資料,當您擁有驚人剖析十億位元組或兆位元組範圍內的記錄檔就特別明顯。

如果您想要比較的差異和更樂意評估程式碼,然後將只要新增一條線到 cutIp 函式,使它看起來像這樣 (請注意:列 | > Seq.toArray 是完全選擇性的以建構函式。 目的,在本例中,為刻意使我們的函式渴望 — 如果這遺漏了,此函式會直接操作延遲,mapLogFileIpAddr 函式):

let cutIp = 
  let line = fileReader inputFile 
  line
  |> Seq.filter (fun line -> not (line.StartsWith("#")))
  |> Seq.map (fun line -> line.Split [|' '|])
  |> Seq.map (fun line -> line.[8],1)
  |> Seq.toArray
cutIp

如果您重新傳送這段程式碼 F # 直譯器和您指定一個大型的記錄檔,包含數個 gb 的資料,您可能會想要取得一杯咖啡,因為您的電腦將忙碌讀取整個檔案,並產生索引鍵/值對應為其在記憶體中。

資料管線的下一節,我採取對應結果的輸出,摺疊至計算的 IP 位址的幾個項目是在序列中的匿名函式的序列的結果。它會持續新增透過遞迴的對應資料結構。這種程式設計樣式可能很難瞭解新功能性程式設計的開發人員,因此您可能想要內嵌列印陳述式內部的匿名函式來完全作用,請參閱。

在命令式程式設計樣式,您無法藉由更新可變動的字典,其保留每個 IP 位址做為索引鍵,透過 IP 位址系列迴圈再更新每個值的計數來達成相同的效果。

最後一個階段沒有與 MapReduce 演算法,但有用處駭客行為的指令碼中建立原型階段。「 地圖 」 階段的結果會從對應的資料結構管線來 Seq.結果的排序及前 10 個搜尋結果會列印出來。請注意管線樣式這些資料可讓結果的一項作業不著痕跡地流入下一個作業,而不 for 迴圈目視。

MapReduce 加號 Windows Azure

與完成概念證明的指令碼 — 不到 50 行程式碼,請記住,它的時間將這移至項目類似實際執行環境。例如,我會將此範例從桌面移至 Windows Azure。

做為背景,您可能會發現它很有幫助在 Windows Azure F # 範例請查看 code.msdn.microsoft.com/fsharpazure 並安裝 Windows Azure 範本.最重要是 F # 背景工作角色使用 blob 及佇列儲存端點的 webcrawler 範例。這是一個方便的專案,以檢閱進一步探討使用 F # 與 Windows Azure。

我不會進入設定仲裁 MapReduce 陣列太多細節。而是我會討論較高層級。如需詳細資訊,請參閱MSDN雜誌 的處理器變化文章 「 同步處理多個節點在 Windows Azure (msdn.microsoft.com/magazine/gg309174).

有幾種方式可以設定 Windows Azure 上的 MapReduce 伺服器陣列。圖 5 示範使用 F # 背景工作角色,會平均分割對應工作者與降低工作人員之間的其中一個範例。回到指令碼,這是做為複製和貼上的對應函式,來對應工作人員,並減少函式,來降低背景工作幾乎一樣簡單。

圖 5中 Windows Azure 的 MapReduce 伺服器陣列

王 Dean 和 Sanjay Ghemawat MapReduce 簡報會進一步在分散式的演算法和可能的實作的詳細資料的絕佳參考 (labs.google.com/papers/mapreduce-osdi04-slides/).在 圖 5 範例中,不過,它會顯示 F # 背景工作角色將數個記錄檔耗用並聯。它們會傳回其輸出,且其值為 1,透過 Windows Azure AppFabric 服務匯流排減少的工作,或藉由寫入磁碟所組成的 IP 位址索引鍵。

接下來,減少工作者讀取此中繼資料,並寫出 blob 儲存產生合併彙算的算起的機碼值組。每個降低背景工作會產生要被排序,並顯示母片背景工作前組合自己彙總的報表。

背景工作角色建立和發佈

完成後,原型和計劃高階架構下, 一步是在 Visual Studio 2010 中建立必要的專案,並將其發佈到 Windows Azure。

建立了 F # 背景工作角色並不那麼簡單,因為它可能是,因此讓我們逐步解說所需的步驟。首先,您必須下載 Windows Azure F # 範本先前所述。接下來,您必須為 Windows Azure 建立 Visual C# 專案。我叫我 AzureFSharpProject。

接下來,您將必須如所示建立一個 F # 背景工作角色的選項 圖 6

圖 6建立 F # 背景工作角色

此時,您可以將您的對應函式,在您對應背景工作的角色或您縮小函式放置在您降低背景工作的角色。然後建立進一步背景工作角色的其他對應工作人員或減少工作者,取決於您的資料緊縮需求的小數位數。在 Google MapReduce 紙張已用來參照的標準參考 labs.google.com/papers/-mapreduce.html.它會進入進一步對應減少架構、 警告和使用案例相關的詳細資訊。

當您準備好發佈到 Windows Azure 時,您可以按一下滑鼠右鍵在專案中,選取發佈],然後服務套件僅建立,如所示 圖 7

圖 7 發行 Windows Azure

最後,登入新的 Windows Azure 管理入口網站並使用介面來建立您的背景工作角色 (請參閱 圖 8)。

圖 8 設定新的背景工作角色

此時,您可以呼叫您的節點,您會看到大小,與 MapReduce 這種定域機組中的記錄。當然,這項技術無法輕易地套用到資料來源,而非簡單的記錄檔。這個 F # MapReduce 演算法的一般外框,連同我撰寫程式碼所示範的互動式技術 — 可以用於任何剖析、 對應和降低工作。

接下來的步驟

F # 是功能強大的語言,可讓您快速駭客出這兩個 cranking,並累積更複雜的解決方案,從這些駭客解決問題。本文中我用它來縮減成適合大小 morsels 的 MapReduce 演算法。我將示範如何唯一 50 啟用此線條的 F # 無法再轉換成 Windows Azure 為基礎記錄分析器。

有關在 Windows Azure MapReduce 的實作,您可以在主體上看看兩個其他有趣的文件。首先,看看 「 建置可擴充、 Windows Azure 的 Multi-Tenant 應用程式 」 在 MSDN 上的討論區的背景工作角色和 MapReduce (msdn.microsoft.com/library/ff966483).此外,阿爾 g。皓有部落格項目,定域 」 的使用亞馬遜網路書店的 EC2 和 Windows Azure 比較機組運算和實作的 MapReduce,"這是值得讀取 (bit.ly/hBQFSt).

如果您沒有在 F # 觀看過,但我希望這篇文章鼓勵您不妨試試。如果您感興趣聽到所有開啟我在 F # Don Syme 面試,往上簡單距離收音部落格,並為它指定接聽 (bit.ly/eI74iO).

Noah Gift 是在工程的搭檔協理 AT &t 互動.他有 B.S. 從 Cal 例如,Poly San 路易斯 Obispo,M.S.的營養科學課 在電腦的資訊系統中從目的地為美國加州灣大學,洛杉磯,而是在 UC Davis,專精於商業分析、 財務與 Entrepreneurship MBA 候選。

多虧了要對下列技術專家,來檢閱文件: Michael Bakkemo, Don SymeParas Wadehra