本文章是由機器翻譯。

大資料

MapReduce 沒有 Hadoop 使用ASP.NET管道

Doug Duerner

素妍昌旺

下載代碼示例(VB)

你曾經想要將 MapReduce 的權力過大的資料添加到您的智慧手機應用程式或您的平板電腦或其他小型設備,豐富的資料分析,但認為這將是太難了嗎?

你是否想過要變換成一個分散式的系統現有的單節點應用程式快速而輕鬆地,而無需重新構建整個應用程式呢?

這些問題都是什麼促使我們必須著手創建非常容易設置和使用 rest 風格的 MapReduce 元件一次歷險。

像 Hadoop 產品擅長大資料的挑戰。我們創建了一個不惜犧牲一些功能的簡單性和靈活性,以使它更易於開發大資料的應用程式的解決方案。這種方式,你不需要成為一名專家,得到了工作制度和運行在短時間內。簡單性與複雜性,建立了 Hadoop 和我們的解決方案與"elephantness"的 Hadoop 集群的敏捷性網格使它令人信服的命題。

簡而言之,我們創建了一個非常簡單的基礎結構,可以使用 MapReduce,或者做計算密集型加工的"網狀"的節點上,或者,做的資料收集在這些節點上被關聯和聚合到一個最終的結果返回到用戶端的結果。

背景

IIS Web 服務器 (與它ASP.NET管道) 已被證明是高度可擴展的企業級 Web 服務器。但這些技術並不局限于簡單地服務 Web 頁面和宿主的 Web 網站。真的是沒有技術的原因,您不能使用他們作為一種通用管道機制通過 HTTP 訪問。在順序 (不移到下一步直到完成上一步),但每一步中執行的步驟的ASP.NET管道可以並存執行非同步。IIS Web 服務器可以配置為運行多個ASP.NET管線 (多個 w3wp.exes) 為 HTTP 要求提供服務。

使用ASP.NET管道作為一種通用管道 (,只是碰巧通過 HTTP 訪問),相反的服務 Web 頁面和宿主的 Web 網站,可能看起來有點不合乎正統,但ASP.NET管道 (與非同步流水線步驟) 實際上相當類似于 CPU 指令流水線微處理器 (bit.ly/1DifFvO),並有多個 w3wp.exe 檔 (與每個 w3wp.exeASP.NET管道) 的能力是非常類似于超標量微處理器設計 (bit.ly/1zMr6KD)。這些相似之處,以及經驗證的可擴充性,是什麼讓使用 IIS Web 服務器和ASP.NET管道需要流水線功能的任何令人信服的命題。

有很多的產品,已經做了 rest 風格的 MapReduce (Hadoop、 Infinispan、 Riak,CouchDB,MongoDB 和更多),但我們的研究表明,他們是很難成立或需要專門的知識。

我們想要簡單地使用我們現有的 Windows IIS 伺服器那些已經啟動並運行 ; 使用我們現有的資料 API 方法,已被寫入 ; 資料獲取我們的 UI 螢幕上的需求 ; 和有整個分散式 MapReduce 系統啟動和運行在分鐘 (所有分散式的系統或 MapReduce 系統設計和體系結構的知識有限)。這種方式,您可以快速而輕鬆地轉換到大型分散式系統與最小的努力或知識,現有的小型應用程式在您自己的伺服器上或在雲上。或者,如果您想要向您現有的智慧手機應用程式中添加豐富的資料分析,你可以毫不費力地這樣做。

這寧靜的 MapReduce 元件是螺栓的不需要現有的應用程式重寫,且它是主要的候選人,當你的目標是,只是將基本的分散式的功能添加到現有的應用程式,已有廣泛的公共資料 API。如中所示,這是能夠快速、 輕鬆地模仿分散式運算模式,如"散播-聚集," 圖 1

 類比分散式運算的模式,如"散播-聚集"
圖 1 類比分散式運算的模式,如"散播-聚集"

本文附帶的示例專案提供簡單基本的基礎設施,演示了這一設計理念,可以擴大前進的起點。這種設計的令人信服的因素不是它優於其他產品,但很容易。它今天是簡單地用的大型企業 MapReduce 系統很容易使用的設計替代。設計也絕不是成熟企業 MapReduce 產品代替像 Hadoop,和我們並不暗示它都不能包含主導產品的所有功能。

MapReduce

簡單來說,MapReduce 是一種聚合大型資料存儲區的方式。Map 步驟執行許多分散式的處理伺服器節點上。它通常每個資料節點,從中檢索資料並 (可選) 可以變換或預先處理資料,而它則仍在分散式的伺服器節點的分散式的伺服器節點上執行一項任務。Reduce 步驟在一個或多個最終處理伺服器節點上執行,並整合從地圖走進一個最終的結果集使用許多不同的組合演算法的所有結果。

在業務物件的 API 中,Map 步驟執行業務物件 API 方法來獲取資料,和 Reduce 步驟結合所有地圖一步結果集到一個最後的結果集 (例如做聯盟通過主鍵或像一筆由集團聚合) 返回到發出請求的用戶端。

MapReduce 的關鍵好處之一就是它讓你"放大"而不是"放大"。換句話說,你只需保持添加更多正常的伺服器節點而不是購買更好的硬體,為要擴展的一個主伺服器節點。外擴通常是更便宜、 更靈活的選擇,因為它使用一般商品硬體,而向上擴展是通常更加昂貴的因為硬體的成本往往成倍增加,它變得越來越複雜。

作為一個有趣的邊注,MapReduce 擅長當它來到極大量的資料 (互聯網規模),並且資料部分結構化或非結構化,如日誌檔和二進位的 blob。與此相反的是,SQL 關係資料庫 excel 時你有歸一化處理結構化的資料與架構,至少一定限額時的關聯式資料庫的開銷是不能處理大量的資料。

圖 2 顯示 MapReduce 過程的高級別概述和比較簡單的 SQL 關係資料庫查詢,與中大資料 MapReduce 過程的相應查詢。

簡單的 SQL 關係資料庫查詢相同的查詢與 MapReduce 與
圖 2 簡單的 SQL 關係資料庫查詢相同的查詢與 MapReduce 與

休息

具象狀態傳輸 (REST) 定義了一個公共的 API,通過使用創建的 HTTP 運行,閱讀、 更新、 刪除 (CRUD) 范式,分別根據 HTTP 動詞郵政、 得到、 放和刪除,以向發出請求的用戶端從伺服器返回的物件表示形式。其餘部分旨在允許公共訪問物件本身作為一個實體,不只是功能性的物件上的操作。這不是一個規範或 RFC ; 它是簡單地設計建議。你可以密切堅持純的 REST 設計和需要 URL 被格式化物件視為一個實體,像這樣:

http://server/MapReducePortal/BookSales/Book A

或者你可以選擇更多的 RPC 樣式設計,要求要使用的類和方法的名稱來執行,如下所示將其格式化的 URL:

http://server/MapReducePortal/BookSales/GetTotalBookSalesByBookName/Book A
http://server/MapReducePortal/BookSales/GetTotalBookSalesByBookName?bookName=Book A

Rest 風格的 MapReduce

Rest 風格的 MapReduce 意味著操作 MapReduce 通過 HTTP API 和分散式的伺服器節點之間的傳輸機制。

休息通過 HTTP 的 API 和運輸有使其具吸引力的幾個優點:

  • 通過埠 80 的 HTTP 協定是防火牆友好。
  • 從幾乎任何平臺的用戶端應用程式可以很容易消耗資源而無需依賴特定于平臺的。
  • (獲取、 郵政、 放置、 刪除) 的 HTTP 謂詞被請求資源的一種簡單、 優雅的范式。
  • Gzip 壓縮可以説明減少有效載荷的大小。
  • HTTP 協定本身具備的額外優勢,例如內置快取記憶體。

當前,樣例專案使用其餘部分通過 HTTP 的 API 和運輸和支援只有 Get 和 Post,沒有寫操作,並且完全為 json 格式進行通信。它類似于一些知名的方法用於訪問 Hadoop 分散式檔案系統 (HDFS) 外部 (比如 Hadoop 紗和 Hadoop WebHDFS),但支援只有持有絕對最低必要的系統操作。我們並不是功能的要替換 Hadoop,或匹配所有其豐富。我們只試圖提供極其簡陋,很容易使用的替代方法,以功能為代價。

MapReduce 配置

對於樣例專案中,只需將 MapReduceModule.dll 複製到您想要使用在你的地圖中的分散式的伺服器節點作為每個 IIS 伺服器節點上的虛擬目錄的 \bin 目錄­Reduce 系統,並提出的 web.config 檔中,模組部分中的條目就像這樣:

<modules>
  <add name="MapReduceModule" type="MapReduce.MapReduceModule" />
</modules>

你就完了。它是那麼簡單。

如果沒有虛擬目錄在 IIS 伺服器節點上有,\bin 目錄中創建一個新的虛擬目錄,使它的應用程式並確保它使用 Microsoft.NET 框架 4 應用程式池。增加 w3wp.exe 輔助進程指望服務要提供更多的 MapReducePortal 虛擬目錄的應用程式池處理管線 MapReduce 的請求。用於優化 IIS 伺服器的其他高級的配置選項通常已經設置由 IT 部門管理伺服器和是超出範圍的這篇文章,但實際情況並非如此,他們是否在 Microsoft Web 網站上的現成。

其他配置

對於樣例專案中,只需將 PathInfoAttribute 放在任何你現有的業務物件資料 API 方法並指定將用來把 URL 對應到的方法和方法參數的 PathInfo 字串。這是它。

示例代碼的很酷的功能之一是現有的業務物件資料 API 方法目前正在返回任何資料類型可以保持不變,不需要更改。基礎設施可以自動處理幾乎任何類型,因為它使用.NET DynamicObject 動態表示返回的資料類型。例如,如果現有的方法返回的客戶物件的集合,然後 DynamicObject 表示客戶的資料類型。

PathInfoAttribute PathInfo 字串使用相同的.NET UriTemplate 類 Windows 通信基礎 (WCF) 使用,並允許您做都一樣喜歡把事情你可以做在一個 WCF Web HTTP 其餘專案或ASP.NETWeb API 2 專案如參數變數的名稱替換萬用字元,等等。您選擇的 URL 對應到哪些方法。你擁有全部控制權,可以自由地執行你的 REST API 你喜歡的任何方式。可以更接近堅持純的 REST API,並使你代表你像一流的實體的物件的 URL 段:

http://server/MapReducePortal/BookSales/Book A
[PathInfoAttribute(PathInfo="/BookSales/{bookName}", ReturnItemType="Book")]
public BookSales GetTotalBookSalesByBookName(string bookName)
{
}

或者,如果您願意,你可以鬆散遵循休息,讓你指定的類名稱和方法名稱,你想要執行 URL 段中的 URL 段:

http://server/MapReducePortal/BookSales/GetTotalBookSalesByBookName/Book A
[PathInfoAttribute(PathInfo="/BookSales/GetTotalBookSalesByBookName/{bookName}",
  ReturnItemType="Book")]
public BookSales GetTotalBookSalesByBookName(string bookName)
{
}

它是完全由你決定。

令人信服的因素

樣例專案設計的令人信服的關鍵要素之一是通過使用ASP.NET管道作為 MapReduce 管道執行 MapReduce 過程獲得的可伸縮性。因為ASP.NET管道操作順序,很適合執行地圖,減少步驟。很酷的是,雖然管道是連續的並且不會移動到下一步直到完成上一步,每一步仍然可以非同步執行。這將允許管道繼續接收和新 MapReduce 要求管道時甚至過程阻止映射調用從其他分散式的伺服器節點返回等待。

作為圖 3所示,每個 w3wp.exe 的房子作為 MapReduce 管道的一個ASP.NET管道。W3wp.exe (IIS 工作進程) 由分配給映射的應用程式池­ReducePortal 虛擬目錄。預設情況下,應用程式池有一個 w3wp.exe 處理新傳入的請求到虛擬目錄中,但很容易可以配置為擁有盡可能多的 w3wp.exes,如你所願。這讓您擁有多個 MapReduce 管道在所有分組到單個獨立伺服器節點上處理傳入的 MapReduce 請求到 MapReducePortal 虛擬目錄。單個ASP.NET管道的非同步特性允許許多請求被並行處理。能力,有多個 w3wp.exes 促進多個ASP.NET管線將您帶到一個新的水準。

提高 IIS 工作進程計數為應用程式池有更多 MapReduce 管道維修 MapReduce 要求傳送到此 IIS 伺服器的 MapReducePortal 虛擬目錄
圖 3.提高 IIS 工作進程計數為應用程式池有更多 MapReduce 管道維修 MapReduce 要求傳送到此 IIS 伺服器的 MapReducePortal 虛擬目錄

示例專案的設計還可以不斷添加多個 IIS 伺服器像你自己那樣形成越來越大"網"的伺服器節點,如中所示圖 4。越大的網的增長,可以把它分解成小片小片亟待解決和更大的水準才能有潛在的並行處理的可能是更大問題。非同步ASP.NET管道,結合每個伺服器,多個管線跨單個伺服器的 CPU 內核啟用並行性。網格伺服器跨許多伺服器機提供了另一級別的並行性。要將更多的 IIS 伺服器添加到網格 ; 是小菜一碟 你要做的就是將 MapReduceModule.dll 複製到虛擬目錄下的 \bin 資料夾並向 web.config 檔添加一個條目。因為 IIS 伺服器是所有簡單的獨立伺服器,沒有額外的配置是必要的。產品像 Hadoop,相比之下,一般都要求更多的精力、 規劃和專門知識因為通常必須將伺服器配置成實際的伺服器"群集"。

任何伺服器節點可以啟動 MapReduce 的請求,以及任意數量的 AJAX URL 中列出其他分散式的伺服器節點可以並存執行該請求的地圖一步部分
圖 4 任何伺服器節點可以啟動 MapReduce 的請求,以及任意數量的 AJAX URL 中列出其他分散式的伺服器節點可以並存執行該請求的地圖一步部分

你甚至不需要特製的 IIS 伺服器。只是通過將 MapReduceModule.dll 複製到已在伺服器的任何虛擬目錄,您可以簡單地使用任何可用的 IIS 伺服器。這是所有需要。下一次的 AJAX 調用現在可以在 URL 查詢字串的 distributednodes 清單參數中包括新的 IIS 伺服器。

伺服器網格設計的另一個好處是它不依靠主節點的功能。產品好比 Hadoop,主節點的伺服器叢集跨管理伺服器群集和資料的位置。它是主人一直是失敗的來源,當 Hadoop 縮放到其生產,而不是資料或基礎設施的數量限制的節點。

在此伺服器中網設計,沒有主節點。任何伺服器節點可以發起的 MapReduce 的請求,並靠收集它的節點的資料。作為圖 4 所示,任何伺服器節點可以同時並行的資料要求者和提供者資料。一個伺服器可以從伺服器網正在執行 Map 函數,並且可以接收結果,任何其他節點請求資料,把它們合併成一個最終的結果集在 Reduce 步驟。同時,該相同的伺服器節點也作為邊緣伺服器節點處理地圖邁出的一步,返回起源于另一個伺服器節點,將會減少回在該節點上的 MapReduce 請求其部分結果。

目前,正在請求的用戶端標識 (通過 distributednodes 清單中的 URL 查詢字串) 資料的位置。相反,您可以修改設計,以在每個節點上的資料庫表中存儲此清單 (或只是此節點的最近鄰居節點或承載資料拆分為多個節點的節點) 和以程式設計方式在運行時添加它們到的 URL。在某種意義上,這樣做會使單個主機節點概念入分散式主節點的概念,每個節點在哪裡知道從哪裡獲取其資料。它會好像主節點分佈在網格,使其與網格擴展。

因為這種網格設計使用一系列的嘗試和真實 Microsoft 產品 — — Windows 伺服器、 IIS Web 服務器和SQL Server的資料庫 — — 你得到的魯棒性冗余和故障容錯功能 (如網路負載平衡 [NLB] Windows 伺服器上的 IIS,AlwaysOn 可用性組與頁面的自動修復或與SQL Server的自動頁修復鏡像) 已經內置到這些商業的產品。這些功能的詳細資訊都是現成的 Microsoft Web 網站上。

樣例專案設計還允許多個 MapReduce 請求被"栓"在一起到表單的工作流開始輸入到一個 MapReduce 請求在哪裡從以前的 MapReduce 請求結果。這被通過改變 MapReduce 請求到一個工作崗位,而不是 Get 和 Post 請求的正文中包括以前的 MapReduce 請求結果。圖 5 顯示了示例生成的輸出測試頁中。

顯示輸出產生的連結在一張測試頁
圖 5 顯示輸出產生的連結在一張測試頁

示例專案概述

從本質上說,MapReduceModule.dllASP.NET管道變成 MapReduce 管道。它使用 HTTP 模組所實現地圖,減少功能。作為一個有趣的邊注,一些在 Reduce 步驟期間執行組合操作 (如聯盟) 依靠 IEqualityComparer < T >,其中 T 是 DynamicObject,在某種意義上,允許你做相等比較基於屬性的名稱作為字串值在運行時,即使 IEqualityComparer < T > 需要在編譯時定義具體類型。酷斃了 !

圖 6 是一個設計的 MapReduce 的高級別概述­Module.dll,當它穿過 MapReduceModule.dll 顯示的處理流程。 MapReduceModule 是唯一的 dll 所需,和它需要在你想要參與 MapReduce 基礎結構的每個伺服器節點上。添加 MapReduce­Module.dll 到伺服器是小菜一碟,通過簡單地將 MapReduceModule.dll 複製到虛擬目錄下的 \bin 資料夾中,將一個條目添加到 web.config 檔來完成。

MapReduceModule.dll 流圖 6 高級設計概述
處理 MapReduceModule.dll 流圖 6 高級設計概述

圖 6,IHttpModule 使用的第一步中ASP.NET管道的地圖功能通過在ASP.NET管道開始請求處理步驟中觸發的 AddOnBeginRequestProcessingAsync 事件訂閱。通過訂閱期間ASP.NET管道的請求處理結束步觸發的 AddOnEndRequestProcessingAsync 事件說,最後一步,為減少功能在ASP.NET管道中使用 IHttpModule。

簡而言之,你只能訂閱開始請求處理和結束請求處理ASP.NET管道中的事件。他們按循序執行,並不將移動到下一步直到上一步已經完成。

在開始請求處理步驟中,IHttpModule 將啟動地圖的所有請求,通過查詢本地節點和通過向每個分散式的伺服器節點存在於 distributednodes 清單參數在 URL 查詢字串中發送 HTTP Web 請求。發送到每個分散式的伺服器節點使用相同的 URL,發起這項請求,但沒有它的 URL 中的 distributednodes 參數的 HTTP Web 請求。

出接收地圖請求的分散式的伺服器節點上相同的兩個ASP.NET管道步驟按循序執行,但因為其 URL 中沒有 distributednodes 參數,開始請求處理和結束請求處理步驟本質上查詢只該節點。指定與 PathInfoAttribute 的地圖資料檢索方法出邊緣分散式的伺服器節點上執行以獲得從該節點的本地資料。從每個邊緣分散式的伺服器節點到啟動原始請求的伺服器節點在回應流中返回的資料然後存儲在 HttpCoNtext 使用 URL 作為鍵,所以它可以檢索稍後期間減少的最後一步。

在啟動原始請求的本機伺服器節點,指定與 PathInfoAttribute 的地圖資料檢索方法執行才能啟動原始請求的本機伺服器節點上的本地資料。從本機伺服器節點資料隨後被存儲在 HttpCoNtext 使用 URL 作為鍵,所以它可以檢索在減少的最後一步。

在結束請求處理步驟中,IHttpModule 執行 REDUCE 步驟中的所有資料和 URL 查詢字串中提供減少參數 HttpCoNtext (其中可以包含預定義的選項,如,sum = 和聯盟 =,排序 =,或自訂函數選擇喜歡減少 = CustomReduceFunction)。接下來,它合併/減少了所有資料集從所有節點到一個最終的結果,使用指定的減少參數設置­彼得。最後,它將最終結果集中到 JSON 序列化並返回該結果集回應流到發出原始的 AJAX MapReduce 請求的用戶端。如果未不指定任何減少參數,則返回從所有節點的所有原始資料。圖 7 顯示了示例生成的輸出測試頁中。

在一張測試頁的輸出結果
圖 7 在一張測試頁的輸出結果

比較使用 Hadoop 的樣例專案

圖 8 比較基本的 MapReduce 功能在 Hadoop 和樣例專案。

圖 8 的基本 MapReduce 功能比較

Hadoop 示例專案
JAVA統計字數的工作函數映射 任何用 PathInfoAttribute 修飾的方法就像地圖作業功能
JAVA減少總結字數統計的工作職能 減少在 URL 查詢字串參數 (如 sum =) 就像減少作業功能,並總結手術
可寫的介面 (序列化) [Serializable()] 屬性 (序列化)
WritableComparable 介面 (排序)

IComparer < T > 介面 (排序)

IEqualityComparer < T > 介面 (sum,聯盟)

地圖作業的輸入是一套的 < 關鍵字,值 > 對和減少作業輸出是一整套的 < 關鍵字,值 > 對 方法使用 PathInfoAttribute 標記的參數輸入到地圖的工作,又像減少參數的 URL 查詢字串做減少操作和序列化 JSON 像減少作業輸出結果

MapReduce 擅長的一個常見場景在數數以百萬計的檔在某個特定的單詞出現的次數。圖 9 顯示的一些基本的偽代碼實現大資料比較等效的著名的"Hello World"示常式序 — —"字數統計樣本"。該圖顯示 HadoopJAVA代碼執行和相應的 C# 代碼,可以用來完成相應的示例專案中。請牢記,此代碼是只是偽代碼,絕不是正確或完整。它已證明只是為了說明可能的方式來完成類似的功能,兩種設計。圖 10 顯示得到的輸出測試頁中。

圖 9"字數統計樣本"偽代碼比較

Hadoop 地圖

public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output,
  Reporter reporter) throws IOException {
  String line = value.toString();
  StringTokenizer tokenizer = new StringTokenizer(line);
  while (tokenizer.hasMoreTokens()) {
    word.set(tokenizer.nextToken());
    output.collect(word, one);
  }
}

Hadoop 減少

public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable>
  output, Reporter reporter) throws IOException {
  int sum = 0;
  while(values.hasNext()) {
    sum += values.next().get();
  }
  output.collect(key, new IntWritable(sum));
}

示例專案地圖

http://server/.../WordCount/Test.txt?distributednodes=Node1,Node2,Node3&union=Word&sum=Count
[PathInfoAttribute(PathInfo="/WordCount/{fileName}", ReturnItemType="Row")]
public HashSet<Row> GetWordCount(string fileName)
{
  HashSet<Row> rows = new HashSet<Row>();
  byte[] bytes = File.ReadAllBytes(fileName);
  string text = Encoding.ASCII.GetString(bytes);
  string[] words = text.Split(new char[ ]{ ' ', '\r', '\n' });
  foreach(string word in words)
  {
    dynamic row = new Row();
    row["Word"] = word;
    row["Count"] = 1;
  }
  return rows;
}

示例專案減少

http://server/.../WordCount/Test.txt?distributednodes=Node1,Node2,Node3&union=Word&sum=Count

在一張測試頁的輸出結果
圖 10 在一張測試頁的輸出結果

圖 11 演示如何完成基本 MapReduce 功能示例專案中的。請注意如何在 URL 中的實體物件映射到相應的地圖階躍函數的 PathInfoAttribute,與及如何減少參數選擇的 URL 查詢字串,如,sum = 和減少 =,等同于 Hadoop 等效的 REDUCE 步驟功能。

圖 11 基本 MapReduce 功能示例專案中

(就像 Hadoop 地圖)                   (像 Hadoop 減少)

http://server/.../BookSales?distributednodes=Node1,Node2,Node3&union=BookName&sum=Sales
[PathInfoAttribute(PathInfo="/BookSales", ReturnItemType="Book")]
public BookSales GetTotalBookSales()
{
}

(就像 Hadoop 地圖)                   (像 Hadoop 減少)

http://server/.../Alarms?distributednodes=Node1,Node2,Node3&reduce=UnionIfNotDeleted
[PathInfoAttribute(PathInfo="/Alarms", ReturnItemType="Alarm")]
public Alarms GetAlarms()
{
}
private static HashSet<Alarm> UnionIfNotDeleted(HashSet<Alarm> originalData,
  HashSet<Alarm> newData)
{
}

其他示例

圖 12 顯示額外的方式來完成地圖­減式功能以及如何寧靜的 URL 對應到方法。為簡潔起見,省略了該方法的實現代碼。可以在許多不同的方式,從實現的代碼:一種演算法,統計字數 ; BookSales 表的每一本書在資料庫中的資料將存儲在連鎖店的書 ; 對業務物件資料 API 方法返回的集合,這些業務物件類 ; 來自全國各地的分散式位置的感應器資料。它是一切都取決於你的想像力 — — 玩得開心 !

圖 12 雜項的方式來完成 MapReduce 與樣例專案

示例

http://server/.../BookSales/Book A?distributednodes=Node1,Node2,Node3&union=BookName&sum=Sales
[PathInfoAttribute(PathInfo="/BookSales/{bookName}", ReturnItemType="Book")]
public BookSales GetTotalBookSales(string bookName)
{
}

示例

http://server/.../Alarms?distributednodes=Node1,Node2,Node3&union=AlarmID
[PathInfoAttribute(PathInfo="/Alarms", ReturnItemType="Alarm")]
public Alarms GetAlarms()
{
}

示例

http://server/.../Alarms?distributednodes=Node1,Node2,Node3&reduce=UnionIfNotDeleted
[PathInfoAttribute(PathInfo="/Alarms", ReturnItemType="Alarm")]
public Alarms GetAlarms()
{
}
private static HashSet<Alarm> UnionIfNotDeleted(HashSet<Alarm> originalData,
  HashSet<Alarm> newData)
{
}

示例

http://server/.../SensorMeasurements/2?distributednodes=Node1,Node2,Node3&union=SensorID
[PathInfoAttribute(PathInfo="/SensorMeasurements/{sensorID}",
  ReturnItemType="SensorMeasurement")]
public SensorMeasurements GetSensorMeasurements(int sensorID)
{
}

示例

http://server/.../MP3Songs?distributednodes=Node1,Node2,Node3&union=SongTitle
[PathInfoAttribute(PathInfo="/MP3Songs", ReturnItemType=" MP3Song")]
public MP3Songs GetMP3Songs()
{
}

總結

在這篇文章中我們提出了一個簡單和基本的基礎設施為地圖­減少功能,可以通過 HTTP 訪問基於 rest 風格,並且在小型設備 (如智慧手機或平板電腦上使用。我們還談到轉變一個單一節點應用程式分為基本的分散式系統。

有很多廣泛的 MapReduce 基礎設施,做幾乎所有的陽光下,但本文的重點與目標是做一個基本的 MapReduce 機制,是極容易設置,和使用簡便。

簡單的設置和擴大我們的解決方案使你能夠測試 (在幾個筆記本電腦) 上你的想法小和容易放大大一旦你的想法已經被證明 (在多個伺服器,你需要。)

示例專案允許您通過簡單地將屬性應用到的 URL 路徑映射到該方法的方法在 Map 步驟使用您現有的業務物件資料 API 方法。它還允許您通過將簡單的命令添加到 URL 的查詢字串,如基於主鍵的資料 (如聯盟) 結合操作控制 Reduce 步驟。

通過將該屬性應用於資料 API 方法中現有的業務物件並指定 URL 中的主鍵欄位基於聯盟的命令,你得到了一種簡單的機制,可以變換成很小的努力,基本的分散式系統的單個節點應用部分提供在一個地方有一個集中的全球視圖的整個分散式系統的能力。例如,業務資料物件通常只檢索單個節點上的專案現在可以檢索合併的多個節點上的專案基於主鍵欄位在該專案中。當地辦事處的資料就可以被相關或聚合需求和在總部的一屏中查看。

對於小型設備,"繁重"發生在網格中的 IIS 伺服器上,而不是小的設備。因此,例如,一個智慧手機應用程式可以享受 MapReduce 范式製作一個簡單的 HTTP 調用,使用最小的手機資源。


Doug Duerner 是高級軟體工程師,擁有超過 15 年,設計和執行與 Microsoft 技術的大型系統。他工作了幾個財富 》 500 銀行業金融機構和商務軟體公司,設計和建造由國防部的國防資訊系統局 (DISA) 用於其"全球資訊柵格"和美國國務院 (DoS) 的大規模分散式的網路管理系統。他是一個怪胎在心,把重點放在所有的方面,但享有的最複雜和最具挑戰性的技術障礙,尤其是那些人人都說"不能做。"也可以撥打 Duerner coding.innovation@gmail.com

素妍昌旺 是高級軟體工程師,擁有超過 15 年,設計和執行與 Microsoft 技術的大型系統。他,也曾為銀行業金融機構的財富 》 500 和商務軟體公司,設計和建造由國防部的國防資訊系統局 (DISA) 用於其"全球資訊柵格"和美國國務院 (DoS) 的大規模分散式的網路管理系統。他還設計和實現了一個大型的驅動程式認證系統,為世界上最大的晶片製造商之一。王擁有電腦科學碩士學位。他晚飯吃複雜的問題,可以達成 yeon_wang@yahoo.com

感謝以下的微軟技術專家對本文的審閱:米凱爾 Sitruk 和Mark利
米凱爾 Sitruk 是一名高級軟體工程師具有 17 年以上的設計與實現大型系統具有廣泛的技術。事先的微軟,他為電信軟體商領航工作和執行幾個新穎的產品。他是熱衷於分散式的系統,大資料和機器學習。他工作了幾年的 Hadoop 生態系統與無 Sql 技術,如卡珊多拉和 HBase。 米凱爾可以達成 Mikael.Sitruk@outlook.com 

Mark斯塔維利是 Azure 的大計算團隊高級程式師。之前搬到 Azure,Mark是微軟研究院 (負責監督他們的大資料管理和處理常式) 的一部分,以前也是 Xbox 一個編譯器和代碼創工作團隊對遊戲引擎性能和相容性) 的一部分。Mark擁有平衡計分卡從皇后大學、 懷卡托大學的電腦科學博士學位的 MSc / 紀念大學計算化學。 之前微軟,Mark是兩個加拿大的最大的高性能電腦中心的研究員。