在本系列的第1 部分,我们介绍了在Azure 上进行网格计算开发的设计模式,并在第2 部分,我们编写了一个欺诈评分(fraud scoring)网格计算应用程序,命名为Fraud Check。在这里,第3 部分中,我们将来运行这个应用程序,首先在本地运行,接着移到云上运行。
我们使用的框架是 Azure Grid ,是 Neudesic Grid Computing Framework 的社区版。
在运行我们的网格应用程序之前,有几件事情需要处理——比如配置跟踪数据库和设置配置信息——不过,我们先来一睹应用程序在云中运行起来的效果图:
那么让我们来完成如下步骤的设置,以便我们能运行它。
网格应用程序解决方案结构
Azure Grid 为你提供了一个基础的解决方案模板,在其中你可以添加特定于应用程序的代码。上次,我们为 Fraud Check 网格应用程序添加了代码,不过并未讲解解决方案结构本身。现在我们就来说一说。
我们的网格计算解决方案具有云中的部分,也有企业内的部分。Azure Grid 框架把所有这些都包含在一个单独的解决方案中,如下所示。那么,在解决方案中都有些什么?
- GridApplication 项目包含了我们在本系列文章第二部分编写的特定于应用程序的代码。回忆一下,我们编写了 3 块代码:任务代码、加载器和聚合器。解决方案的其他项目含有应用程序的代码:一些代码将在云中执行,一些将在企业系统中执行。
- 在 Azure 中的网格执行器代码位于 AzureGrid 和 AzureGrid_WorkerRole 项目中。这是一个带有执行器角色的标准 Azure 托管应用程序,可通过 Azure 门户部署到 Azure 托管项目中。你的任务应用程序代码就将在这里面执行。
- 企业端的代码位于 GridManager 项目中。这是一个用于启动和监测网格工作的桌面应用程序。其也在后台运行你的加载器代码和聚合器代码。
- StorageClient 项目是一个访问云存储的函数库,其继承自 Azure SDK StorageClient 示例。云中的网格执行器和企业系统中的网格管理软件都用到了这个函数库。
要运行这个解决方案里云中和基础系统中的部分都很简单:
- 要运行网格管理器,右键点击 GridManager 项目,并选择 Debug > Start。
- 要在本地机器上用本地开发环境运行网格执行器,右键点击 AzureGrid 项目,选择 Debug > Start。
- 要在 Azure 上运行网格执行器,利用 Azure 门户按照通常的步骤把 AzureGrid 项目发布到 Azure 中,以形成一个托管应用程序。
为了在本地测试所有功能,把 AzureGrid 和 GridManager 都设置为启动项目会很有用,那样只按一次 F5 就可以启动这两个应用程序。
设置本地数据库
Azure Grid 在本地 SQL Server 或 SQL Server Express 数据库(2005 或 2008)中跟踪工作运行、任务、参数和结果。从 CodePlex 下载的项目源码中还包含了创建这个数据库的 SQL 脚本。
配置解决方案
解决方案里云中和基础系统中的部分都需要少许配置,最重要的地方是和云存储相关的。
云中的网格执行器配置在 AzureGrid 项目的 ServiceConfiguration.cscfg 文件中设定,如下:
- ProjectName:你的应用程序的名称
- TaskQueueName:在云存储中用于接收来自网格执行器结果的队列名称
- QueueTimeout:一个任务在重新被其他执行器覆盖之前可以执行多长时间(以秒计)
- SleepInterval:网格执行器检查要执行的新任务之前休眠的间隔时间(以秒计)
- QueueStorageEndpoint:用于云存储项目或本地开发存储的队列存储端点
- AccountName:云存储项目的名称
- AccountSharedKey:云存储项目的密钥
用于网格管理器的配置是在 GridManager 项目的 app.config 文件中设定。大部分设置都具有和云中配置文件一样的名称和含义,且需要设置为相同的值。多出的一个本地 SQL Server 数据库的连接字符串设置,用于网格应用程序跟踪记录。
跨环境对网格应用程序进行测试和逐级推进
由于网格应用程序能被极大地进行伸缩,理所当然你应该仔细地测试它们。在基于 Azure 的网格计算场景中,我建议按照如下顺序对这个新的网格应用程序进行测试:
1. 开发人员测试
用少量的任务在本地开发机器上测试网格应用程序。在此,你要关注的是,验证应用程序是否正确运行,正确的数据是否在网格应用程序和基础存储之间进行移动。
- 对于云运算部分,网格应用程序会在本地开发环境中执行。
- 对于云存储部分,也使用本地开发环境替代。
Grid Manager 当然(也一直会)在本地机器上执行。
2. QA 测试
还是在本地环境,在多个执行器机器上用大量的任务测试应用程序。这个测试的目标是验证,同样的工作在单机环境中和在利用云存储的多机环境中都能执行。
- 对于云运算部分,网格应用程序会在本地开发环境中执行,不过是在多台本地机器。
- 对于云存储部分,使用 AzureStorage 项目。
注意,由于这种方式依旧主要是一个本地测试,只是用到了 Azure 的云存储。在我们无法协调跨多台机器的工作的时候,这样的方式是必须的。
3. 登台(Staging)环境
把网格应用程序部署到 Azure 的登台环境中,用少量的任务来运行它。在这个阶段,你可以验证本地正常运行的工作是否能在云中运行。
- 对于云运算,网格应用程序部署在 Azure 托管项目中——Staging。
- 对于云存储,用到了 Azure Storage 项目。
4. 生产环境
现在,你已经准备好把应用程序推进到 Azure 托管生产环境的级别,用饱和的负荷来运行它。
- 对于云运算,网格应用程序托管在 Azure 托管项目中——Production。
- 对于云存储,用到了 Azure Storage 项目。
你可以使用 Azure Manager 来监测网格应用程序是否正常运行。
本地测试运行
现在我们来准备在我们的开发机器上进行本地测试。根据我们的测试计划,最初是在本地开发机器上用少量负荷进行测试。
输入数据显示在下面的这个 CSV 工作表,它用 Excel 创建并保存为 CSV 文件。Fraud Check 应用程序需要这个输入文件的打开账号和启动 GridManager.exe 的账号一致。在这个测试中,我们将使用 25 条记录。
为了确保数据库正确设置,云中和企业中的配置都要反映到本地开发存储里。
编译应用程序,启动 AzureGrid 和 GridManager 两个项目。
AzureGrid 项目不会显示任何可见的东西,不过如果你想的话可以通过开发环境 UI(Developer Fabric UI)来检查它的运行情况。
GridManager 应用程序是一个基于 WPF 的控制台,启动后如下面所示:
要在应用程序中启动一个工作(Job),从菜单选择 Job > New Job。在显示出的对话框中,填写名称和描述。
点击 OK 按钮,你将看到工作被创建不过还未运行。工作面板显示为红色以表示工作尚未开始。
现在,我们已经准备好启动网格应用程序了。点击 Start 按钮,很快你就会看到工作面板变为黄色,任务的网格也显示出来。
上述显示结果将每 10 秒钟更新一次。不久,你将看到一些任务显示为红色,一些黄色,而一些是绿色。任务在等待的时候显示红色,被执行的时候显示黄色,当执行完成就显示绿色。
当所有任务都完成后,工作面板就显示为绿色。
在网格应用程序执行完成后,我们来检查一下结果。Fraud Check 被编写为从输入电子数据表中读取输入参数,再把结果写入到输出电子数据表中。打开这个新创建的输出电子数据表,我们能看到网格应用程序为每条输入记录创建了一个评分、说明文本和批准决定。
查看网格
在这个我们刚刚完成的测试运行中,我们看到一个 Grid View,藉此我们能了解到网格应用程序执行的总体情况。每个小框代表一个网格任务,框中显示任务的 ID。在下面的图中,你能看到一个显示了大量任务的 Grid View。
- 红色的任务是等待中的,意味着它们还没有被执行。这些任务保存在云存储上的任务队列中(加载器把任务放到这个队列中)。也就是说,这些任务还未被网格执行器来提取。
- 黄色的任务是执行中的。你通常会看到和执行器角色实例数目一样的黄色小框。
- 绿色的任务是执行完的。这些任务已经被执行,它们的结果已经被放到聚合器队列上,以等待聚合器提取。
除了 Grid View 外,你还能看到任务和结果。Grid View、Task View 和 Results View 按钮让你可以看到网格应用程序的不同视图。
查看任务
在工作运行之中或之后,你可以点击 Task View 按钮来查看任务的相关信息。Task View 为每个任务显示一行数据,包括 Task Id、Task Type 和 Worker 机器名称。在本地运行的时候,列出的总是你自己的本地机器名称,而在云中运行的时候,你会看到负责处理每个任务的特定机器名称。
查看结果
Result View 类似于 Task View——每个任务一行数据——不过以 XML 的形式为每个任务显示了输入参数和结果。你也可以拉宽这个窗体来查看完整的信息。
在云中运行网格应用程序
在看了本地机器运行的网格应用程序之后,现在让我们来在云中运行它。这要求我们修改一下配置信息以利用云存储项目而非本地开发存储;也要把 AzureGrid 项目部署到云托管项目中。
部署到云中的步骤和任何托管 Azure 应用程序类似:
1,右键点击 AzureGrid 项目,选择 Publish。
2,在 Azure 门户上,访问托管 Azure 项目,并点击 Staging 下面的 Deploy 按钮,来上传你的应用程序包和配置文件。
3,点击 Run 来运行你的实例。
下一步就是准备你的输入数据。在我们的本地测试环境中,输入到应用程序的数据是一个包含 25 行待处理的申请信息的电子数据表。这次,我们将使用一个具有 1000 行的大数据。
由于云中的那部分程序已经在 Azure 平台里运行起来了,所以我们只需要在本地启动 Grid Manager 应用程序。
我们再次通过 Azure Manager 菜单的 New Job 菜单项,选择一个工作来启动。
和前面一样,我们点击 OK 完成对话框的录入,接着点击 Start 来开始工作的运行。你可以在 Grid View 中看到加载器生成了 1000 个任务。
切换到 Task View,你能看到执行每个任务的云执行器的机器名称。
即使在网格应用程序完成计算之前,你就可以通过 Results View 开始检查结果了(之前所显示的那样)。
在工作完成之后,云存储已经被清空。由于已经没有工作可做,我们可以暂停部署到云中的应用程序,这样就避免了额外的计算花费。
一旦应用程序完成运行,期望的结果(在 Fraud Check 这个例子中的输出结果是一个 CSV 文件)也就准备妥当,行的数目正如我们所预料的(和输入数据的数目一致),每个任务都有了计算结果。
我们能看到 1000 行数据已经被处理了,不过记录没有保持最初的顺序。这是很正常的:我们无法控制任务执行的顺序,而且我们所关心的只是每个任务保证其的原子性。把输入参数复制到输出结果中的一个原因是,可以把输入信息和结果信息关联起来。
性能和调优
当前,很难估计在 Azure 中的网格计算应用程序的性能,由于我们还只能使用 Azure 的预览版【译者注:本文翻译的时候 Azure 已经正式商用,不过尚未在中国大陆推出,详情见此处。】,它提供给开发人员用于测试的实例数量只是每个项目2 个。
不过有一种让你的网格计算应用程序的实例超过2 个的方法,就是把网格执行器托管到多个地方。你能使用多个托管账户,可以和其他Azure 账户拥有者进行合作。你也能在本地运行一些执行器。这样做可行,是因为云存储中的队列是网格执行器和企业加载器/ 聚合器的通信机制。只要你使用一个通用的存储项目,你就能把网格执行放置到各种各样的地方。
我们也希望网格计算应用程序业已成真的地方,能在Azure 中也能成真:例如,计算密集的应用程序能通过网格计算这种方式能获得巨大的回报。
随着Azure 正式发布的临近,我们应该能收集到很多关于网格计算性能和如何调优的大量有意义数据。
查看英文原文: Grid Computing on the Azure Cloud Computing Platform, Part 3: Running a Grid Application 。
给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。
评论