如何在云平台虚拟机上运行Java计算密集型任务

云计算
通过Windows Azure,你可以使用一个虚拟机来处理计算密集型任务,本文将带你了解如何创建一个可运行计算密集型的Java应用程序,并可以被另一个Java应用程序所监视的虚拟机。你将学到如何远程登录到你的虚拟机、如何在你的虚拟机上安装一个JRE或JDK、如何创建一个服务总线命名空间等方法。

通过Windows Azure,你可以使用一个虚拟机来处理计算密集型任务,例如,一个虚拟机可以处理任务,并交付结果给客户机或移动应用程序。本文将让你了解如何创建一个可运行计算密集型的Java应用程序,并可以被另一个Java应用程序所监视的虚拟机。

本教程假定你知道如何创建Java控制台应用程序、导入库到你的Java应用程序及生成一个Java存档(JAR)。假设没有Windows Azure的相关知识。

你将学到:

如何创建一个虚拟机

如何远程登录到你的虚拟机

如何在你的虚拟机上安装一个JRE或JDK

如何创建一个服务总线命名空间

如何创建一个执行计算密集型任务的Java应用程序

如何创建一个监视计算密集型任务进展情况的Java应用程序

如何运行Java应用程序

如何停止Java应用程序

本教程将使用Traveling Salesman Problem作为计算密集型任务。下面是在Java应用程序中运行计算密集型任务的例子:

 

 

以下是一个Java应用程序监控计算密集型任务的例子:

 

 

注意

要完成本教程,你需要一个已启用 Windows Azure 虚拟机功能的 Windows Azure 帐户。你可以创建一个免费的试用帐号,在短短的几分钟内启用预览功能。#p#

创建一个虚拟机

1. 登录Windows Azure预览管理入口。

2. 单击新建按钮。

3. 单击“虚拟机”。

4. 单击快速创建。

5. 在创建虚拟机界面,为DNS 名称输入一个值。

6. 在图片下拉列表中,选择一个图像,如Windows Server 2008 R2 SP1。

7. 在“新密码”框中输入密码,并在确认框中重新输入密码。请记住这个密码,你将使用它来远程登录虚拟机。

8. 从位置下拉列表中,为你的虚拟机选择数据中心位置。例如美国西部。

9. 单击“创建虚拟机”,你的虚拟机将被创建。你可以通过管理网站上的虚拟机部分来监视状态。

远程登录你的虚拟机

1. 登录预览管理入口网站。

2. 单击“虚拟机”。

3. 单击要登录的虚拟机名称。

4. 单击“连接”。

5. 当系统提示输入密码时,请使用你创建虚拟机时设置的密码。

在虚拟机上安装一个JRE或JDK

在你的虚拟机上运行Java应用程序,你需要安装一个Java Runtime Environment(JRE)。为了本教程,我们将安装一个Java开发工具包(JDK)到你的虚拟机,并且使用JDK的JRE。当然,你也可以选择只安装JRE。

在本教程中,将从Oracle网站安装一个JDK。

1. 登录到虚拟机上。

2. 在你的浏览器中打开http://www.oracle.com/technetwork/java/javase/downloads/index.html。

3. 点击下载按钮来下载你想要的JDK。在本教程中使用Java SE 6更新32 JDK的下载按钮。

4. 接受许可协议。

5. 点击下载适用于Windows x64(64位)的可执行文件。

6. 按照提,并根据自身需要把JDK安装到你的虚拟机中。

需要注意的是,服务总线功能要求GTE CyberTrust Global Root证书作为你JRE的cacerts 存储的一部分进行安装。此证书会自动包含在本教程中所用的 JRE。如果您的 JRE cacerts 存储区中没有此证书,它可以从https://secure.omniroot.com/cacert/ct_root.der上复制证书内容进行安装,内容为一个.cer文件,并通过密钥工具将其添加到cacerts 存储。#p#

如何创建一个服务总线命名空间

要在Windows Azure开始使用服务总线队列,您必须首先创建一个服务命名空间。一个服务命名空间提供了一个范围容器处理你的应用程序中的服务总线资源。

创建一个服务命名空间:

1. 登录Windows Azure管理入口(这与Windows Azure预览管理入口不同)。

2. 在左侧的导航栏中,单击服务总线、访问控制和缓存。

3. 单击服务总线按钮,然后单击新建按钮。

 

 

4. 在创建一个新的服务命名空间的对话框中,输入一个名称空间,然后以确保它是唯一的,点击检查可用性按钮。

 

 

5. 在确保名称空间的名字是可用的之后,选择你的命名空间被托管的国家或地区,但后单击创建命名空间按钮。

你创建的命名空间,将出现在管理入口,需要一段时间来激活。等到被激活时,然后再进行下一个步骤。

获取默认的命名空间的管理凭据

为了执行管理操作,比如在心的命名空间创建一个队列,你需要获得命名空间的管理凭据。

1. 在左侧的导航栏中,单击服务总线按钮,以显示列表中可用的命名空间:

 

 

2. 从显示的列表中选择刚刚创建的命名空间:

 

 

3. 右侧会列出新的命名空间的属性:

 

 

4. 默认密钥是隐藏的。点击查看按钮以显示安全证书:

 

 

5. 记下默认的发行者和默认密钥,你将使用该信息对命名空间执行操作。#p# 

如何创建一个执行计算密集型任务的Java应用程序

1. 在你的开发机器(并不一定是你所创建的虚拟机)上,为Java下载Windows Azure SDK。

2. 在本小节的末尾创建一个Java控制台应用程序使用的示例代码。在本教程中,我们将使用TSPSolver.java作为java文件的名字。修改your_service_bus_namespace、 your_service_bus_owner、 以及 your_service_bus_key 等占位符,分别使用您的服务总线命名空间、 默认发行人和默认密钥值。

3. 编码后,导出应用程序到一个可运行的Java归档(JAR),并把所需的库到打包已生成的JAR。在本教程中,我们将使用TSPSolver.jar作为生成的JAR名称。

 

  1. // TSPSolver.java  
  2.  
  3. import com.microsoft.windowsazure.services.core.Configuration;  
  4. import com.microsoft.windowsazure.services.core.ServiceException;  
  5. import com.microsoft.windowsazure.services.serviceBus.*;  
  6. import com.microsoft.windowsazure.services.serviceBus.models.*;  
  7. import java.io.*;  
  8. import java.text.DateFormat;  
  9. import java.text.SimpleDateFormat;  
  10. import java.util.ArrayList;  
  11. import java.util.Date;  
  12. import java.util.List;  
  13.  
  14. public class TSPSolver {  
  15.  
  16.     //  Value specifying how often to provide an update to the console.  
  17.     private static long loopCheck = 100000000;    
  18.  
  19.     private static long nTimes = 0nLoops=0;  
  20.  
  21.     private static double[][] distances;  
  22.     private static String[] cityNames;  
  23.     private static int[] bestOrder;  
  24.     private static double minDistance;  
  25.     private static ServiceBusContract service;  
  26.  
  27.     private static void buildDistances(String fileLocation, int numCities) throws Exception{  
  28.         try{  
  29.             BufferedReader file = new BufferedReader(new InputStreamReader(new DataInputStream(new FileInputStream(new File(fileLocation)))));  
  30.             double[][] cityLocs = new double[numCities][2];  
  31.             for (int i = 0; i<numCities; i++){  
  32.                 String[] line = file.readLine().split(", ");  
  33.                 cityNames[i] = line[0];  
  34.                 cityLocs[i][0] = Double.parseDouble(line[1]);  
  35.                 cityLocs[i][1] = Double.parseDouble(line[2]);                 
  36.             }  
  37.             for (int i = 0; i<numCities; i++){  
  38.                 for (int j = i; j<numCities; j++){  
  39.                     distances[i][j] = Math.hypot(Math.abs(cityLocs[i][0] - cityLocs[j][0]), Math.abs(cityLocs[i][1] - cityLocs[j][1]));  
  40.                     distances[j][i] = distances[i][j];  
  41.                 }  
  42.             }  
  43.         } catch (Exception e){  
  44.             throw e;  
  45.         }  
  46.     }  
  47.  
  48.     private static void permutation(List<Integer> startCities, double distSoFar, List<Integer> restCities) throws Exception {  
  49.  
  50.         try  
  51.         {  
  52.             nTimes++;  
  53.             if (nTimes == loopCheck)  
  54.             {  
  55.                 nLoops++;  
  56.                 nTimes = 0;  
  57.                 DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");  
  58.                 Date date = new Date();  
  59.                 System.out.print("Current time is " + dateFormat.format(date) + ". ");  
  60.                 System.out.println(  "Completed " + nLoops + " iterations of size of " + loopCheck + ".");  
  61.             }  
  62.  
  63.             if ((restCities.size() == 1) && ((minDistance == -1) || (distSoFar + distances[restCities.get(0)][startCities.get(0)] + distances[restCities.get(0)][startCities.get(startCities.size()-1)] < minDistance))){  
  64.                 startCities.add(restCities.get(0));  
  65.                 newBestDistance(startCities, distSoFar + distances[restCities.get(0)][startCities.get(0)] + distances[restCities.get(0)][startCities.get(startCities.size()-2)]);  
  66.                 startCities.remove(startCities.size()-1);  
  67.             }  
  68.             else{  
  69.                 for (int i=0; i<restCities.size(); i++){  
  70.                     startCities.add(restCities.get(0));  
  71.                     restCities.remove(0);  
  72.                     permutation(startCities, distSoFar + distances[startCities.get(startCities.size()-1)][startCities.get(startCities.size()-2)],restCities);  
  73.                     restCities.add(startCities.get(startCities.size()-1));  
  74.                     startCities.remove(startCities.size()-1);  
  75.                 }  
  76.             }  
  77.         }  
  78.         catch (Exception e)  
  79.         {  
  80.             throw e;  
  81.         }  
  82.     }  
  83.  
  84.     private static void newBestDistance(List<Integer> cities, double distance) throws ServiceException, Exception {  
  85.         try   
  86.         {  
  87.             minDistance = distance;  
  88.             String cityList = "Shortest distance is "+minDistance+", with route: ";  
  89.             for (int i = 0; i<bestOrder.length; i++){  
  90.                 bestOrder[i] = cities.get(i);  
  91.                 cityList += cityNames[bestOrder[i]];  
  92.                 if (i != bestOrder.length -1)  
  93.                     cityList += ", ";  
  94.             }  
  95.             System.out.println(cityList);  
  96.             service.sendQueueMessage("TSPQueue", new BrokeredMessage(cityList));  
  97.         }   
  98.         catch (ServiceException se)   
  99.         {  
  100.             throw se;  
  101.         }  
  102.         catch (Exception e)   
  103.         {  
  104.             throw e;  
  105.         }  
  106.     }  
  107.  
  108.     public static void main(String args[]){  
  109.  
  110.         try {  
  111.  
  112.             Configuration config = ServiceBusConfiguration.configureWithWrapAuthentication(  
  113.                     "your_service_bus_namespace", "your_service_bus_owner", "your_service_bus_key");  
  114.  
  115.             service = ServiceBusService.create(config);  
  116.  
  117.             int numCities = 10;  // Use as the default, if no value is specified at command line.   
  118.             if (args.length != 0)   
  119.             {  
  120.                 if (args[0].toLowerCase().compareTo("createqueue")==0)  
  121.                 {  
  122.                     // No processing to occur other than creating the queue.  
  123.                     QueueInfo queueInfo = new QueueInfo("TSPQueue");  
  124.  
  125.                     service.createQueue(queueInfo);  
  126.  
  127.                     System.out.println("Queue named TSPQueue was created.");  
  128.  
  129.                     System.exit(0);  
  130.                 }  
  131.  
  132.                 if (args[0].toLowerCase().compareTo("deletequeue")==0)  
  133.                 {  
  134.                     // No processing to occur other than deleting the queue.  
  135.                     service.deleteQueue("TSPQueue");  
  136.  
  137.                     System.out.println("Queue named TSPQueue was deleted.");  
  138.  
  139.                     System.exit(0);  
  140.                 }  
  141.  
  142.                 // Neither creating or deleting a queue.  
  143.                 // Assume the value passed in is the number of cities to solve.  
  144.                 numCities = Integer.valueOf(args[0]);    
  145.             }  
  146.  
  147.             System.out.println("Running for " + numCities + " cities.");  
  148.  
  149.             List<Integer> startCities = new ArrayList<Integer>();  
  150.             List<Integer> restCities = new ArrayList<Integer>();  
  151.             startCities.add(0);  
  152.             for(int i = 1; i<numCities; i++)  
  153.                 restCities.add(i);  
  154.             distances = new double[numCities][numCities];  
  155.             cityNames = new String[numCities];  
  156.             buildDistances("c:\\TSP\\cities.txt", numCities);  
  157.             minDistance = -1;  
  158.             bestOrder = new int[numCities];  
  159.             permutation(startCities, 0, restCities);  
  160.             System.out.println("Final solution found!");  
  161.             service.sendQueueMessage("TSPQueue", new BrokeredMessage("Complete"));  
  162.         }   
  163.         catch (ServiceException se)   
  164.         {  
  165.             System.out.println(se.getMessage());  
  166.             se.printStackTrace();  
  167.             System.exit(-1);  
  168.         }          
  169.         catch (Exception e)   
  170.         {  
  171.             System.out.println(e.getMessage());  
  172.             e.printStackTrace();  
  173.             System.exit(-1);  
  174.         }  
  175.     }  
  176.  
  177.  #p# 

如何创建一个监视计算密集型任务进展情况的Java应用程序

1. 在你的开发机器上,创建一个Java控制台应用程序,使用的示例代码在本小节的末尾。在本教程中,我们将使用TSPClient.java作为Java文件名。和之前一样,分别使用你的服务总线命名空间、 默认发行人和默认密钥值,修改your_service_bus_namespace、 your_service_bus_owner、 以及 your_service_bus_key 等占位符。

2. 导出应用程序到一个可执行的JAR,并打包所需的库到生成的JAR。在本教程中,我们将使用TSPClient.jar生成的JAR名。

 

  1. // TSPClient.java  
  2.  
  3. import java.util.Date;  
  4. import java.text.DateFormat;  
  5. import java.text.SimpleDateFormat;  
  6. import com.microsoft.windowsazure.services.serviceBus.*;  
  7. import com.microsoft.windowsazure.services.serviceBus.models.*;  
  8. import com.microsoft.windowsazure.services.core.*;  
  9.  
  10. public class TSPClient   
  11. {  
  12.  
  13.     public static void main(String[] args)   
  14.     {  
  15.             try  
  16.             {  
  17.  
  18.                 DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");  
  19.                 Date date = new Date();  
  20.                 System.out.println("Starting at " + dateFormat.format(date) + ".");  
  21.  
  22.                 String namespace = "your_service_bus_namespace";  
  23.                 String issuer = "your_service_bus_owner";  
  24.                 String key = "your_service_bus_key";  
  25.  
  26.                 Configuration config;  
  27.                 config = ServiceBusConfiguration.configureWithWrapAuthentication(  
  28.                         namespace, issuer, key);  
  29.  
  30.                 ServiceBusContract service = ServiceBusService.create(config);  
  31.  
  32.                 BrokeredMessage message;  
  33.  
  34.                 int waitMinutes = 3;  // Use as the default, if no value is specified at command line.   
  35.                 if (args.length != 0)   
  36.                 {  
  37.                     waitMinutes = Integer.valueOf(args[0]);    
  38.                 }  
  39.  
  40.                 String waitString;  
  41.  
  42.                 waitString = (waitMinutes == 1) ? "minute." : waitMinutes + " minutes.";   
  43.  
  44.                 // This queue must have previously been created.  
  45.                 service.getQueue("TSPQueue");  
  46.  
  47.                 int numRead;  
  48.  
  49.                 String s = null;  
  50.  
  51.                 while (true)  
  52.                 {  
  53.  
  54.                     ReceiveQueueMessageResult resultQM = service.receiveQueueMessage("TSPQueue");  
  55.                     message = resultQM.getValue();  
  56.  
  57.                     if (null != message && null != message.getMessageId())  
  58.                     {                          
  59.  
  60.                         // Display the queue message.  
  61.                         byte[] b = new byte[200];  
  62.  
  63.                         System.out.print("From queue: ");  
  64.  
  65.                         s = null;  
  66.                         numRead = message.getBody().read(b);  
  67.                         while (-1 != numRead)  
  68.                         {  
  69.                             s = new String(b);  
  70.                             ss = s.trim();  
  71.                             System.out.print(s);  
  72.                             numRead = message.getBody().read(b);  
  73.                         }  
  74.                         System.out.println();  
  75.                         if (s.compareTo("Complete") == 0)  
  76.                         {  
  77.                             // No more processing to occur.  
  78.                             date = new Date();  
  79.                             System.out.println("Finished at " + dateFormat.format(date) + ".");  
  80.                             break;  
  81.                         }  
  82.                     }  
  83.                     else  
  84.                     {  
  85.                         // The queue is empty.  
  86.                         System.out.println("Queue is empty. Sleeping for another " + waitString);  
  87.                         Thread.sleep(60000 * waitMinutes);  
  88.                     }  
  89.                 }   
  90.  
  91.         }  
  92.         catch (ServiceException se)  
  93.         {  
  94.             System.out.println(se.getMessage());  
  95.             se.printStackTrace();  
  96.             System.exit(-1);  
  97.         }  
  98.         catch (Exception e)  
  99.         {  
  100.             System.out.println(e.getMessage());  
  101.             e.printStackTrace();  
  102.             System.exit(-1);  
  103.         }  
  104.  
  105.     }  
  106.  
  107.  #p#

 

如何运行Java应用程序

运行计算密集型应用程序,首先要创建队列,然后解决Traveling Saleseman Problem,它会将当前的最佳路径添加到服务总线队列。当计算密集型应用程序正在运行(或运行后),运行客户端,从服务总线的队列显示结果。

如何运行计算密集型应用程序

1. 登陆到虚拟机上。

2. 创建一个你将在其中运行应用程序的文件夹。例如:c:\TSP。

3. 复制TSPSolver.jar到c:\TSP.

4. 创建一个包含以下内容的名为c:\TSP\cities.txt的文档:

 

  1. City_1, 1002.81, -1841.35  
  2. City_2, -953.55, -229.6  
  3. City_3, -1363.11, -1027.72  
  4. City_4, -1884.47, -1616.16  
  5. City_5, 1603.08, -1030.03  
  6. City_6, -1555.58, 218.58  
  7. City_7, 578.8, -12.87  
  8. City_8, 1350.76, 77.79  
  9. City_9, 293.36, -1820.01  
  10. City_10, 1883.14, 1637.28  
  11. City_11, -1271.41, -1670.5  
  12. City_12, 1475.99, 225.35  
  13. City_13, 1250.78, 379.98  
  14. City_14, 1305.77, 569.75  
  15. City_15, 230.77, 231.58  
  16. City_16, -822.63, -544.68  
  17. City_17, -817.54, -81.92  
  18. City_18, 303.99, -1823.43  
  19. City_19, 239.95, 1007.91  
  20. City_20, -1302.92, 150.39  
  21. City_21, -116.11, 1933.01  
  22. City_22, 382.64, 835.09  
  23. City_23, -580.28, 1040.04  
  24. City_24, 205.55, -264.23  
  25. City_25, -238.81, -576.48  
  26. City_26, -1722.9, -909.65  
  27. City_27, 445.22, 1427.28  
  28. City_28, 513.17, 1828.72  
  29. City_29, 1750.68, -1668.1  
  30. City_30, 1705.09, -309.35  
  31. City_31, -167.34, 1003.76  
  32. City_32, -1162.85, -1674.33  
  33. City_33, 1490.32, 821.04  
  34. City_34, 1208.32, 1523.3  
  35. City_35, 18.04, 1857.11  
  36. City_36, 1852.46, 1647.75  
  37. City_37, -167.44, -336.39  
  38. City_38, 115.4, 0.2  
  39. City_39, -66.96, 917.73  
  40. City_40, 915.96, 474.1  
  41. City_41, 140.03, 725.22  
  42. City_42, -1582.68, 1608.88  
  43. City_43, -567.51, 1253.83  
  44. City_44, 1956.36, 830.92  
  45. City_45, -233.38, 909.93  
  46. City_46, -1750.45, 1940.76  
  47. City_47, 405.81, 421.84  
  48. City_48, 363.68, 768.21  
  49. City_49, -120.3, -463.13  
  50. City_50, 588.51, 679.33 

 

1. 在命令提示符下,将目录更改到c:\TSP。

2. 确保JRE的bin文件夹在PATH环境变量中。

3. 在你运行运行TSP求解排列之前,你需要创建服务总线队列。运行下面的命令来创建服务总线队列

  1. java -jar TSPSolver.jar createqueue 

现在,创建队列,你可以运行TSP求解排列。 #p#

如何运行客户端监控应用程序

1. 登录到你将运行客户端应用程序的计算机。该计算机并不一定是运行TSPSolver应用程序的同一台机器,虽然它也可以。

2. 创建一个你将在其中运行应用程序的文件夹。例如:c:\TSP。

3. 复制TSPClient.jar到c:\TSP。

4. 确保JRE的bin文件夹在PATH环境变量中。

5. 在命令提示符下,将目录更改到c:\TSP。

6. 运行下面的命令

  1. java -jar TSPClient.jar 

(可选)通过在命令行中的参数指定检查队列之间的睡眠分钟数。默认检查队列的睡眠周期是3分钟,如果你想为睡眠时间间隔使用不同的值,例如一分钟,运行以下命令

  1. java -jar TSPClient.jar 1 

客户端将一直运行,直到它看到一个“完整”的队列消息。注意,如果你没有在运行客户端的情况下运行多个事件的求解器,你可能需要多次运行客户端来完全清空队列。或者,你可以删除队列,然后再重新创建。删除队列,请运行以下TSPSolver(不是TSPClient)命令

  1. java -jar TSPSolver.jar deletequeue 

求解器将运行,直到它检查完所有路线。

如何停止Java应用程序

对于求解器和客户端应用程序,如果你想在正常完成前结束,你可以按Ctrl+ C组合键退出。

责任编辑:王程程 来源: DZone
相关推荐

2011-11-11 09:11:09

云计算HPC集群

2012-11-05 15:53:18

高性能计算北龙超云

2020-09-07 07:33:01

NodejsCPU密集型

2012-03-19 21:19:14

vmwarekvm

2021-08-19 08:00:00

Windows 11Windows 10虚拟机

2018-03-22 09:16:06

密集型场景SSD

2020-02-24 08:00:20

云的计算解决方案虚拟机

2012-05-07 10:00:56

虚拟机

2023-03-14 16:40:17

2020-09-30 10:56:13

Facebook 开发开源

2015-05-11 11:37:04

惠普

2012-12-17 11:20:51

VDI桌面虚拟化

2023-02-14 15:04:00

Linux虚拟机物理机

2022-06-27 14:01:31

LZ4 分析数据密集型压缩算法

2015-10-20 14:03:44

虚拟机特性Windows 10

2020-03-20 17:57:17

GTC

2011-09-22 09:27:02

虚拟机windows8虚拟化

2012-10-10 13:59:04

惠普虚拟化环境四插槽

2013-08-13 09:44:23

虚拟机Hyper-V
点赞
收藏

51CTO技术栈公众号