.NET 向け分散プログラミングフレームワーク MBrace 1.0 のリリース

数年の開発越しに、先週 MBrace 1.0 がリリースされた。MBrace は、スケーラブルなクラウドデータ向けに F# と C# でスクリプトとプログラミングが可能なプログラミングモデルだ。プロジェクトは主にコードライブラリとクラウドプロバイダのライン地アイムから形成されている。

主要なコンポーネントは MBrace.Core であり、MBrace プログラミングモデルの核を含むスタンドアロンのクラスライブラリである。コンピュテーション式に基づいた API を提供しており、直接利用することも MBrace.Flowの様なライブラリの作成も可能だ。この例はクラウドワークフローを用いて HTTP でコンテンツを取得する方法を示している。

let urls =  [| ("bing", "http://bing.com") ("google", "http://google.com") /* more urls*/ |]

let download (name: string, uri: string) = 
    cloud {
        let webClient = new WebClient()
        let! text = webClient.AsyncDownloadString(Uri(uri)) |> Cloud.OfAsync
        do! CloudFile.Delete(sprintf "pages/%s.html" name)
        let! file = CloudFile.WriteAllText(path = sprintf "pages/%s.html" name, text = text)
        return file
    }

let filesTask = 
    urls  |> Array.map download  |> Cloud.Parallel |> cluster.CreateProcess

MBrace.Core の上位に構築された MBrace.Flow は、関数型宣言パイプラインを利用する分散ストリームライブラリだ。次の例は、クラウドフローを用いて複数の CSV ファイルの中から重複した文字列の数を数えるものだ。

let numberOfDuplicates =
    CloudFlow.OfCloudFilesByLine ["container/data0.csv" ; "container/data1.csv"]
    |> CloudFlow.map (fun line -> line.Split(','))
    |> CloudFlow.map (fun tokens -> int tokens.[0], Array.map int tokens.[1 ..])
    |> CloudFlow.groupBy (fun (id,_) -> id)
    |> CloudFlow.filter (fun (_,values) -> Seq.length values > 1)
    |> CloudFlow.length
    |> cluster.Run

コードライブラリに加え、他の主要なコンポーネントも MBrace ランタイムに実装されている。Azure は現在唯一サポートされているプロバイダだが、AWS 向けも開発中だ。Azure ランタイム実装は MBrace.Core プログラミングモデルとクラスタ管理のヘルパを完全にサポートしている。以下は Azure 上で 4 つの A3 インスタンスを 作成する方法だ。

let pubSettingsFile = @"... path to your downloaded publication settings file ... "
let config = DeploymentManager.BeginDeploy(pubSettingsFile, Regions.North_Europe, VMSizes.A3, vmCount = 4) 

最初に始めるには二つのスタートキットが有用であり、一つは Azure を利用し、もう一つはシミュレートしたクラスタを利用する。シミュレートしたクラスタは単一の筐体で実行可能であり、分散処理のコードを追加のインフラ無しに開発者のマシンでデバッグ可能となる。

MBrace はオープンソースプロジェクトであり、GitHub 上で利用可能だ。コントリビューションには様々なレベルがあり、ライブラリ向け、クラウドプロバイダのランタイム向け、サンプル・ドキュメント向けがある。