当今各地的分布式系统围绕着我们。他们最突出的例子是互联网托管万维网。企业计算系统中的计算环境通常也被分发,将不同的服务与资产管理系统的不同服务相互连接。许多应用程序甚至托管在云中。最后,当今的大规模工程和科学计算在很大程度上依赖群集,以便将其工作量平行。这些主题在我的分布式计算讲座中进行了讨论。在此存储库中,您可以找到我在课程中使用的实践示例。
插座
在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。