當今各地的分佈式系統圍繞著我們。他們最突出的例子是互聯網託管萬維網。企業計算系統中的計算環境通常也被分發,將不同的服務與資產管理系統的不同服務相互連接。許多應用程序甚至託管在雲中。最後,當今的大規模工程和科學計算在很大程度上依賴群集,以便將其工作量平行。這些主題在我的分佈式計算講座中進行了討論。在此存儲庫中,您可以找到我在課程中使用的實踐示例。
插座
在c
在爪哇
HTML,CSS和JavaScript
Java Servlets
可部署的示例
HTTP代理servlet
Javaserver頁面
可部署的示例
獨立的JSP
Java RMI
XML
XML文檔和相關標準的示例
使用Java進行XML處理的示例
Web服務
JSON RPC
消息傳遞接口
hadoop
上述每個鏈接都會將您帶到一個子目錄中,其中包含一組示例。每個子目錄都有一個自己的README.md文件,並具有詳細的描述。
由於我在幻燈片中也使用了相同的代碼,因此有一些特殊的註釋,例如//(*@serverBox{2)}@*)在我的代碼中格式化...您可以安全地忽略它們 ^_ ^
本課程的概念是我們想了解網絡和分佈式企業應用程序環境的工作方式。我們希望通過開始探索如何以最低的抽象級別(通常)為套接字API來探索網絡通過網絡進行通信。從那裡開始,我們將逐步上升到更高級別的抽像水平,即,彼此之間更簡單,更強大的API堆疊(最終以插座為基礎)。這樣,我們將有一個可靠的了解分佈式應用程序和網絡工作的理解。我們將能夠查看一個網站,並立即對它的工作原理有一定的了解,直到堅果和螺栓。對於我們探索的每個抽象級別,我們始終學習示例技術。
如上所述,我們從最底端開始:當今分佈式系統中的通信通常基於UDP或TCP。這兩個協議均通過套接字API訪問,我們在C和Java中均提供示例。作為這些示例的一部分,我們還展示瞭如何在Java中編碼文本以及如何構建可以並行處理多個請求的服務器。因此,插座是分佈式應用程序的基礎,這是程序員可能必須使用的最低級別。
現在,我們能夠理解幾乎任何當前計算機網絡和Internet的基本通信過程。我們將使用此理解來調查組織或企業如何通過網站向外界展示自己。我們想了解構建可以與用戶動態交互的網站所需的技術。
萬維網基於三個支柱:HTTP,HTML/CSS/JavaScript和URL。 HTTP是超文本傳輸協議,是一種基於文本的協議,用於查詢資源,通常通過TCP連接傳輸。實際上,我們已經提供了使用套接字(甚至是小型並行Web服務器)的HTTP通信的服務器(Web服務器)和客戶端(Web瀏覽器)客戶端的示例實現。然後,我們為HTML,CSS和JavaScript提供了一些基本示例。
基於插座的HTTP實現非常複雜。插座允許我們訪問TCP。我們想擁有的是訪問HTTP的類似優雅的API(下一個更高的抽象級別)。這樣的技術是Java Servlet。 servlet用於實現HTTP對話的服務器端。 servlet是特殊Java類的子類,它實現了用於不同HTTP相互作用的處理程序方法(“ HTTP方法”)。這些方法由Servlet容器(服務器的實際實現)調用。因此,我們可以完全專注於應用程序邏輯,而不必擔心協議交互本身。我們為Java Servlet提供了廣泛的示例,包括可部署的示例以及獨立的HTTP代理Servlet。因此,使用Java Servlet,我們可以構建可以與HTTP客戶端(例如Web瀏覽器)動態交互的服務器組件。這意味著當瀏覽器請求它們時,我們可以動態生成網頁的內容。但是,構建完整的動態網站是因為Java Servlet再次非常麻煩,因為Servlet是Java類,而網頁是HTML,然後我們將以字符串常數的形式寫入以寫入Servlet的輸出。
下一個較高級別的抽像是Javaserver頁面(JSP),它使我們能夠編寫HTML頁面(或其他文本格式),並在其中包含Java源代碼。然後由servlet容器再次提供頁面。每當將頁面發送到客戶端時,隨附的Java代碼首先在服務器端執行(並且可能會生成其他輸出)。經過仔細檢查,我們可以發現JSP實際上是“特殊”的servlet:首次訪問JSP時,Servlet容器會動態創建相應的Java Servlet的源代碼。該servlet被編譯,加載,然後執行以創建要發送給客戶端的頁面的動態內容。 JSP中“文本”的所有內容都變成了Servlet內部的字符串,並寫入Servlet的HTTP響應中。 JSP中“代碼”的所有內容都直接複製到Servlet的處理程序方法中。 JSP是動態生成文本(HTML)並將其提供給客戶端的更自然的方法。到目前為止,我們有著深刻的了解,如何通過使用Web表單通過使用其瀏覽器來與Web應用程序進行交互,以及我們如何實現會話。
儘管這些技術使我們能夠構建公司的“外部”視圖,但公司在網絡中展示自己的方式,但我們現在探討了分佈式企業計算環境的“內部”視圖。在這裡,目標是建立一個環境,在這種環境中,可以以不同部門(金融部門,人力資源,資產管理等)的應用程序以一種可擴展的,可擴展的方式相互聯繫。
通往企業計算的道路的第一步是遠程過程調用(RPC),我們以Java Remote方法調用(RMI)的示例進行了探索。我們的示例顯示瞭如何從另一台計算機上運行的另一個程序訪問一個應用程序的對象。這使我們已經接近實現網絡上互連的分佈式應用程序。但是,Java RMI仍然是一種特定於Java的技術,其協議是二進制的。我們希望通過使用非常清晰,明確且易於理解的協議以獨立於平台的方式來實現分佈式應用程序。
Our pursuit of such a technology forces us to first take the de-tour of learning about the Extensible Markup Language (XML. XML is a self-documenting format for storing complex data structures in text. It is similar to HTML, but without any pre-defined semantic or presentation. These can be specified for each application. We both look at examples for XML documents and related standards themselves as well as examples for XML processing with Java.
然後,我們討論Web服務。 Web服務是許多分佈式企業計算系統和麵向服務的體系結構的基本基礎。它們通常使用基於XML的SOAP協議通常通過HTTP調用。他們的界面和提供的功能通過Web服務描述語言(WSDL)描述,這是另一個XML標準。根據我們已經知道的內容,我們現在可以通過HTTP-POST將XML數據發送到Java Servlet,使用這些Java XML處理技術解析此數據,使用相同的技術來生成輸出XML文檔,然後將其發送回Java Servlet的響應。實際上,我們甚至可以將Javaserver頁面用於此目的。但是,再次有一種簡單的方法:我們可以以簡單的Java對象構建服務並將其發佈到Apache Axis2/Java服務器。該服務器將使它們通過SOAP訪問,並自動生成WSDL描述。然後,這些可以用於使用EG,Maven生成客戶端的代理對象。我們在幾個示例中調查了這項技術。
JSON RPC是另一種遠程過程調用(RPC)方法(在此處指定),其中交換數據結構在JavaScript對象符號(JSON)中編碼。數據是通過HTTP或TCP交換的。 JSON RCP類似於Web服務,但設計為更輕巧。我們再次討論了幾個例子。
作為用於分佈式計算的最後一個重要用例,我們考慮如何實現大規模分佈式計算。在許多情況下,需要進行此類計算,從工程中的模擬到企業的數據挖掘和處理。
現在,我們專注於如何將大量集群的計算能力用於大規模的科學和工程計算。這樣的大計算或模擬通常被分為幾個較小的子問題。然後,這些較小的問題通過並聯多個線程或過程合作解決。這通常涉及在與密切相關的子問題上工作的過程之間的常規時間間隔交換消息。顯然,Web服務,Java Servlet,甚至僅僅是Java和HTTP協議,都是錯誤的技術:對於大規模計算,我們希望盡可能高效地提高高效。這尤其涉及溝通,這是非常昂貴的,並且是我們可以通過分配實現的加速的限制因素。我們希望有效地交換原始數據類型,並希望使用HTTP/TCP不支持的通信範例,例如廣播,多播和異步通信。為此,消息傳遞接口(MPI)的實現將是選擇的方法。我們根據C編程語言的幾個示例探索這項技術。
在最後一步中,我們討論了一項技術,該技術結合了創建大規模分佈式計算(來自MPI世界)的能力,以及Java生態系統的豐富工具支持:MapReduce和Apache Hadoop。 MPI是首選技術,如果溝通昂貴,並且我們的應用程序的瓶頸,則需要在求解相關的子問題的過程之間進行頻繁的溝通,可用的硬件是同質的,需要在組或拓撲結構中組織過程,以有效地使用集體溝通來實現高性能的高性能,並且需要進行高度較小的數據,並且在計算過程中需要進行大量的數據。異構分佈式應用環境。另一方面,Hadoop涵蓋了溝通不是瓶頸的用例,因為計算比溝通時間更長(想想機器學習),當環境是異質的過程時,不需要以特殊的方式組織過程,並且可以將任務分為副本,而可以通過將輸入數據切成典型的數據,而在且屬於同等的零件中,可以有效地完成份量的份量,並將其分配給屬於份量的份量,而這些零件的份量是綜藝的,並且可以將其分成屬於大小的份量,並且可以將其分成屬於份量的份量,並且可以將其分成屬於同等的雜物(屬於且屬於同等的雜物)(潛在的巨大(消除了MPI式通信的優勢),或者數據來自何處,並且必須將結果推回環境中的其他應用程序,例如HTTP/Java Servlet/Web服務堆棧。我們的Hadoop示例集中在MapReduce模式上(這與MPI中的分散/收集/減少相似,僅用於上述情況)。
總而言之,本課程將使您對分佈式計算不同領域的主要技術(從公司內部分佈式應用程序系統到分佈式工程和科學計算)的不同領域中的主要技術。每個字段都通過動手示例探索,您可以測試和播放幾種示例技術。
對於每個示例,我明確列出了所需的軟件,並討論如何獲得和安裝。在這裡,我概述了這些軟件組件。
我提供的大多數示例都是用Java編程語言編寫的,鑑於安裝了Java,可以在任意系統下運行。為了編譯它們,您需要安裝Java JDK。我的示例需要Java 7或更高版本。
在Windows下,您需要從Oracle網站下載並安裝Java。
在Linux下,您將執行sudo apt-get install openjdk-7-jdk (您可以在其中替換7個以後的版本,例如8 ,如果願意的話)
我的幾個Java示例是用Maven構建的。所有這些示例在其根文件夾中都有一個pom.xml文件。為了構建它們,您需要安裝Maven。
在Windows下,您需要從Apache網站下載並安裝Maven。
在Linux下,您將進行sudo apt-get install maven 。
如果您使用的是Eclipse(請參見下文),則無需安裝Maven,因為它已經集成到Eclipse中。
我建議Eclipse作為此存儲庫中所有Java示例的開發人員環境。每個Java示例實際上都帶有Eclipse .project文件和Eclipse .settings 。 Eclipse都整合了Maven和Git。這意味著您可以從Eclipse內部克隆該存儲庫,並在此過程中直接導入Jave項目。如果您右鍵單擊Maven Projects並選擇Maven > Update Project... ,Eclipse還將下載並使用Maven pom.xml為您指定的所有必需的庫和依賴項。
您可以從Eclipse網站下載Eclipse。我建議至少使用Eclipse Mars.1來獲得其出色的女性和GIT支持。
要運行一些Java Servlet和Javaserver頁面示例,您需要從相應的下載網站下載Glassfish服務器。我建議至少使用玻璃魚4.1.2。
對於運行Web服務示例,您需要從相應的下載頁面下載Apache Axis2/Java。我建議至少使用AXIS2 1.7.3。
為了編譯用C編程語言編寫的示例(例如基於C的插座示例),您將需要一個C編譯器,例如GCC。在Linux下,通常應該已經安裝它,否則可以通過sudo apt-get install gcc 。在Windows下,通常需要通過Web安裝程序安裝MingW。
Windows或Linux的幾個C示例。 GCC允許您交叉編譯,即,如果您使用的是Linux,則可以編譯Windows的C程序。為此,您將首先安裝sudo apt-get install gcc-mingw-w64-i686 ,然後可以使用命令gcc-mingw-w64-i686 ,就像在mingw下使用gcc一樣。
為了構建和編譯我們使用消息傳遞接口(MPI)的示例,我們需要MPI實現。我們選擇mpich。
在Linux下,您可以通過sudo apt-get install mpich libmpich-dev安裝所需的文件。
ssh和rsync )為了測試我們的hadoop示例,我們現在需要設置一個單個節點hadoop群集。因此,我們遵循http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/singlecluster.html的指南。我們需要安裝諸如ssh和rsync之類的先決條件。在Hadoop示例README中,我們為Hadoop 2.7.2 Linux / Ubuntu提供了安裝指南。它歸結為從http://www.apache.org/dyn/closer.cgi/hadoop/common/上提供的一台鏡子下載和安裝Hadoop,並遵循鏈接教程的指南。
這項工作純粹是教育目的。除了下面提到的所有內容外,對於此存儲庫中的任何內容,我都會施加另外的許可條件:該代碼絕不能用於可能違反德國,中國或美國法律的任何事物。這也適用於此處提供的任何其他文件或資源。
該存儲庫中的示例是根據GNU通用公共許可證版本第3版,2007年6月29日獲得許可的,但以下例外:
目錄 /javaserverpages /standalonejspswithjetty和 /javaservlets /proxy中的所有內容均根據Apache License v2.0許可,並部分衍生自具有版權(C)1995-2013 Mort Bay Consulting Pty.ltd.ltd. ltd. embedded-jetty-jsp。
一些Hadoop示例從H3ML3T的Maven-Hadoop-Java-wordcount-Template中汲取了一些靈感,為此沒有提供許可信息。這些示例在幾種方面完全不同,例如,我們建造胖罐子的方式。無論如何,這個原始項目在此博客條目中很好地描述了。
此外,我們的Hadoop單詞基於Hadoop地圖的著名單詞計數示例降低了功能。它基於提供Luca Menichetti [email protected]的版本,該版本是GNU通用公共許可證版本2。