<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>CCIC CAT</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/cciccat/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/cciccat/feed.xml</link>
    <description />
    <lastBuildDate>Wed, 17 Apr 2019 03:20:40 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>如何将一个媒体服务的点播视频迁移到另一个订阅</title>
      <link>https://docs.microsoft.com/archive/blogs/cciccat/472</link>
      <pubDate>Tue, 05 Jan 2016 06:56:00 GMT</pubDate>
      <dc:creator><![CDATA[Amber Zhao]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cciccat/2016/01/05/472/</guid>
      <description><![CDATA[媒体服务是个很方便的管理点播、直播视频的服务，当用户的媒体服务账号已经管理众多资产，而当前订阅需要做变化，这时就需要迁移已经编码、发布过的资产到另一订阅。本文描述如何将媒体服务账号下的点播资产从一个订...]]></description>
      <content:encoded><![CDATA[<p>媒体服务是个很方便的管理点播、直播视频的服务，当用户的媒体服务账号已经管理众多资产，而当前订阅需要做变化，这时就需要迁移已经编码、发布过的资产到另一订阅。本文描述如何将媒体服务账号下的点播资产从一个订阅迁移到另外一个订阅。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 点击如下连接安装Azure Media Services Explorer</p>
<p style="padding-left: 30px;"><a href="https://aka.ms/amse">https://aka.ms/amse</a></p>
<p style="padding-left: 30px;">2.&nbsp;配置媒体服务的源和目的账号，针对于Azure中国数据中心Endpoint设置请参考如下文档</p>
<p style="padding-left: 30px;"><a href="https://blogs.msdn.com/b/cciccat/archive/2015/02/26/azure-china-media-service-restapi-endpoint.aspx">https://blogs.msdn.com/b/cciccat/archive/2015/02/26/azure-china-media-service-restapi-endpoint.aspx</a></p>
<p style="padding-left: 30px;">本文配置的两个账号如下：ambertest1为订阅1下媒体服务源账号，ambertest2为订阅2下的媒体服务目标账号。</p>
<p style="padding-left: 30px;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/3618.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/3618.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/3618.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/3618.1.png" alt="" border="0" /></a></p>
<p style="padding-left: 30px;">3.选中需要迁移的资产后，点击Asset-&gt;选择 Copy/merge asset(s) to a new asset</p>
<p style="padding-left: 30px;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4718.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4718.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4718.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4718.2.png" alt="" border="0" /></a></p>
<p style="padding-left: 30px;">4.选择迁移的目标媒体服务账号，在此处，已经创建了名为ambertest2的媒体服务账号</p>
<p style="padding-left: 30px;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2671.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2671.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2671.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2671.3.png" alt="" border="0" /></a></p>
<p style="padding-left: 30px;">5.点击Copy Asset后，便开始同步两个账号下的资产，当成功后，会输出如下的信息：</p>
<pre class="scroll"><code class="cplusplus"> [1/5/2016 1:54:42 PM] Transfer 'Copy asset 'Azure Machine Learning Step3-H264_Adaptive_Bitrate_MP4_Set_1080p-Output' to account 'ambertest2'': started<br /> [1/5/2016 1:54:43 PM] Starting the asset copy process.<br /> [1/5/2016 1:54:51 PM] File '994900fa-1700-80c4-5e17-f1e5b36edf9d_metadata.xml' copied.<br /> [1/5/2016 1:54:53 PM] File '03-3 Signing up for Azure Machine Learning Step3_manifest.xml' copied.<br /> [1/5/2016 1:54:57 PM] File '03-3 Signing up for Azure Machine Learning Step3_H264_650kbps_AAC_und_ch2_128kbps.mp4' copied.<br /> [1/5/2016 1:55:13 PM] File '03-3 Signing up for Azure Machine Learning Step3_H264_6000kbps_AAC_und_ch2_128kbps.mp4' copied.<br /> [1/5/2016 1:55:53 PM] File '03-3 Signing up for Azure Machine Learning Step3_H264_4700kbps_AAC_und_ch2_128kbps.mp4' copied.<br /> [1/5/2016 1:55:58 PM] File '03-3 Signing up for Azure Machine Learning Step3_H264_400kbps_AAC_und_ch2_128kbps.mp4' copied.<br /> [1/5/2016 1:56:03 PM] File '03-3 Signing up for Azure Machine Learning Step3_H264_3400kbps_AAC_und_ch2_128kbps.mp4' copied.<br /> [1/5/2016 1:56:08 PM] File '03-3 Signing up for Azure Machine Learning Step3_H264_2250kbps_AAC_und_ch2_128kbps.mp4' copied.<br /> [1/5/2016 1:56:12 PM] File '03-3 Signing up for Azure Machine Learning Step3_H264_1500kbps_AAC_und_ch2_128kbps.mp4' copied.<br /> [1/5/2016 1:56:16 PM] File '03-3 Signing up for Azure Machine Learning Step3_H264_1000kbps_AAC_und_ch2_128kbps.mp4' copied.<br /> [1/5/2016 1:56:19 PM] File '03-3 Signing up for Azure Machine Learning Step3_AAC_und_ch2_56kbps.mp4' copied.<br /> [1/5/2016 1:56:23 PM] File '03-3 Signing up for Azure Machine Learning Step3_AAC_und_ch2_128kbps.mp4' copied.<br /> [1/5/2016 1:56:26 PM] File '03-3 Signing up for Azure Machine Learning Step3.ism' copied.<br /> [1/5/2016 1:56:28 PM] Asset copy completed. The new asset in 'ambertest2' has the Id :<br /> [1/5/2016 1:56:28 PM] nb:cid:UUID:bc4100fa-1700-80c4-788c-f1e5b370cf26<br /> [1/5/2016 1:56:28 PM] Transfer 'Copy asset 'Azure Machine Learning Step3-H264_Adaptive_Bitrate_MP4_Set_1080p-Output' to account 'ambertest2'' completed.</code></pre>
<p style="padding-left: 30px;">注意：Asset&nbsp;copy会将资产转码后的storage&nbsp;account中文件、manifest、metedata全部都同步到新的storage&nbsp;account，并且生成了新的Asset ID。</p>
<p style="padding-left: 30px;">6.由于已经生成一个新的Asset ID，需要登陆Azure管理门户（或者使用代码的方式）重新发布资产。然后就可以在新的订阅中直接播放迁移过来的资产了。<br />&nbsp;&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7853.4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7853.4.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7853.4.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7853.4.png" alt="" border="0" /></a><br /> <br /><br /></p>]]></content:encoded>
    </item>
    <item>
      <title>Azure PowerShell 1.0.0以上版本在中国Azure使用的注意事项</title>
      <link>https://docs.microsoft.com/archive/blogs/cciccat/azure-powershell-1-0-0azure</link>
      <pubDate>Tue, 08 Dec 2015 22:56:00 GMT</pubDate>
      <dc:creator><![CDATA[HerbChung]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cciccat/2015/12/08/azure-powershell-1-0-0azure/</guid>
      <description><![CDATA[&nbsp;随着Azure PowerShell 1.0.0+的推出，越来越多的客户开始使用新的版本的Azure...]]></description>
      <content:encoded><![CDATA[<p><span style="font-size: small;">&nbsp;随着Azure PowerShell 1.0.0+的推出，越来越多的客户开始使用新的版本的Azure PowerShell。此版本的PowerShell最大的改变在于将原先的Switch-AzureMode的指令移除，将原本在其下的指令改以加上Rm的方式存在，如<em>Get-AzureResource</em>改为<em>Get-AzureRmResource</em>。如此一来，在使用之前就不需要先做AzureMode的切换。因此，PowerShell 1.0.0的改变主要影响的是使用Azure资源管理器 (Azure Resource Manager，以下简称ARM)的用户，对于使用Azure服务管理器(Azure Service Manager，以下简称ASM)的用户影响并不大。(关于两者差异可参考下列常见问题)</span></p>
<p><span style="font-size: small;">然而，由于此次版本的改变，许多用户在验证身份时发生了问题：</span></p>
<p><span style="font-size: small;">1. 如同以前版本使用<strong><em>Add-AzureAccount &ndash;Environment AzureChinaCloud</em></strong>输入中国Azure的身份。却发现在使用AzureRm相关指令时要求重新以<strong><em>Login-AzureRmAccount</em></strong>输入身份。</span></p>
<p><span style="font-size: small;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1184.Errorwhencallrm.PNG" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1184.Errorwhencallrm.PNG"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1184.Errorwhencallrm.PNG" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1184.Errorwhencallrm.PNG" alt="" border="0" /></a></span></p>
<p><span style="font-size: small;">2. 当输入<strong><em>Login-AzureRmAccount &ndash;Environment AzureChinaCloud</em></strong>时，出现错误。</span></p>
<p><span style="font-size: small;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1805.enverror.PNG" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1805.enverror.PNG"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1805.enverror.PNG" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1805.enverror.PNG" alt="" border="0" /></a></span></p>
<p><span style="font-size: small;">这是因为此次改版之后将ASR和ARM两者的身份信息及环境参数分开因此需要分别输入并需要对环境参数进行额外操作。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span lang="ZH-CN">在解决这个错误之前，</span><span lang="ZH-CN">需要先确认当前</span>Azure PowerShell<span lang="ZH-CN">的版本。</span></span></p>
<p><span style="font-size: small;"><span lang="ZH-CN">可在控制台中查找相关信息或在</span>PowerShell<span lang="ZH-CN">中执行</span></span></p>
<p><span style="font-size: small; background-color: #c0c0c0;">Get-Module -ListAvailable | Where-Object { $_.name -like "*Azure*" }</span></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2766.azurepsversion.PNG" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2766.azurepsversion.PNG"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2766.azurepsversion.PNG" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2766.azurepsversion.PNG" alt="" border="0" /></a></p>
<p><span lang="ZH-CN"><span style="font-size: small;">这边需要特别确认</span></span><span><span style="font-size: small;">AzureRM.Profile</span></span><span lang="ZH-CN"><span style="font-size: small;">的版本，我这边的版本是</span></span><span><span style="font-size: small;">1.0.1</span></span><span lang="ZH-CN"><span style="font-size: small;">。</span></span></p>
<p><span lang="ZH-CN"><span style="font-size: small;">首先，建议所有的用户升级到</span></span><span><span style="font-size: small;">Azure PowerShell 1.0.2</span></span><span lang="ZH-CN"><span style="font-size: small;">以上版本，主要是因为在此版本中提供了相关修正。使用</span></span><span><span style="font-size: small;">0.9.x</span></span><span lang="ZH-CN"><span style="font-size: small;">版本的用户，也建议进行升级，主要是因为有些新的服务在新的版本下才能使用。</span></span><span><span style="font-size: small;">(</span></span><span lang="ZH-CN"><span style="font-size: small;">如</span></span><span><span style="font-size: small;">Redis Cache Premium)</span></span></p>
<p><span lang="ZH-CN">最新的</span><span>Azure PowerShell</span><span lang="ZH-CN">安装文件下载地址请到这里查找</span><span>: <a href="https://github.com/Azure/azure-powershell/releases"><span style="color: #0563c1;">https://github.com/Azure/azure-powershell/releases</span></a></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;">在此，我假设</span><span style="font-size: small;">Azure PowerShell</span><span style="font-size: small;">都升级到</span><span style="font-size: small;">1.0.2</span><span style="font-size: small;">以上版本了。（无法升级的</span><span style="font-size: small;">1.0.0</span><span style="font-size: small;">及</span><span style="font-size: small;">1.0.1</span><span style="font-size: small;">用户作法可参考常见问题）</span></p>
<p><span style="font-size: small;">接着，在</span><span style="font-size: small;">PowerShell</span><span style="font-size: small;">中输入下列指令</span></p>
<p><span style="background-color: #c0c0c0;"><span style="font-size: small;">Login-AzureRmAccount </span><span style="color: #ff0000; font-size: small;">&ndash;EnvironmentName </span><span style="font-size: small;">AzureChinaCloud</span></span></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0118.envnamesuc.PNG" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0118.envnamesuc.PNG"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0118.envnamesuc.PNG" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0118.envnamesuc.PNG" alt="" border="0" /></a></p>
<p><span lang="ZH-CN"><span style="font-size: small;">在</span></span><span><span style="font-size: small;">Azure PowerShell 1.0.2</span></span><span lang="ZH-CN"><span style="font-size: small;">之后，加入了</span></span><span><span style="font-size: small;">-EnvironmentName</span></span><span lang="ZH-CN"><span style="font-size: small;">参数，使用该参数就能成功验证中国</span></span><span><span style="font-size: small;">Azure</span></span><span lang="ZH-CN"><span style="font-size: small;">的账户信息。</span></span></p>
<p><span lang="ZH-CN">接着，就能正常的操作</span><span>AzureRm</span><span lang="ZH-CN">相关指令</span></p>
<p>&nbsp;<span style="font-size: small;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/5238.successcall.PNG" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/5238.successcall.PNG"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/5238.successcall.PNG" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/5238.successcall.PNG" alt="" border="0" /></a></span></p>
<p><span style="font-size: small;">常见问题</span></p>
<p><span style="font-size: small;"><strong>1.</strong></span><strong>如果我现在使用的版本是</strong><strong>Azure PowerShell 1.0.0 / 1.0.1</strong><strong>，该如何进行</strong><strong>ARM</strong><strong>的身份验证？</strong></p>
<p><span lang="ZH-CN"><span style="font-size: small;">需要先定义在</span></span><span><span style="font-size: small;">ARM</span></span><span lang="ZH-CN"><span style="font-size: small;">下可用的环境变数</span></span></p>
<p><span style="background-color: #c0c0c0;"><span style="font-size: small;">$ChinaRmEnv = Get-AzureRmEnvironment &ndash;Name AzureChinaCloud</span></span></p>
<p><span lang="ZH-CN"><span style="font-size: small;">接着将此变数应用在</span></span><span><span style="font-size: small;">Login-AzureRmAccount</span></span><span lang="ZH-CN"><span style="font-size: small;">上</span></span></p>
<p><span style="background-color: #c0c0c0;"><span style="font-size: small;">Login-AzureRmAccount &ndash;Environment $ChinaRmEnv</span></span></p>
<p><span style="color: #ffffff; font-size: small; background-color: #000080;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/3252.envsuccess.PNG" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/3252.envsuccess.PNG"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/3252.envsuccess.PNG" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/3252.envsuccess.PNG" alt="" border="0" /></a><br /></span></p>
<p><span style="font-size: small;"><strong>2. 我该如何回复到之前的版本？ </strong></span></p>
<p><span style="font-size: small;">需要先移除目前安装的Azure PowerShell (控制台或是remove-module)，然后到<a href="https://github.com/Azure/azure-powershell/releases">https://github.com/Azure/azure-powershell/releases</a>下载你需要的版本。<span lang="ZH-CN">但由于未来</span><span>Azure PowerShell</span><span lang="ZH-CN">的服务与更新，可能会造成使用旧版本的功能限制，还是建议用户升级到最新版本。</span></span></p>
<p><span style="font-size: small;"><strong>3. Azure资源管理器 (Azure Resource Manager) 和Azure服务管理器 (Azure Service Manager) 有何区别？</strong></span></p>
<p><span style="font-size: small;">Azure服务管理器为Azure的服务管理系统，让用户能对服务进行相关操作如创建，删除，修改等。Azure资源管理器则为新一代的Azure管理系统，强化了针对资源组的管理及授权及资源建立的范本。此外，有些服务只建立在Azure资源管理器上(如Redis Cache)。</span></p>]]></content:encoded>
    </item>
    <item>
      <title>Azure Automation GA及常见的Runbook修改建议</title>
      <link>https://docs.microsoft.com/archive/blogs/cciccat/azure-automation-garunbook</link>
      <pubDate>Wed, 18 Nov 2015 18:39:00 GMT</pubDate>
      <dc:creator><![CDATA[HerbChung]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cciccat/2015/11/18/azure-automation-garunbook/</guid>
      <description><![CDATA[翻译自：https://azure.microsoft.com/en-us/blog/using-azure-automation-in-azure-everywhere/
日前Azure...]]></description>
      <content:encoded><![CDATA[<p>翻译自：<a href="https://azure.microsoft.com/en-us/blog/using-azure-automation-in-azure-everywhere/">https://azure.microsoft.com/en-us/blog/using-azure-automation-in-azure-everywhere/</a></p>
<p>日前Azure Automation正式在中国的Azure上GA了，代表21世纪互联的用户可以使用与全球Azure接轨的自动化服务。相信各位用户也很好奇，究竟在中国Azure使用上有什么不同之处及需要注意的地方，这就是本篇文章要探讨的重点。</p>
<p>首先，全球Azure支持Azure Service Management (<a title="" href="https://manage.windowsazure.com/" target="_blank">portal</a>) 及Azure Resource Manager (<a title="" href="https://portal.azure.com/" target="_blank">portal</a>)两种模式，而在中国Azure目前只有Azure Service Management这种模式，这使得截至目前为止，有部份功能如<a href="https://azure.microsoft.com/en-us/blog/announcing-powershell-script-support-azure-automation-2/">PowerShell script runbooks</a> 及 <a title="" href="https://azure.microsoft.com/en-us/documentation/articles/automation-dsc-overview/">Azure Automation DSC</a>在中国Azure还不能使用。</p>
<p>另外需要注意的地方在于全球Azure及中国Azure在许多节点的路径（URIs）上不尽相同,如管理终结点，存储终结点等。因此当许多针对全球设计的Runbook需要迁移时（包含你在网上搜寻到的Runbook或是Automation Gallery上的Runbook），需要特别注意是否使用到这些路径，这也是在一般情况下常见的错误发生原因。</p>
<p>在本篇文章中，将特别强调其中的差异及修正的方法，让你的Runbook能够顺利在全球Azure及中国Azure中使用。</p>
<h2>路径（URIs）有什么差异？</h2>
<p>下表中将全球Azure及中国Azure相同的服务对应到不同的路径（URIs）进行比较.</p>
<table style="width: 105%;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="118">
<p><strong>Service</strong></p>
</td>
<td valign="top" width="367">
<p><strong>全球</strong><strong>Azure</strong></p>
</td>
<td valign="top" width="423">
<p><strong>中国</strong><strong>Azure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong></p>
</td>
</tr>
<tr>
<td valign="top" width="118">
<p>Management API</p>
</td>
<td valign="top" width="367">
<p>management.core.windows.net</p>
</td>
<td valign="top" width="423">
<p>management.core.chinacloudapi.cn</p>
</td>
</tr>
<tr>
<td valign="top" width="118">
<p>Storage</p>
</td>
<td valign="top" width="367">
<p>core.windows.net</p>
</td>
<td valign="top" width="423">
<p>core.chinacloudapi.cn</p>
</td>
</tr>
<tr>
<td valign="top" width="118">
<p>Active Directory</p>
</td>
<td valign="top" width="367">
<p>login.windows.net</p>
</td>
<td valign="top" width="423">
<p>login.chinacloudapi.cn</p>
</td>
</tr>
<tr>
<td valign="top" width="118">
<p>Resource Manager API</p>
</td>
<td valign="top" width="367">
<p>management.azure.com</p>
</td>
<td valign="top" width="423">
<p>management.chinacloudapi.cn</p>
</td>
</tr>
<tr>
<td valign="top" width="118">
<p>Gallery</p>
</td>
<td valign="top" width="367">
<p>gallery.azure.com</p>
</td>
<td valign="top" width="423">
<p>gallery.chinacloudapi.cn</p>
</td>
</tr>
</tbody>
</table>
<h2>&nbsp;</h2>
<h2>如何对Azure Automation的Runbook进行修改以指向中国Azure</h2>
<p>一般而言，在Azure Automation Runbook中如过需要连结到Azure的资源时，会使用<strong>A</strong><strong>dd-AzureAccount</strong>这项PowerShell命令向Azure进行验证及授权，以让PowerShell的操作阶段中，能够使用Azure的订阅。如果你同时拥有多个订阅，你可以使用<strong>Select-AzureSubscription</strong>这项PowerShell命令来选择你想操作的订阅。如果上述两项命令都成功了，就可以开始使用其他PowerShell命令来完成相关的工作。这个方法被称之为Azure Service Management，在全球Azure及中国Azure中都适用。</p>
<p>然而，当你从Automation Gallery或是其他来源如Script Center下载runbook时，绝大多数的runbook是针对全球Azure做设计的，在<strong>Add-AzureAccount</strong>命令中并未加上任何环境参数，这意味着该命令会直接指向全球Azure而非中国Azure。因此，当你直接运行这类命令时，将会执行失败。</p>
<p>为了让runbook顺利的正确运行，你需要定义环境参数。（Environment parameter）</p>
<p>针对中国Azure，这个环境变数即为&ldquo;<strong><em>AzureChinaCloud</em></strong>&rdquo;，你需要将此变数添加到<strong>Add-AzureAccount</strong>之后，如下范例：</p>
<pre class="prettyprint">  <span style="color: #888888;"> Add-AzureAccount -Credential $AzureOrgIdCredential -Environment "AzureChinaCloud"</span></pre>
<p>完整的范本请参考：</p>
<ul>
<li>Azure China: <a title="" href="https://gallery.technet.microsoft.com/scriptcenter/Connect-to-an-Azure-VM-in-9576fe4a">https://gallery.technet.microsoft.com/scriptcenter/Connect-to-an-Azure-VM-in-9576fe4a</a></li>
</ul>
<h2>&nbsp;</h2>
<h2>透过证书的方式进行验证</h2>
<p>如果你不是使用Add-AzureAccount的命令而是使用证书的方式进行验证及授权，大致上的操作是类似的，你只需要在Set-AzureSubscription后面加入环境的变数就能将其指向中国的Azure。</p>
<p>&nbsp;</p>
<p>总而言之，Azure Automation在中国已经GA了，绝大多数功能都能透过自动化的方式实现以减少许多操作的时间，你只需要少量的修改，就能让数以百计的runbook在中国Azure也能够使用。</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>导出HDInsight数据到MySQL（Azure）</title>
      <link>https://docs.microsoft.com/archive/blogs/cciccat/hdinsightmysqlazure</link>
      <pubDate>Sun, 20 Sep 2015 23:43:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cciccat/2015/09/20/hdinsightmysqlazure/</guid>
      <description><![CDATA[在大数据计算中，经常会有一个场景：在Hadoop分布式存储DFS和关系型数据库（MySQL、Oracle、SQL Server）间导入（导出）数据。由于Azure...]]></description>
      <content:encoded><![CDATA[<p>在大数据计算中，经常会有一个场景：在Hadoop分布式存储DFS和关系型数据库（MySQL、Oracle、SQL Server）间导入（导出）数据。由于Azure HDInsight是基于公有云的托管式Hadoop，用户在执行数据转移时，与云上Hadoop相连的关系型数据库往往不是本地的数据库引擎，取而代之的是公有云提供的关系型数据库服务，如SQL Database和MySQL on Azure。针对如何使用HDInsight中的工具Sqoop导入（导出）数据到SQL Database，Azure官方文档给出了<a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-use-sqoop/">参考教程</a>，本文具体实践如何使用Sqoop（HDInsight）导出数据到MySQL on Azure的场景。</p>
<p>关于HDInsight：<a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-high-availability/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-high-availability/</a>，本实践中将会提交任务到HDInsight集群，集群中的Head Node分配任务到Worker Node，Worker Node具体实施数据的读取、处理和转移。</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4530.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4530.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4530.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4530.1.png" alt="" border="0" /></a><br />&nbsp;</p>
<p>关于MySQL on Azure：<a href="https://www.windowsazure.cn/home/features/mysql/">https://www.windowsazure.cn/home/features/mysql/</a></p>
<p>关于Sqoop: <a href="https://sqoop.apache.org/docs/1.4.4/SqoopUserGuide.html">https://sqoop.apache.org/docs/1.4.4/SqoopUserGuide.html</a></p>
<p>关于HDInsight和Azure Storage：<a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-use-blob-storage/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-use-blob-storage/</a>，HDInsight中的数据以冗余的形式存储在Azure Storage中，HDInsight节点可以通过分布式存储路径（WASB）来读写目标数据。同时，用户也可以直接访问Azure Storage对应容器中的HDInsight数据文件。</p>
<p>&nbsp;</p>
<p>注：本实践通过Azure PowerShell来实现，主要包括：</p>
<ol>
<li>创建MySQL数据表，用于接收Sqoop导出的数据。</li>
<li>上传数据样本文件到HDInsight的存储（Azure Storage）</li>
<li>提交数据导出任务（Sqoop Job）到HDInsight集群</li>
<li>跟踪Sqoop任务执行情况并检查输出结果。</li>
</ol>
<p>&nbsp;</p>
<p><strong><span style="background-color: #ffff00;">第一步：准备MySQL数据表</span></strong></p>
<p align="left">#MySQL variables = "mysqlservices-sha.chinacloudapp.cn"</p>
<p align="left">$MySQLLogin = "login1@jianwmysql"&nbsp; #<span style="background-color: #ffff00;">注意格式： 登录用户@MySQL服务器名</span></p>
<p align="left">$MySQLPassword = "password"</p>
<p align="left">$MySQLExportedDBName = "testdb01"</p>
<p align="left">$tableName = "jtable3"</p>
<p align="left">&nbsp;</p>
<p align="left">$confirmation= Read-Host "To create a new MySQL table, input 'y'; use existing MySQL table, input anything else ..."</p>
<p align="left">if ($confirmation -eq 'y') {</p>
<p align="left">&nbsp;&nbsp;&nbsp; $MySQLAdminUserName =$MySQLLogin;</p>
<p align="left">&nbsp;&nbsp;&nbsp; $MySQLAdminPassword =$MySQLPassword;</p>
<p align="left">&nbsp;&nbsp;&nbsp; $MySQLDatabase =$MySQLExportedDBName;</p>
<p align="left">&nbsp;&nbsp;&nbsp; $MySQLHost =$MySQLServerName;</p>
<p align="left">&nbsp;&nbsp;&nbsp; $ConnectionString ="server=" +$MySQLHost +";port=3306;uid=" + $MySQLAdminUserName+ ";pwd="+ $MySQLAdminPassword + ";database="+$MySQLDatabase</p>
<p align="left">&nbsp;&nbsp;&nbsp; $Query = "CREATE TABLE " + $tableName + "(id VARCHAR(40),name VARCHAR(40))"</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp; Try {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Connection = New-Object MySql.Data.MySqlClient.MySqlConnection</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Connection.ConnectionString = $ConnectionString</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Connection.Open()</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataSet = New-Object System.Data.DataSet</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RecordCount = $dataAdapter.Fill($dataSet, "data")</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataSet.Tables[0]</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Query = "select count(*) from " + $tableName</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataSet = New-Object System.Data.DataSet</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RecordCount = $dataAdapter.Fill($dataSet, "data")</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $DataSet.Tables[0].Rows[0].ItemArray[0].ToString();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [System.Console]::WriteLine("MySQL table was created successfully.");</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; Catch {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Write-Host "ERROR : Unable to run query : $query `n$Error[0]"</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; Finally {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Connection.Close()</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp; }</p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;"><strong>第二步：上传样本数据</strong></span></p>
<p align="left">Add-AzureAccount -Environment azurechinacloud</p>
<p align="left"># Define the cluter variables</p>
<p align="left">$clusterName = "hadoopjianw3"</p>
<p align="left">$storageAccountName = "jianwstorage"</p>
<p align="left">$containerName = "hadoopjianw3"</p>
<p align="left">&nbsp;</p>
<p align="left">#Upload a file into Azure storage (DFS of Hadoop)</p>
<p align="left">$StorageAccountKey = Get-AzureStorageKey -StorageAccountName $storageAccountName</p>
<p align="left">$Ctx = New-AzureStorageContext<br />$StorageAccountName -StorageAccountKey $StorageAccountKey.Primary</p>
<p align="left">Get-ChildItem -Path d:\log2copy.txt | <span style="background-color: #ffff00;">Set-AzureStorageBlobContent</span> -Container $containerName -Blob tutorials2/log2copy.txt -Context $Ctx</p>
<p align="left">此处用到的样本文件log2copy.txt，含有以下样本数据（分隔符为tab跳格），该样本文件可见附件。</p>
<p align="left">mytest&nbsp; 123</p>
<p align="left">world&nbsp;&nbsp;&nbsp; 456</p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;"><strong>第三步：提交Sqoop任务到HDInsight</strong></span></p>
<p align="left">[System.Console]::WriteLine("Start Sqoop-MySQL test ...");</p>
<p align="left">&nbsp;#Add-AzureAccount</p>
<p align="left">Add-AzureAccount -Environment azurechinacloud</p>
<p align="left">&nbsp;</p>
<p align="left"># Define the cluter variables</p>
<p align="left">$clusterName = "hadoopjianw3"</p>
<p align="left">$storageAccountName = "jianwstorage"</p>
<p align="left">$containerName = "hadoopjianw3"</p>
<p align="left">&nbsp;</p>
<p align="left"># Connection string for Azure MySQL Database.</p>
<p align="left">$conStr = "jdbc:mysql://$MySQLServerName/$MySQLExportedDBName"</p>
<p align="left">#Hive file location</p>
<p align="left">$exportDir = "wasb://$containerName@$storageAccountName.blob.core.chinacloudapi.cn/tutorials2"</p>
<p align="left">$sqoopDef = <span style="background-color: #ffff00;">New-AzureHDInsightSqoopJobDefinition</span> -Command "export --connect $conStr --username $MySQLLogin --password $MySQLPassword --table $tableName --export-dir $exportDir --fields-terminated-by \t -m 1"</p>
<p align="left">&nbsp;</p>
<p align="left">$sqoopJob = <span style="background-color: #ffff00;">Start-AzureHDInsightJob</span> -Cluster $clusterName -JobDefinition $sqoopDef -Debug -Verbose</p>
<p align="left">&nbsp;</p>
<p align="left">Wait-AzureHDInsightJob -WaitTimeoutInSeconds 3600 -Job $sqoopJob</p>
<p align="left">Write-Host "Standard Error" -BackgroundColor Green</p>
<p align="left">Get-AzureHDInsightJobOutput -Cluster $clusterName -JobId $sqoopJob.JobId -StandardError</p>
<p align="left">Write-Host "Standard Output" -BackgroundColor Green</p>
<p align="left">Get-AzureHDInsightJobOutput -Cluster $clusterName -JobId $sqoopJob.JobId -StandardOutput&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span style="background-color: #ffff00;">第四步：跟踪Sqoop任务并检查输出</span></strong></p>
<p>查看HDInsight的控制台主页</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0083.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0083.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0083.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0083.3.png" alt="" border="0" /></a></p>
<p>查看Sqoop Job的执行结果：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2543.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2543.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2543.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2543.1.png" alt="" border="0" /></a></p>
<p>查看MySQL中的结果数据</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2605.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2605.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2605.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2605.2.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p><strong><span style="background-color: #ffff00;">调试与问题解决：</span></strong></p>
<p>如果建立的HDInsight集群采用的是较低版本的Hadoop，Sqoop任务执行过程中可能抛出以下错误，该错误的原因是在HDInsight集群中找不到对应的MySQL Driver，此类问题的手动解决方法是：用户手动copy相应的MySQL Driver（mysql-connector-java-5.1.36-bin.jar）到HDInsight的C:\apps\dist\sqoop-&lt;version&gt;\lib目录下。MySQL Driver可以在<a href="https://www.mysql.com/products/connector/">https://www.mysql.com/products/connector/</a>下载。</p>
<p align="left">15/09/21 03:35:12 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5.2.2.7.1-0004</p>
<p align="left">15/09/21 03:35:12 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.</p>
<p align="left">15/09/21 03:35:13 INFO manager.SqlManager: Using default fetchSize of 1000</p>
<p align="left">15/09/21 03:35:13 INFO tool.CodeGenTool: Beginning code generation</p>
<p align="left">15/09/21 03:35:13 ERROR sqoop.Sqoop: <strong>Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver</strong></p>
<p align="left">java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.makeConnection(SqlManager.java:848)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:52)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:736)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:759)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.getColumnInfoForRawQuery(SqlManager.java:269)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.getColumnTypesForRawQuery(SqlManager.java:240)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.SqlManager.getColumnTypes(SqlManager.java:226)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:295)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1773)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1578)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:96)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:64)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:100)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.Sqoop.run(Sqoop.java:143)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.sqoop.Sqoop.main(Sqoop.java:236)</p>
<p align="left">[DBG]: PS C:\WINDOWS\system32&gt;&gt;&nbsp;</p>
<p>此问题也可以通过HDInsight中的action script来解决，使用脚本的方法安装MySQL Driver到目标目录。</p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-customize-cluster/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-customize-cluster/</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-script-actions/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-script-actions/</a></p>
<p>&nbsp;</p>
<p>本实践的完整PowerShell脚本如附件，Azure用户修改其中的（MySQL、Storage和HDInsight）参数既可应用。</p>
<p>&nbsp;</p>
<p>参考文档：</p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-use-sqoop/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-use-sqoop/</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/storage-powershell-guide-full/">https://azure.microsoft.com/en-us/documentation/articles/storage-powershell-guide-full/</a></p>
<p><a href="https://sqoop.apache.org/docs/1.4.4/SqoopUserGuide.html">https://sqoop.apache.org/docs/1.4.4/SqoopUserGuide.html</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-introduction/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-introduction/</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-use-blob-storage/">https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-use-blob-storage/</a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/64/27/68/sqoop-mysql-summary-3.2.ps1.txt" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-64-27-68/sqoop_2D00_mysql_2D00_summary_2D00_3.2.ps1.txt">sqoop-mysql-summary-3.2.ps1.txt</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Azure Batch 云的大计算服务 以Monte-Carlo实验为例</title>
      <link>https://docs.microsoft.com/archive/blogs/cciccat/azure-batch-monte-carlo</link>
      <pubDate>Fri, 18 Sep 2015 02:01:00 GMT</pubDate>
      <dc:creator><![CDATA[HerbChung]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cciccat/2015/09/18/azure-batch-monte-carlo/</guid>
      <description><![CDATA[很多使用者在谈到云的时候，都会想到使用云来弥补自己数据中心的不足。有些客户会把自己的活动网站放在云上以应付短期而大量的需求，有些客户使用现成的PaaS服务（如HDInsight）以减少准备及维护的时间...]]></description>
      <content:encoded><![CDATA[<p>很多使用者在谈到云的时候，都会想到使用云来弥补自己数据中心的不足。有些客户会把自己的活动网站放在云上以应付短期而大量的需求，有些客户使用现成的PaaS服务（如HDInsight）以减少准备及维护的时间。</p>
<p>回想看看，平常工作中是否有下列特性的作业：</p>
<ul>
<li>此项作业耗费大量时间</li>
<li>此项作业耗费大量处理器的资源</li>
<li>结果取决于运算的效率与品质</li>
</ul>
<p>在这个时候，Azure Batch很大程度上能够帮助你最佳化运算的效率并且节省你的成本。想像你原本只有一台服务器每周需要花十个小时的时间完成运算取出结果（当然你需要负担一周的成本），现在你只需要十分钟就能运用60台服务器取出结果（你只需要负担大约10服务器/小时的成本，是原本的1/24）。</p>
<p>下面是一些Azure Batch的典型场景：</p>
<ul>
<li>财务模型</li>
<li>影片与动画制作</li>
<li>基因工程</li>
<li>其他的软件工程运算</li>
</ul>
<p>在本文中将会介绍Azure Batch的运作原理，并以财务模型为例，介绍如何开发应用在Azure Batch上及相关的注意事项。</p>
<p>首先，Azure Batch的基本原则是平行计算，也就是我把一件大事情拆分成许多小事情，分给不同的服务器去做，所有人完成了，再把结果集成起来。因此，一个重要的先决条件在于应用程序是否能够很好的进行任务拆分，而拆分的结果是否存在critical path（其中的某个任务需要执行特别长的时间），都会影响到最后的表现。</p>
<p>下图首先说明Azure Batch的运作流程：</p>
<p>&nbsp;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2843.Batch%20Diagram.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2843.Batch-Diagram.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2843.Batch%20Diagram.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2843.Batch-Diagram.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<ol>
<li>首先需要上传所需的参考文件或来源文档（如.txt）。</li>
<li>接着上传执行用的应用程序（如.exe及.dll）。</li>
<li>Azure Batch会将这些数据放到资源池中的机器。</li>
<li>接着，Azure Batch将会根据收到的任务，分配给资源池中的机器。</li>
<li>过程中，Azure Batch或监控执行的状态决定是否分配新任务或结束工作。</li>
<li>当所有任务完成时，回传结果。</li>
</ol>
<p>在此我将会演示一个使用Monte-Carlo的财务模型，如何透过Azure Batch改善其表现。</p>
<p>Monto-Carlo是一种模拟的方式，透过产生大量的乱数样本去对模型进行验证，最终产生一个预测或结果。理论上，越多样本的情况下，产生的预测越准确。在复杂的财务模型中，将耗费很长的时间。</p>
<p>本次验证的范例来自QLNET（<a href="https://github.com/amaggiulli/qlnet">https://github.com/amaggiulli/qlnet</a>），一个基于.Net开发的财务模型库，而我基于其中的范例进行修改使其可运用Azure Batch所提供的运算资源。</p>
<p>本地运行结果如下，耗费了约8分钟的时间</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6886.Jobinlocal.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6886.Jobinlocal.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6886.Jobinlocal.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6886.Jobinlocal.png" alt="" border="0" /></a></p>
<p>检视其原始码，其中可发现一段基于Monto-Carlo的运算，占据大部分所耗费的时间：<br /><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4377.MCCode.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4377.MCCode.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4377.MCCode.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4377.MCCode.png" alt="" border="0" /></a>&nbsp;</p>
<p>这段程序主要做的事情在于透过Monte-Carlo将产生的327600个样本输入模型并进行处理得到最终的值。</p>
<p>这里我们的目的为在Azure Batch上产生20个Node（小型VM 1 core 1.7GB）帮助我们进行运算，拆分步骤如下：</p>
<ol>
<li>将程序进行拆分：在这边简单的将原先需要的327600个样本透过20个node来产生，也就是每个node各产生16380个样本。</li>
<li>创建Azure Batch资源池：</li>
</ol>
<p style="padding-left: 60px;">首先，需要先定义所需要使用的参数（当然你必须在Azure上先创建好Azure Batch及Blob Storage）</p>
<p style="padding-left: 60px;"><span style="color: #888888;">private const string BatchAccount = "";</span></p>
<p style="padding-left: 60px;"><span style="color: #888888;">private const string BatchKey = "";</span></p>
<p style="padding-left: 60px;"><span style="color: #888888;">private const string BatchRegion = "";</span></p>
<p style="padding-left: 60px;"><span style="color: #888888;">private const string BatchUrl = "";</span></p>
<p style="padding-left: 60px;"><span style="color: #888888;">private const string PoolId = "";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p style="padding-left: 60px;"><span style="color: #888888;">private const string StorageAccount = "";</span></p>
<p style="padding-left: 60px;"><span style="color: #888888;">private const string StorageKey = "";</span></p>
<p style="padding-left: 60px;"><span style="color: #888888;">private const string StorageBlobEndpoint = "";</span></p>
<p style="padding-left: 60px;"><span style="color: #888888;">private const int PoolNumber = 20;&nbsp;</span></p>
<p style="padding-left: 60px;"><span style="color: #888888;">private const int TaskNumber = 20;</span></p>
<p style="padding-left: 60px;">下面的程序码用于创建Azure Batch资源池，这边会先做一个检查是否已经有相同名称的资源池，同时加上一个重试的机制</p>
<p style="padding-left: 30px;">&nbsp;&nbsp;&nbsp;<span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BatchSharedKeyCredentials cred = new BatchSharedKeyCredentials(BatchUrl, BatchAccount, BatchKey);</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (BatchClient client = BatchClient.Open(cred))</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.CustomBehaviors.Add(RetryPolicyProvider.LinearRetryProvider(TimeSpan.FromSeconds(10), 3));</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool found = false;</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (CloudPool p in client.PoolOperations.ListPools(new ODATADetailLevel(selectClause: "id,currentDedicated")))</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (string.Equals(p.Id, PoolId))</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; found = true;</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p.CurrentDedicated == 0)</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("There are no compute nodes in this pool. No tasks will be run until at least one node has been added via resizing.");</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("Resizing pool to add 3 nodes. This might take a while...");</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.Resize(3);</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!found)</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloudPool pool = client.PoolOperations.CreatePool(PoolId, targetDedicated: PoolNumber, virtualMachineSize: "small", osFamily: "2");</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.Commit();</span></p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="padding-left: 30px;">3.&nbsp; 上传所需的应用程序，文件及相依元件：Azure Batch在这边的作法是把所需要的文件放在一个Blob Storage里面，然后再放到资源池中。</p>
<p style="padding-left: 30px;"><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;StagingStorageAccount stagingStorageAccount = new StagingStorageAccount( StorageAccount, StorageKey,&nbsp; StorageBlobEndpoint);</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string PMCexeName = "MCQMC45.exe";</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileToStage batchExe = new FileToStage(PMCexeName, stagingStorageAccount);</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileToStage batchDll = new FileToStage("QLNet.dll", stagingStorageAccount);</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值得注意的是，这边的MCQMC45.exe是将之前的程序改写产生的.exe档案。</p>
<p>&nbsp;</p>
<p style="padding-left: 30px;">4.&nbsp; 递交工作及任务给Azure Batch：首先计算每个node需要产生的sample数目，接着产生工作并将任务递交给Azure Batch，在任务中同时传递了执行的指令与参数。最后的部分则是一个等待的机制(包含20分钟的timeout设置)，等待所有的任务执行完成后，再进行接下来的部分。</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sampleremainder = nSamples % TaskNumber;</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int samplepertask = (nSamples - sampleremainder) / TaskNumber;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string JobID = "EquityOptionPMCCompute";</span></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloudJob unboundJob = client.JobOperations.CreateJob();</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unboundJob.Id = JobID;</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unboundJob.PoolInformation = new PoolInformation() { PoolId = PoolId};</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unboundJob.Commit();</span></p>
<p>&nbsp;</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;CloudTask&gt; tasksToRun = new List&lt;CloudTask&gt;(TaskNumber);</span></p>
<p>&nbsp;</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 1; i &lt;= TaskNumber; i++)</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloudTask task = new CloudTask("task_no_" + i, String.Format("{0} -task {1} ",</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PMCexeName,</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; samplepertask));</span></p>
<p>&nbsp;</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; task.FilesToStage = new List&lt;IFileStagingProvider&gt;</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;batchExe,</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; batchDll</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</span></p>
<p>&nbsp;</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tasksToRun.Add(task);</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConcurrentBag&lt;ConcurrentDictionary&lt;Type, IFileStagingArtifact&gt;&gt; fsArtifactBag = new ConcurrentBag&lt;ConcurrentDictionary&lt;Type, IFileStagingArtifact&gt;&gt;(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br /><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.JobOperations.AddTask(JobID, tasksToRun, fileStagingArtifacts: fsArtifactBag);</span></p>
<p>&nbsp;</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CloudJob job = client.JobOperations.GetJob(JobID);</span></p>
<p>&nbsp;</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPagedEnumerable&lt;CloudTask&gt; ourTasks = job.ListTasks(new ODATADetailLevel(selectClause: "id"));</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.Utilities.CreateTaskStateMonitor().WaitAll(ourTasks, TaskState.Completed, TimeSpan.FromMinutes(20));</span></p>
<p>&nbsp;</p>
<p style="padding-left: 30px;">5.&nbsp; 本地数据处理与分析：当所有任务都完成后，可以开始进行本地的数据分析处理。这里我简化了模型，简单的将数据加总后平均</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (CloudTask task in ourTasks)</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String Result = task.GetNodeFile(Constants.StandardOutFileName).ReadAsString();</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComputerResult += Convert.ToDecimal(Result);</span></p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="color: #888888;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Decimal PMCResult = ComputerResult / TaskNumber;</span></p>
<p>&nbsp;</p>
<p>在上述步骤完成后，就可以透过Azure Batch在较少的时间内完成原本的工作了。</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4555.JobinBatch.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4555.JobinBatch.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4555.JobinBatch.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4555.JobinBatch.png" alt="" border="0" /></a></p>
<p>另外，也可以透过Batch Explorer（<a href="https://blogs.technet.com/b/windowshpc/archive/2015/01/20/azure-batch-explorer-sample-walkthrough.aspx">https://blogs.technet.com/b/windowshpc/archive/2015/01/20/azure-batch-explorer-sample-walkthrough.aspx</a>）来监控执行的状况。这个工具将对Azure Batch进行监控，能让你随时掌握目前工作执行的状态及资源池的情况，同时可删除闲置的工作与资源池，是相当实用的工具。</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6215.BatchExplorer.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6215.BatchExplorer.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6215.BatchExplorer.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6215.BatchExplorer.png" alt="" border="0" /></a></p>
<p><span style="text-decoration: underline;">小结</span></p>
<p>Azure Batch是基于以前HPC (High Performance Compute)的基础上进行开发，已经是相当成熟的技术。透过Azure<br />Batch能够充分利用Azure上的资源，节省本地的运算及营运成本，同时提升运算的效率。在本文中做了一个基本的改写范例，希望透过这样的方式让大家能更熟悉对Azure<br />Batch的操作。</p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline;">参考文献</span></p>
<p>Azure Batch Documents: <a href="https://azure.microsoft.com/en-us/documentation/articles/batch-technical-overview/">https://azure.microsoft.com/en-us/documentation/articles/batch-technical-overview/</a></p>
<p>QLNET: <a href="https://github.com/amaggiulli/qlnet">https://github.com/amaggiulli/qlnet</a></p>
<p>Azure Batch Sample: <a href="https://github.com/Azure/azure-batch-samples">https://github.com/Azure/azure-batch-samples</a></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>在Windows Azure平台上运行PHP应用</title>
      <link>https://docs.microsoft.com/archive/blogs/cciccat/windows-azurephp</link>
      <pubDate>Tue, 18 Aug 2015 21:00:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cciccat/2015/08/18/windows-azurephp/</guid>
      <description><![CDATA[PHP技术在互联网应用中非常流行，被广泛使用在网站应用、报表管理、脚本任务等场景。Windows...]]></description>
      <content:encoded><![CDATA[<p align="left">PHP技术在互联网应用中非常流行，被广泛使用在网站应用、报表管理、脚本任务等场景。Windows Azure作为企业级公有云平台，不仅仅能无缝托管传统的微软开发技术（.Net），对于PHP、Java等业内通用的语言和技术也提供了极好的支持。本文就如何在Windows Azure平台上运行PHP应用总结出一些最佳实践和参考步骤。</p>
<p align="left">&nbsp;</p>
<p align="left"><strong>一、 选择合适的Windows Azure服务来运行PHP应用</strong></p>
<p align="left">Windows Azure提供不同层次的公有云服务，主要包括IaaS（基础设施即服务：以虚拟机、虚拟网络为代表），PaaS（平台即服务：以网站应用、云服务、数据库为代表）和SaaS（软件即服务：以Office 365，Azure活动目录为代表），其中可以用作托管PHP应用的主要有三类服务：</p>
<p align="left">-&nbsp; 虚拟机：用户在Azure中创建虚拟机，自行部署PHP环境并发布PHP应用，实践过程和在本地发布PHP服务一致。</p>
<p align="left">-&nbsp; 网站应用（Web App）：Azure后端存在大量已实现好PHP环境的服务器，用户只需将PHP应用代码通过Git、FTP等工具上传到目标服务器即可。</p>
<p align="left">-&nbsp; 云服务(Cloud Service)：Azure平台根据用户的设置，实时创建和定制化（一个或多个）虚拟机，自动安装用户指定的PHP环境并加载用户的PHP应用代码，实现PHP网站服务或者后台处理应用。</p>
<p align="left">关于这三种方案的不同点和相同点，可以参见：<a href="https://azure.microsoft.com/en-us/documentation/articles/choose-web-site-cloud-service-vm/">https://azure.microsoft.com/en-us/documentation/articles/choose-web-site-cloud-service-vm/</a>，总结下来，最突出的特点是：</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="222">
<p align="left">方案类型</p>
</td>
<td valign="top" width="222">
<p align="left">适用场景</p>
</td>
<td valign="top" width="222">
<p align="left">优点</p>
</td>
<td valign="top" width="222">
<p align="left">缺点</p>
</td>
</tr>
<tr>
<td valign="top" width="222">
<p align="left">虚拟机</p>
</td>
<td valign="top" width="222">
<p align="left">支持LAMP（另外两种场景下网站服务器都是<strong>IIS/Windows</strong>）；PHP应用依赖于手动安装的组件或应用。</p>
</td>
<td valign="top" width="222">
<p align="left">用户完全控制，和本地实践一样。</p>
<p align="left">&nbsp;</p>
</td>
<td valign="top" width="222">
<p align="left">手动部署，效率较低。</p>
</td>
</tr>
<tr>
<td valign="top" width="222">
<p align="left">网站应用</p>
</td>
<td valign="top" width="222">
<p align="left">快速部署，用户不需要更改服务器机器环境，较少自定义配置PHP网站服务器（拓展），默认的PHP环境包（如PHP5.4）可以满足应用需求。</p>
</td>
<td valign="top" width="222">
<p align="left">即时部署、迁移、更新，用户不关注服务器环境设置和后台维护。</p>
</td>
<td valign="top" width="222">
<p align="left">用户不能访问后台服务器。</p>
<p align="left">需要很多配置工作来使用自定义PHP运行环境或者深度修改后台网站服务器。</p>
<p align="left">&nbsp;</p>
</td>
</tr>
<tr>
<td valign="top" width="222">
<p align="left">云服务</p>
</td>
<td valign="top" width="222">
<p align="left">用户需要定制化的服务器环境或运行初始化任务。</p>
</td>
<td valign="top" width="222">
<p align="left">平衡部署效率和服务器定制化；支持访问后台服务器；支持同时托管多个网站或应用。</p>
</td>
<td valign="top" width="222">
<p align="left">部署效率不及网站应用，服务器可定制化程度不及虚拟机。</p>
</td>
</tr>
</tbody>
</table>
<p align="left">&nbsp;</p>
<p align="left">这三种方案的形象对比如下图：</p>
<p align="left"><br /> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0844.websites_cloudservices_vms_3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0844.websites_5F00_cloudservices_5F00_vms_5F00_3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0844.websites_cloudservices_vms_3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0844.websites_5F00_cloudservices_5F00_vms_5F00_3.png" alt="" border="0" /></a></p>
<p align="left">&nbsp;</p>
<p align="left"><strong>二、 在Windows Azure平台上运行PHP应用</strong></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="background-color: #ffff00;">1. 本地开发PHP应用</span></p>
<p><span style="background-color: #ffff00;">这一部分同传统的PHP应用开发完全一致，若迁移本地已有的PHP应用到Azure，可以跳过这一部分内容。</span></p>
<p align="left">l&nbsp;&nbsp; 安装PHP运行环境(<strong><em>Apache + PHP + MySQL</em></strong> 或者<strong>XAMPP</strong>)，XAMPP 提供一键式快速安装, 可参考: <a href="https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html#XAMPP">https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html#XAMPP</a></p>
<p align="left">l&nbsp;&nbsp; 安装PHP开发工具，如Eclipse，Zend Studio，PHPStorm等，也可以直接使用本地记事本（NotePad）。</p>
<p align="left">l&nbsp;&nbsp; 使用PHP开发工具或者记事本创建PHP网页面并写PHP代码。</p>
<p align="left">l&nbsp;&nbsp; 在PHP代码中调用依赖模块连接Cache、MySQL、MangoDB等服务（Cache、MySQL、MangoDB等可以是用户部署在公有云虚拟机或本地计算机中的服务，也可以是公有云直接提供的Redis Cache、MySQL PaaS等服务）.</p>
<p align="left">l&nbsp;&nbsp; (可选)根据实际需要，在PHP代码中连接Azure Storage。参考：<a href="https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/">https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/</a></p>
<p>&nbsp;</p>
<p>示例项目：</p>
<p>创建一个文件夹PHPTest1，按照<a href="https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/">https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/</a>提示，安装Azure Storage SDK（PHP），安装界面如下：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7140.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7140.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7140.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7140.2.png" alt="" border="0" /></a></p>
<p>安装完成后，添加两个PHP页面：test.php和mycomment.php。完整示例代码如附件（附件项目中已包含Azure Storage SDK），mycomment.php为一个简单的留言板页面，使用到了MySQL（存储留言内容）和Azure Storage（存储最后一次MySQL操作命令）。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7360.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7360.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7360.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7360.3.png" alt="" border="0" /></a></p>
<p>mycomment.php中用到的MySQL操作和Azure Storage操作代码如下：</p>
<p align="left">&nbsp;&nbsp;&nbsp; &lt;?php</p>
<p align="left">&nbsp;&nbsp;&nbsp; require_once 'vendor\autoload.php';</p>
<p align="left">&nbsp;&nbsp;&nbsp; use WindowsAzure\Common\ServicesBuilder;</p>
<p align="left">&nbsp;&nbsp;&nbsp; use WindowsAzure\Common\ServiceException;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp; $val = !empty($_POST["comment"]) ? $_POST["comment"] : null;</p>
<p align="left">&nbsp;&nbsp;&nbsp; if($val)</p>
<p align="left">&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $remarker= "Anonymous";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $retime = date('Y-m-d H:i:s');</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $link =<span style="background-color: #ffff00;"> mysql_connect</span>('42.159.191.201', 'mysqllogin', 'password');</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!$link) {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; die('Could not connect: ' . mysql_error());</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql_select_db('test', $link) or die('Could not select database.');</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sqlCmd = "insert into commenttable (username, words,timestamp, ipaddress) values ('$remarker','$val','$retime','$_SERVER[REMOTE_ADDR]')";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $res = <span style="background-color: #ffff00;">mysql_query</span>($sqlCmd, $link);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveAzureBlob($sqlCmd);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception $e) {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo 'Caught exception: ',&nbsp; $e-&gt;getMessage(), "\n";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;mysql_close($link);</p>
<p align="left">&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp; function <span style="background-color: #ffff00;">saveAzureBlob</span>($lastOperation)</p>
<p align="left">&nbsp;&nbsp;&nbsp; {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $connectionString = 'BlobEndpoint=https://jianwstorage.blob.core.chinacloudapi.cn/;QueueEndpoint=https://jianwstorage.queue.core.chinacloudapi.cn/;TableEndpoint=https://jianwstorage.table.core.chinacloudapi.cn/;AccountName=jianwstorage;AccountKey=I&times;7+&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;&times;J&times;&times;&times;g==';</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create blob REST proxy.</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$blobRestProxy = ServicesBuilder::getInstance()-&gt;createBlobService($connectionString);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $blob_name = "testblob";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $content = $lastOperation;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Upload blob</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $blobRestProxy-&gt;createBlockBlob("mylog", $blob_name, $content);</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ServiceException $e) {</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Handle exception based on error codes and messages.</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $code = $e-&gt;getCode();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$error_message = $e-&gt;getMessage();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo $code . ":" .$error_message . "&lt;br /&gt;";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; ?&gt;</p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;">2. 部署PHP应用到Azure虚拟机</span></p>
<p align="left">将PHP应用部署到Azure虚拟机和本地部署PHP应用完全一致。可以参照</p>
<p align="left"><a href="https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html">https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html</a></p>
<p align="left"><a href="https://www.xl7788.com/zt/web/platform/php_linux.html">https://www.xl7788.com/zt/web/platform/php_linux.html</a></p>
<p align="left">创建Azure虚拟机可以参考：</p>
<p align="left"><a href="https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-choices-create-vm/">https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-choices-create-vm/</a></p>
<p align="left">&nbsp;<br /><span style="background-color: #ffff00;">3. 部署PHP应用到Azure网站应用</span></p>
<p>将本地开发好的PHP网站部署到Azure网站应用非常便捷，如使用FileZilla工具，将本地PHP网站的全部内容上传到目标Azure网站应用对应的wwwroot目录下即可。如图：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/5633.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/5633.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/5633.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/5633.1.png" alt="" border="0" /></a></p>
<p>部署后的效果如下：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0535.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0535.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0535.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0535.3.png" alt="" border="0" /></a></p>
<p>更多详细的步骤参见：<a href="https://blogs.technet.com/b/sams_blog/archive/2014/11/14/azure-websites-deploy-php-website-using-ftp.aspx">https://blogs.technet.com/b/sams_blog/archive/2014/11/14/azure-websites-deploy-php-website-using-ftp.aspx</a></p>
<p>如需定制化默认的PHP环境，可以参考：</p>
<p><a href="https://blogs.msdn.com/b/cciccat/archive/2015/04/08/azure-websites-php-extension.aspx">https://blogs.msdn.com/b/cciccat/archive/2015/04/08/azure-websites-php-extension.aspx</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/web-sites-php-configure/">https://azure.microsoft.com/en-us/documentation/articles/web-sites-php-configure/</a></p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;">4. 部署PHP应用到Azure云服务</span></p>
<p>对于默认PHP环境够用（不需要其他拓展或定制化的配置）的PHP应用，使用网站应用比较便捷。但如果PHP应用需要使用用户定制的PHP环境和拓展，使用Azure云服务会更加灵活和高效。下面的步骤是如果将本地开发好的PHP应用及本地PHP环境（包含拓展）打包发布到Azure云服务。</p>
<p align="left">l&nbsp;&nbsp; 使用Azure PowerShell命令New-AzureServiceProject创建一个新的工程，并调用命令Add-AzurePHPWebRole创建一个PHP网站角色，调用Add-AzurePHPWorkerRole创建一个PHP后台处理角色（可选，网站应用一般不需要单独的后台处理模块），这些命令会生成一个项目模板，其中包括即将创建的云服务需要使用的虚拟机大小、虚拟机数量等等，用户可以手动更改或不做任何处理。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6557.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6557.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6557.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6557.3.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>创建远程连接用户名/密码用于将来登录云服务虚拟机（可选，发布后也可启用或更改）。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6685.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6685.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6685.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6685.1.png" alt="" border="0" /></a></p>
<p align="left">l&nbsp;&nbsp; 将本地开发好的PHP应用完整的复制到刚刚创建的PHP网站角色对应的文件夹中。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8546.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8546.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8546.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8546.2.png" alt="" border="0" /></a></p>
<p align="left">l&nbsp;&nbsp; 将本地开发机中的PHP安装环境（即本地PHP安装目录，包含php.exe, ext目录, lib目录等）完整复制到PHP网站角色对应目录下的Bin文件夹中。</p>
<p align="left">&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8867.3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8867.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8867.3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8867.3.png" alt="" border="0" /></a></p>
<p align="left">该PHP运行环境应该包含有用户自定义的所有拓展和配置。复制完成后，找到复制过来的php.ini文件，打开后更改extension_dir="C:\xampp\php\ext"为extension_dir="ext"。（C:\xampp\php\ext为笔者本地开发机中PHP环境的拓展所在目录，改为相对地址ext，以便云服务使用）</p>
<p align="left">&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/3480.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/3480.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/3480.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/3480.1.png" alt="" border="0" /></a></p>
<p align="left">&nbsp;</p>
<p align="left">l&nbsp;&nbsp; 找到PHP网站角色目录下bin文件夹中的文件<code>setup_web.cmd</code>，使用记事本打开，用以下命令覆盖原有内容，并保存。这些脚本命令的作用是在云服务虚拟机中加载前面复制过来的PHP运行环境。</p>
<p align="left"><span class="lit">@ECHO</span><span class="pln"> ON<br />cd </span><span class="str">"%~dp0"</span><span class="pln"><br /><br /></span><span class="kwd">if</span><span class="str">"%EMULATED%"</span><span class="pun">==</span><span class="str">"true"</span><span class="kwd">exit</span><span class="pun">/</span><span class="pln">b </span><span class="lit">0</span><span class="pln"><br /><br />msiexec </span><span class="pun">/</span><span class="pln">i sqlncli</span><span class="pun">.</span><span class="pln">msi </span><span class="pun">/</span><span class="pln">qn IACCEPTSQLNCLILICENSETERMS</span><span class="pun">=</span><span class="pln">YES<br /><br />SET PHP_FULL_PATH</span><span class="pun">=%~</span><span class="pln">dp0php\php</span><span class="pun">-</span><span class="pln">cgi</span><span class="pun">.</span><span class="pln">exe<br />SET NEW_PATH</span><span class="pun">=%</span><span class="pln">PATH</span><span class="pun">%;%</span><span class="typ">RoleRoot</span><span class="pun">%</span><span class="pln">\base\x</span><span class="lit">86</span><span class="pln"><br /><br /></span><span class="pun">%</span><span class="pln">WINDIR</span><span class="pun">%</span><span class="pln">\system32\inetsrv\appcmd</span><span class="pun">.</span><span class="pln">exe </span><span class="kwd">set</span><span class="pln"> config </span><span class="pun">-</span><span class="pln">section</span><span class="pun">:</span><span class="pln">system</span><span class="pun">.</span><span class="pln">webServer</span><span class="pun">/</span><span class="pln">fastCgi </span><span class="pun">/+</span><span class="str">"[fullPath='%PHP_FULL_PATH%',maxInstances='12',idleTimeout='60000',activityTimeout='3600',requestTimeout='60000',instanceMaxRequests='10000',protocol='NamedPipe',flushNamedPipe='False']"</span><span class="pun">/</span><span class="pln">commit</span><span class="pun">:</span><span class="pln">apphost<br /></span><span class="pun">%</span><span class="pln">WINDIR</span><span class="pun">%</span><span class="pln">\system32\inetsrv\appcmd</span><span class="pun">.</span><span class="pln">exe </span><span class="kwd">set</span><span class="pln"> config </span><span class="pun">-</span><span class="pln">section</span><span class="pun">:</span><span class="pln">system</span><span class="pun">.</span><span class="pln">webServer</span><span class="pun">/</span><span class="pln">fastCgi </span><span class="pun">/+</span><span class="str">"[fullPath='%PHP_FULL_PATH%'].environmentVariables.[name='PATH',value='%NEW_PATH%']"</span><span class="pun">/</span><span class="pln">commit</span><span class="pun">:</span><span class="pln">apphost<br /></span><span class="pun">%</span><span class="pln">WINDIR</span><span class="pun">%</span><span class="pln">\system32\inetsrv\appcmd</span><span class="pun">.</span><span class="pln">exe </span><span class="kwd">set</span><span class="pln"> config </span><span class="pun">-</span><span class="pln">section</span><span class="pun">:</span><span class="pln">system</span><span class="pun">.</span><span class="pln">webServer</span><span class="pun">/</span><span class="pln">fastCgi </span><span class="pun">/+</span><span class="str">"[fullPath='%PHP_FULL_PATH%'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']"</span><span class="pun">/</span><span class="pln">commit</span><span class="pun">:</span><span class="pln">apphost<br /></span><span class="pun">%</span><span class="pln">WINDIR</span><span class="pun">%</span><span class="pln">\system32\inetsrv\appcmd</span><span class="pun">.</span><span class="pln">exe </span><span class="kwd">set</span><span class="pln"> config </span><span class="pun">-</span><span class="pln">section</span><span class="pun">:</span><span class="pln">system</span><span class="pun">.</span><span class="pln">webServer</span><span class="pun">/</span><span class="pln">handlers </span><span class="pun">/+</span><span class="str">"[name='PHP',path='*.php',verb='GET,HEAD,POST',modules='FastCgiModule',scriptProcessor='%PHP_FULL_PATH%',resourceType='Either',requireAccess='Script']"</span><span class="pun">/</span><span class="pln">commit</span><span class="pun">:</span><span class="pln">apphost<br /></span><span class="pun">%</span><span class="pln">WINDIR</span><span class="pun">%</span><span class="pln">\system32\inetsrv\appcmd</span><span class="pun">.</span><span class="pln">exe </span><span class="kwd">set</span><span class="pln"> config </span><span class="pun">-</span><span class="pln">section</span><span class="pun">:</span><span class="pln">system</span><span class="pun">.</span><span class="pln">webServer</span><span class="pun">/</span><span class="pln">fastCgi </span><span class="pun">/</span><span class="str">"[fullPath='%PHP_FULL_PATH%'].queueLength:50000"</span></p>
<p align="left">&nbsp;</p>
<p align="left">l&nbsp;&nbsp; 通过PowerShell命令Publish-AzureServiceProject -ServiceName [目标云服务名称] -StorageAccountName [使用的Azure Storage名称] -Slot [测试环境或生产环境]即可将PHP应用发布到云服务。（其中使用的云服务和存储账号需要提前准备）</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0882.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0882.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0882.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0882.2.png" alt="" border="0" /></a></p>
<p>发布完成后即可查看运行在云服务中的PHP网站应用。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4428.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4428.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4428.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4428.1.png" alt="" border="0" /></a></p>
<p align="left"><strong>三、 小结</strong></p>
<p align="left">Windows Azure对于PHP应用提供了与本地完全一致的运行环境，用户可以根据实际场景，选择合适的Azure服务，快速部署自定义的PHP应用。</p>
<p align="left">Azure虚拟机：手动定制PHP环境和应用实践。</p>
<p align="left">Azure网站应用：快速部署PHP应用到公有云平台。</p>
<p align="left">Azure云服务：使用自定义的PHP环境托管运行PHP应用。</p>
<p align="left">&nbsp;</p>
<p align="left">参考内容：</p>
<p><a href="https://www.apachefriends.org/download.html">https://www.apachefriends.org/download.html</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/">https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/</a></p>
<p><a href="https://azure.microsoft.com/en-us/documentation/articles/cloud-services-php-create-web-role/">https://azure.microsoft.com/en-us/documentation/articles/cloud-services-php-create-web-role/</a></p>
<p><a href="https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html#XAMPP">https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html#XAMPP</a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/63/61/48/PHPTest1-Share.zip" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-63-61-48/PHPTest1_2D00_Share.zip">PHPTest1-Share.zip</a></p>]]></content:encoded>
    </item>
    <item>
      <title>用iPhone和Wirecast在Azure媒体服务上进行直播</title>
      <link>https://docs.microsoft.com/archive/blogs/cciccat/iphonewirecastazure</link>
      <pubDate>Tue, 07 Jul 2015 00:51:00 GMT</pubDate>
      <dc:creator><![CDATA[Shirley_Wang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cciccat/2015/07/07/iphonewirecastazure/</guid>
      <description><![CDATA[本文详细介绍如何使用iPhone和Wirecast在Azure云端进行直播。
&nbsp;
1. 首先，您需要在iPhone上安装"Wirecast...]]></description>
      <content:encoded><![CDATA[<p>本文详细介绍如何使用iPhone和Wirecast在Azure云端进行直播。</p>
<p>&nbsp;</p>
<p>1. 首先，您需要在iPhone上安装"Wirecast Cam"。它是AppStore中的一个免费应用。<a href="https://itunes.apple.com/us/app/wirecast-cam/id922654616?mt=8" target="_blank">https://itunes.apple.com/us/app/wirecast-cam/id922654616?mt=8</a>&nbsp;它将在直播中被用做摄像设备。</p>
<p>2. 在电脑上安装Wirecast 6.0以上版本。您可以在这里(<a href="https://www.telestream.net/wirecast/overview.htm" target="_blank">https://www.telestream.net/wirecast/overview.htm</a>)下载试用版，或者购买商业版本。如果您使用试用版，在直播的图像中会有"wirecast"字样的水印。</p>
<p>3. 在Azure云端，创建好&ldquo;频道&rdquo;。</p>
<p><img src="https://img.blog.csdn.net/20150707151814439?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p>
<p>&nbsp;</p>
<p>准备工作已经就绪，下面我们开始配置直播环境。</p>
<p>1. 将iPhone和安装了Wirecast 6.0的电脑放在一个WIFI环境中。打开iPhone的Wirecast Cam, 点击&ldquo;设置&rdquo;，得到IP地址。</p>
<p><img src="https://img.blog.csdn.net/20150707152320341?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p>
<p>2. 在电脑的Wirecast上添加Video Source。点击"Source" -&gt; "Add Wirecast Cam".</p>
<p><img src="https://img.blog.csdn.net/20150707152638873?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p>
<p>在打开的窗口中，输入iPhone上显示的IP地址。</p>
<p><img src="https://img.blog.csdn.net/20150707152716822?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p>
<p><span style="color: #3333ff;"><strong>注意：这时点击"Connect"不会有任何反应。你需要首先点击iPhone上的红色录制按钮，然后再在电脑上点击"connect"。如下图所示:</strong></span></p>
<p><img src="https://img.blog.csdn.net/20150707153139342?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p>
<p>这时你可以看到Wirecast和手机的录制屏幕一致。</p>
<p><img src="https://img.blog.csdn.net/20150707153531104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p>
<p>3. 这时，Wirecast会把iPhone作为视频和音频的输入设备。有时，我们需要配置其他的音频源。例如，在直播现场活动的时候，我们需要把演讲者的声音作为唯一的音频源，而不希望把现场的嘈杂传递给收看者。这时，我们可以在Wirecast中添加新的音频设备。</p>
<p><img src="https://img.blog.csdn.net/20150707154133238?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p>
<p>这时，我们的直播已经配置完成。可以通过Azure管理门户来preview直播视频了。</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8228.video_audio.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8228.video_5F00_audio.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8228.video_audio.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8228.video_5F00_audio.png" alt="" border="0" /></a></p>
<p>对于互联网用户，他们将使用Azure管理门户提供的&ldquo;发布URL&rdquo;进行观看。</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0044.channel_on_azure_2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0044.channel_5F00_on_5F00_azure_5F00_2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0044.channel_on_azure_2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0044.channel_5F00_on_5F00_azure_5F00_2.png" alt="" border="0" /></a></p>
<p>用户可以使用任何支持Smooth Streaming或HLS或DASH的播放器收看。Azure提供了一个基于HTML5实现的Azure Media Player (<a href="https://amsplayer.azurewebsites.net/azuremediaplayer.html" target="_blank">https://amsplayer.azurewebsites.net/azuremediaplayer.html</a>&nbsp;)，用户只需将发布URL输入，即可在浏览器中观看直播。</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1258.azure_player.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1258.azure_5F00_player.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1258.azure_player.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1258.azure_5F00_player.png" alt="" border="0" /></a></p>]]></content:encoded>
    </item>
    <item>
      <title>修改域密码后对Windows Azure Pack 的影响和解决办法（虚拟机云）</title>
      <link>https://docs.microsoft.com/archive/blogs/cciccat/windows-azure-pack</link>
      <pubDate>Sat, 04 Jul 2015 00:02:00 GMT</pubDate>
      <dc:creator><![CDATA[Baichuan Wang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cciccat/2015/07/04/windows-azure-pack/</guid>
      <description><![CDATA[在Windows Azure Pack...]]></description>
      <content:encoded><![CDATA[<p>在Windows Azure Pack （后简称WAP）的实际使用场景中我们无法避免的会遇到各种密码到期需要更改的情况。而在WAP的环境中又有许多的组件都依赖于域密码，那么究竟改动一次密码后会有多大影响我们来做一个测试。</p>
<p>&nbsp;</p>
<p>在我的测试环境中我使用BC-TEST\WAPadmin作为所有组件的管理员密码（包括：Admin Site ; SCVMM ; SPF ; Automation；SQL）</p>
<p>在确保Windows Azure Pack 当前运行状态正常的前提下，我将WAPadmin的密码更改．（如下图）</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1325.wap1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1325.wap1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1325.wap1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1325.wap1.png" alt="" width="243" height="127" border="0" /></a></p>
<p><span style="font-family: 等线; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">之后我再次登录和检查了WAP admin site , SCVMM admin Console ,SQL server都可以正常登录和使用，由此可见大部分的组件是支持和DC同步密码的。</span></p>
<p>而问题主要出现在Automation（自动化） 组件上有报错。（如下图）尝试在Admin Site直接更改Automation信息时会发现：Automation 组件无法选择而通过VM 云进入的Automation 注册界面为灰色无法更改。</p>
<p><span style="font-family: 等线; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8037.wap2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8037.wap2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8037.wap2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8037.wap2.png" alt="" width="140" height="100" border="0" /></a><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6330.wap3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6330.wap3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/6330.wap3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/6330.wap3.png" alt="" width="165" height="106" border="0" /></a></span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 等线; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">解决方法</span></strong></p>
<p>我们需要强制移除当前SMA(Service Management Automation)的信息，并再将它重新注册到Admin Site 内。</p>
<p>参照博客 <a href="https://kristiannese.blogspot.no/2014/01/troubleshooting-windows-azure-pack-re.html">https://kristiannese.blogspot.no/2014/01/troubleshooting-windows-azure-pack-re.html</a> 我们可以在WAP服务器运行下列几步Power Shell 命令来解决这个问题：</p>
<p>&nbsp;</p>
<p><span style="font-family: 等线; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">1.&nbsp;&nbsp;&nbsp; </span>$Credential = Get-Credential&nbsp;&nbsp; （输入后会弹出需要输入当前管理员帐号密码的需求，如下图）</p>
<p><strong><span style="font-family: 等线; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1538.wap4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1538.wap4.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1538.wap4.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1538.wap4.png" alt="" border="0" /></a></span></strong></p>
<p><span style="font-family: 等线; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">2. </span>$Token = Get-MgmtSvcToken -Type Windows -AuthenticationSite <span style="color: red; font-family: 等线; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;" lang="EN-US">https://</span><span style="color: red; font-family: 等线; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">请输入当前<span lang="EN-US">WAP portal </span>的地址<span lang="EN-US">:30072</span></span> -ClientRealm <a href="https://azureservices/AdminSite">https://azureservices/AdminSite</a> -User $Credential -DisableCertificateValidation&nbsp;&nbsp;&nbsp;</p>
<p><span style="font-family: 等线; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">&nbsp;&nbsp;&nbsp; Get-MgmtSvcResourceProvider -AdminUri <span style="font-family: 等线; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;" lang="EN-US">"https://localhost:30004"</span>-Token $Token -DisableCertificateValidation -name "Automation"&nbsp;&nbsp; </span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 命令执行成功后请记录下图中的Instance ID 用于下一条命令</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8741.wap5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8741.wap5.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/8741.wap5.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/8741.wap5.png" alt="" border="0" /></a></p>
<p>3.&nbsp;Remove-MgmtSvcResourceProvider -AdminUri "https://localhost:30004" -Token $Token -DisableCertificateValidation -Name "Automation" -InstanceId "将上条命令中得到的Instance ID 填入此"</p>
<p>&nbsp;&nbsp; 命令成功执行后按照提示（如下图）选择 Y 之后即可成功移除SMA组件</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2671.wappp.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2671.wappp.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2671.wappp.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2671.wappp.png" alt="" border="0" /></a></p>
<p>之后我们回到WAP的 Admin Site 检查状态，可以看到Automation的红色惊叹号报错已经消失，并出现了可以注册新的SMA终结点的选项。</p>
<p>&nbsp;&nbsp; <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0724.wap7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0724.wap7.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0724.wap7.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0724.wap7.png" alt="" width="386" height="153" border="0" /></a></p>
<p>5. 重新注册并输入新的密码之后故障排除。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>如何使用Java程序通过JDBC访问HDInsight Hive Server</title>
      <link>https://docs.microsoft.com/archive/blogs/cciccat/javajdbchdinsight-hive-server</link>
      <pubDate>Fri, 05 Jun 2015 03:21:00 GMT</pubDate>
      <dc:creator><![CDATA[Amber Zhao]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cciccat/2015/06/05/javajdbchdinsight-hive-server/</guid>
      <description><![CDATA[很多用户在使用HDInsight的时候，需要Java客户端访问群集的Hive Server语句、或者提交作业，在Azure的门户已经提供了使用ODBC访问Hive...]]></description>
      <content:encoded><![CDATA[<p>很多用户在使用HDInsight的时候，需要Java客户端访问群集的Hive Server语句、或者提交作业，在Azure的门户已经提供了使用ODBC访问Hive Server的方式（<a href="https://azure.microsoft.com/en-us/documentation/articles/hdinsight-connect-excel-hive-odbc-driver/">海外环境配置ODBC链接</a>，<a href="https://www.windowsazure.cn/documentation/articles/hdinsight-connect-excel-hive-ODBC-driver/?fb=002">中国环境配置ODBC链接</a>），本文主要介绍如何让Java程序通过JDBC访问HDInsight Hive Server。</p>
<p>首先需要注意的是，从安全的角度，HDInsight会使用SSL安全连接，监听443端口，如下为一个示例连接字符串：</p>
<pre class="scroll"><code class="js">jdbc:hive2://<em>myclustername</em>.<span style="background-color: #ffff00;">azurehdinsight.net:443</span>/default;ssl=true?hive.server2.transport.mode=http;hive.server2.thrift.http.path=/hive2<br />jdbc:hive2://<em>myclustername</em>.<span style="background-color: #ffff00;">azurehdinsight.cn:443</span>/default;ssl=true?hive.server2.transport.mode=http;hive.server2.thrift.http.path=/hive2</code></pre>
<pre class="scroll"><code class="js"></code>&nbsp;</pre>
<p>如下步骤为一个以Maven项目为例的访问Hive Server的示例：</p>
<p>1. 假定已经安装好Eclipse和Maven，为了获取Maven的项目模板，请执行如下命令：</p>
<p><code class="js">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mvn archetype:generate -DgroupId=com.microsoft.css -DartifactId=HiveJdbcTest -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false </code></p>
<p>2. 修改POM.XML：默认的POM文件，并不包含HDInsight所需的Jar依赖文件，请手动添加以下依赖。</p>
<pre class="scroll"><code class="js">&lt;dependencies&gt;<br /> &lt;dependency&gt;<br /> &lt;groupId&gt;junit&lt;/groupId&gt;<br /> &lt;artifactId&gt;junit&lt;/artifactId&gt;<br /> &lt;version&gt;3.8.1&lt;/version&gt;<br /> &lt;scope&gt;test&lt;/scope&gt;<br /> &lt;/dependency&gt;<br /> &lt;dependency&gt;<br /> &lt;groupId&gt;jdk.tools&lt;/groupId&gt;<br /> &lt;artifactId&gt;jdk.tools&lt;/artifactId&gt;<br /> &lt;version&gt;1.8&lt;/version&gt;<br /> &lt;scope&gt;system&lt;/scope&gt;<br /> &lt;systemPath&gt;${JAVA_HOME}/lib/tools.jar&lt;/systemPath&gt;<br /> &lt;/dependency&gt;<br /> &lt;dependency&gt;<br /> &lt;groupId&gt;org.apache.hive&lt;/groupId&gt;<br /> &lt;artifactId&gt;hive-jdbc&lt;/artifactId&gt;<br /> &lt;version&gt;0.14.0&lt;/version&gt;<br /> &lt;/dependency&gt;<br /> &lt;dependency&gt;<br /> &lt;groupId&gt;org.apache.hive&lt;/groupId&gt;<br /> &lt;artifactId&gt;hive-exec&lt;/artifactId&gt;<br /> &lt;version&gt;0.14.0&lt;/version&gt;<br /> &lt;/dependency&gt;<br /> &lt;dependency&gt;<br /> &lt;groupId&gt;org.apache.calcite&lt;/groupId&gt;<br /> &lt;artifactId&gt;calcite-avatica&lt;/artifactId&gt;<br /> &lt;version&gt;0.9.2-incubating&lt;/version&gt;<br /> &lt;/dependency&gt;<br /> &lt;dependency&gt;<br /> &lt;groupId&gt;org.apache.calcite&lt;/groupId&gt;<br /> &lt;artifactId&gt;calcite-core&lt;/artifactId&gt;<br /> &lt;version&gt;0.9.2-incubating&lt;/version&gt;<br /> &lt;/dependency&gt;<br /> &lt;dependency&gt;<br /> &lt;groupId&gt;org.apache.hadoop&lt;/groupId&gt;<br /> &lt;artifactId&gt;hadoop-common&lt;/artifactId&gt;<br /> &lt;version&gt;2.2.0&lt;/version&gt;<br /> &lt;/dependency&gt;<br /> &lt;/dependencies&gt;</code></pre>
<pre class="scroll"><code class="js"></code>&nbsp;</pre>
<pre class="scroll"><code class="js">3.</code>Java代码访问HDInsight的示例Hive Table代码如下：</pre>
<pre class="scroll"><code class="js">package HiveTest2.MyJDBCTest;<br /> import java.sql.*;<br /> <br /> public class App {<br /> <br /> <br /> public static void main(String[] args) throws SQLException {<br /> <br /> Connection conn=null;<br /> Statement stmt = null;<br /> ResultSet res = null;<br /> <br /> try<br /> <br /> {<br /> <br /> Class.forName("org.apache.hive.jdbc.HiveDriver");<br /> //Note that HDInsight uses port 443 for SSL secure connections, and the port forwarder listening to 443<br /> // will direct it to the hiveserver2 from there on port 10001.<br /> String connectionQuery = "jdbc:hive2://HDInclusterName.azurehdinsight.net:443/default;ssl=true?hive.server2.transport.mode=http;hive.server2.thrift.http.path=/hive2";<br /> <br /> conn = DriverManager.getConnection(connectionQuery,"HDIClusterUserName","HDIUserPassword");<br /> stmt = conn.createStatement();<br /> <br /> String sql =null;<br /> <br /> sql = "Select * from hivesampletable LIMIT 3";<br /> System.out.println("Running: " + sql);<br /> <br /> res = stmt.executeQuery(sql);<br /> <br /> while (res.next()) {<br /> System.out.println( res.getString(1) + "\t" + res.getString(2) + "\t" + res.getString(3) + "\t" + res.getString(4) + "\t" + res.getString(5) + "\t" + res.getString(6));<br /> }<br /> <br /> <br /> System.out.println("Hive queries completed successfully!");<br /> <br /> <br /> }<br /> catch (SQLException e )<br /> {<br /> e.getMessage();<br /> e.printStackTrace();<br /> System.exit(1);//<br /> }<br /> catch(Exception ex)<br /> {<br /> ex.getMessage();<br /> ex.printStackTrace();<br /> System.exit(1);//<br /> <br /> }<br /> finally {<br /> if (res!=null) res.close();<br /> if (stmt!=null) stmt.close();<br /> }<br /> <br /> }<br /> <br /> }<br />&nbsp;4.</code>如下为调用以上代码，成功查询海外Azure和中国Azure的HiveServer的结果：</pre>
<pre class="scroll"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4527.publicazure.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4527.publicazure.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4527.publicazure.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4527.publicazure.png" alt="" border="0" /></a> </pre>
<pre class="scroll"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2475.Mooncake.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2475.Mooncake.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2475.Mooncake.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2475.Mooncake.png" alt="" border="0" /></a> </pre>
<p>&nbsp;</p>
<p>请注意，针对于中国的Azure，请使用OpenJDK, 如Azul JDK，具体方法如下：</p>
<p>1. 从如下地址下载Azul JDK，（针对于Windows环境，，请选择&ldquo;Windows and Microsoft Azure&rdquo;目录下的安装文件）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://www.azulsystems.com/products/zulu/downloads#Windows">https://www.azulsystems.com/products/zulu/downloads#Windows</a></p>
<p>2. 针对于Eclipse开发环境，请从如下路径引用Azul JDK</p>
<p>&nbsp;&nbsp;&nbsp; Eclipse-&gt;Windows-&gt;Preferences-&gt;Java-&gt;Installed&nbsp;JREs&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2438.Azul1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2438.Azul1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2438.Azul1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2438.Azul1.png" alt="" border="0" /></a></p>
<p>&nbsp;&nbsp;&nbsp; 若Zulu文件包未显示，请跳转到如下路径，搜索该JRE文件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4812.Azul2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4812.Azul2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/4812.Azul2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/4812.Azul2.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 点击如下附件，获取整个Java Maven示例代码。</p>
<p>&nbsp;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/61/98/34/HiveTest.zip" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-61-98-34/HiveTest.zip">HiveTest.zip</a></p>]]></content:encoded>
    </item>
    <item>
      <title>快速创建、启动Azure虚拟机(群)</title>
      <link>https://docs.microsoft.com/archive/blogs/cciccat/azure</link>
      <pubDate>Mon, 01 Jun 2015 22:40:00 GMT</pubDate>
      <dc:creator><![CDATA[JIAN WU - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cciccat/2015/06/01/azure/</guid>
      <description><![CDATA[&nbsp;
在使用Azure Virtual Machine过程中，用户常常会遇到以下需求：
l&nbsp; 在同一个托管服务（Cloud...]]></description>
      <content:encoded><![CDATA[<p>&nbsp;</p>
<p>在使用Azure Virtual Machine过程中，用户常常会遇到以下需求：</p>
<p>l&nbsp; 在同一个托管服务（Cloud Service）下，快速创建多个虚拟机。</p>
<p>l&nbsp; 快速启动同一个托管服务下多个已有的虚拟机。</p>
<p>由于这些虚拟机从属于同一个托管服务，共用托管服务所对应的网络配置和负载映射等，因此在同时创建或者同时启动多个虚拟机的操作中，用户容易遇到以下问题：</p>
<p><br />&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2086.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2086.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/2086.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/2086.1.png" alt="" border="0" /></a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/5241.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/5241.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/5241.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/5241.2.png" alt="" border="0" /></a></p>
<p>产生这个问题的原因是：在第一台虚拟机启动初期，Azure后端尚在分配共用资源（如局域网IP）给第一台虚拟机，需要对托管服务独占式访问操作，第二台虚拟机需要在第一台虚拟机成功获取共有资源之后才能开始启动过程。</p>
<p>&nbsp;</p>
<p>对于快速创建或启动同一托管服务下的多个虚拟机，本博文介绍一些常见的实施方法和优化步骤。</p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;">1. 了解虚拟机的创建过程和创建方法</span></p>
<p>Azure后端（Fabric）根据用户需求（虚拟机配置、网络设定等）在Azure数据中心内创建目标虚拟机，主要包括以下过程：</p>
<p>l&nbsp; 在目标数据中心内找到合适的硬件资源，用于创建虚拟机。</p>
<p>l&nbsp; Azure后端复制目标OS镜像至用户的存储账号（或使用用户预备存储在Azure Storage中的镜像）</p>
<p>l&nbsp; Azure后端安装虚拟机，启动操作系统。</p>
<p>l&nbsp; Azure后端配置虚拟机的网络设置等。</p>
<p>l&nbsp; Azure后端配置虚拟机的对外服务设置（VIP、Endpoint等）</p>
<p>&nbsp;</p>
<p>因此，一个虚拟机的创建过程往往需要数分钟才能彻底完成。对于Azure用户而言，创建虚拟机的主要方法包括以下三种：</p>
<p>A． 使用管理主页（如<a href="https://manage.windowsazure.cn">https://manage.windowsazure.cn</a>）</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0825.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0825.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0825.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0825.1.png" alt="" border="0" /></a></p>
<p>B． 使用Azure PowerShell命令，如</p>
<p>NAME ：&nbsp; New-AzureVM</p>
<p>SYNOPSIS&nbsp; ：&nbsp;&nbsp;&nbsp; Creates a new Microsoft Azure virtual machine.</p>
<p>&nbsp;<br />--------------------------&nbsp; EXAMPLE 1&nbsp; --------------------------</p>
<p>&nbsp;&nbsp;&nbsp; PS C:\&gt; New-AzureVMConfig -Name "MyNewVM" -InstanceSize ExtraSmall -ImageName (Get-AzureVMImage)[4].ImageName `</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Add-AzureProvisioningConfig -Windows -Password $adminPassword -AdminUsername PsTestAdmin`</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | New-AzureVM -ServiceName "MySvc2" -AffinityGroup "Contoso" -WaitForBoot</p>
<p>&nbsp;&nbsp;&nbsp;<br />--------------------------&nbsp; EXAMPLE 2&nbsp; --------------------------</p>
<p>&nbsp;&nbsp;&nbsp; PS C:\&gt; New-AzureVMConfig -Name "MySUSEVM2" -InstanceSize ExtraSmall -ImageName (Get-AzureVMImage)[7].ImageName `</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Add-AzureProvisioningConfig -Linux -LinuxUser $lxUser -Password $adminPassword -AdminUsername PsTestAdmin | New-AzureVM</p>
<p>&nbsp;&nbsp;&nbsp;</p>
<p>--------------------------&nbsp; EXAMPLE 3&nbsp; --------------------------</p>
<p>&nbsp;&nbsp;&nbsp; PS C:\&gt; $Images = Get-AzureVMImage</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $myImage = $Images[4]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $myVM = New-AzureVMConfig -Name "MyVM2" -InstanceSize ExtraSmall -ImageName $myImage.ImageName `</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Add-AzureProvisioningConfig -Windows -Password $adminPassword `</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -DiskLabel "DataDisk50" -LUN 0</p>
<p><br />--------------------------&nbsp; EXAMPLE 4&nbsp; --------------------------</p>
<p>&nbsp;&nbsp;&nbsp; PS C:\&gt; New-AzureVMConfig -Name "MyNewVM" -InstanceSize ExtraSmall -ImageName (Get-AzureVMImage)[4].ImageName `</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Add-AzureProvisioningConfig -Windows -Password $adminPassword -AdminUsername PsTestAdmin`</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | New-AzureVM -ServiceName "MySvc2" -AffinityGroup "Contoso" -ReservedIPName $ipName</p>
<p>&nbsp;</p>
<p>C． 使用REST API：<a href="https://msdn.microsoft.com/en-us/library/azure/jj157194.aspx">https://msdn.microsoft.com/en-us/library/azure/jj157194.aspx</a>， 用户可以使用习惯的开发语言（如C#, Java, PHP, &hellip;）调用此API创建虚拟机。</p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;">2. 快速创建多个虚拟机</span></p>
<p>深入使用Azure PowerShell，用户可以实现一些定制化功能的批量操作，如下示例方法，</p>
<p>$imageName="yourimageName"</p>
<p>$affinityGroup="yourAffinityGroupName"</p>
<p>$serviceName="yourServiceName"</p>
<p>$linuxUser="yourUsername "</p>
<p>$password="yourPassword"</p>
<p>$instanceSize="Medium"</p>
<p>$vnetName="yourVNetName"</p>
<p>$subnetName="Subnet-1"</p>
<p>$VMList=@()</p>
<p>for($i=2; $i -le 50; $i++)</p>
<p>{</p>
<p>$prefix="testVM"</p>
<p>$newName=$prefix+"{0:0}" -f $i</p>
<p>$VM=New-AzureVMConfig -Name $newName -InstanceSize<br />$instanceSize -ImageName $imageName | Add-AzureProvisioningConfig -Linux -LinuxUser<br />$linuxUser -Password $password | Add-AzureEndpoint -Protocol tcp -LocalPort 80<br />-PublicPort 80 -Name 'web' -LBSetName 'lbweb' -ProbePort 80 -ProbeProtocol http<br />-ProbePath '/'</p>
<p>Set-AzureSubnet -VM $VM -SubnetNames $subnetName</p>
<p>$VMlist += $VM</p>
<p>}</p>
<p>New-AzureVM -VMs $VMlist -ServiceName " yourServiceName" -VNetName $vnetName</p>
<p>在创建虚拟机过程中，可能会由于用户虚拟机的配置（如部分Linux中用户行为分析模块NUBA不支持8GB以上的内存）或者Azure后端资源池的分布差异，同样的脚本在创建更多的虚拟机时会持续失败。因此，Azure用户需要在创建虚拟机过程中考虑以下几点：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />I.&nbsp;&nbsp;&nbsp;&nbsp;不同的数据中心即时可用的虚拟机型号很可能不同</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1440.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1440.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/1440.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/1440.2.png" alt="" border="0" /></a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; II.&nbsp;&nbsp;如创建虚拟机过程中反复失败且收到&ldquo;internal server error&rdquo;等信息，可以考虑在脚本中切换虚拟机型号再进行创建，创建完成之后，调整虚拟机大小到目标型号。</p>
<p>&nbsp;&nbsp;&nbsp; III.&nbsp;&nbsp;&nbsp;创建虚拟机时，所有可用的虚拟机型号都可以选用，但一旦虚拟机创建成功后，虚拟机向上向下可调整的型号是有限的，如下图，A1型号的虚拟机创建成功后不支持直接升级到D14. 因此Azure用户需要根据将来虚拟机可能变化的范围合理选择初次创建时候的虚拟机大小。</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7115.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7115.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7115.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7115.1.png" alt="" border="0" /></a></p>
<p><span style="background-color: #ffff00;">3. 虚拟机停止状态</span></p>
<p>Azure Virtual Machine存在两种停止状态：stopped (deallocated)<br />和 stopped，如图：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7522.2.gif" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7522.2.gif"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7522.2.gif" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7522.2.gif" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>l&nbsp;&nbsp; Stopped (Deallocated)：用户通过Azure管理主页、PowerShell或者REST请求关闭（shutdown）目标虚拟机后，虚拟机将会进入该状态（已下架），即表示在Azure后端，目标虚拟机已经被释放，虚拟机镜像存储在Azure Storage中，虚拟机占用的Cloud Service资源如IP、端口等都被回收。因此，该状态下的虚拟机不产生Compute费用。 (更多信息: <a href="https://msdn.microsoft.com/en-us/library/azure/dn763934.aspx#BKMK_Dealloc">https://msdn.microsoft.com/en-us/library/azure/dn763934.aspx#BKMK_Dealloc</a>)</p>
<p>l&nbsp;&nbsp; Stopped：当用户远程连接到虚拟机并从虚拟机内部关闭虚拟机后，虚拟机将进入该状态，此时目标虚拟机在Azure后端依然存在，内部IP、外部端口等Cloud<br />Service资源依然被占用，只是OS处于shutdown的状态，因此处于Stopped状态的虚拟机会产生Compute费用。该状态也有可能会由于虚拟机内部程序导致，如虚拟机内部的某个程序关闭了虚拟机。<br />(更多信息: <a href="https://msdn.microsoft.com/en-us/library/azure/dn763934.aspx#BKMK_Stop">https://msdn.microsoft.com/en-us/library/azure/dn763934.aspx#BKMK_Stop</a>)</p>
<p>处于stopped (deallocated)状态的虚拟机被重新启动时，将会执行虚拟机创建过程中的大部分步骤（如上），而处于stopped状态的虚拟机被重新启动时，主要的过程是OS的重启。</p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;">4. 快速启动多个虚拟机（同一个托管服务下）</span></p>
<p>由于同一托管服务下的多个虚拟机共用网络配置、负载映射等，处于stopped (deallocated)状态的虚拟机被重启时，将会对目标托管服务进行短暂的独占式访问，如下</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0842.1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0842.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/0842.1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/0842.1.png" alt="" border="0" /></a></p>
<p>因此，同时启动同一托管服务下的多个虚拟机，会出现上图中的独占访问异常。由于单个虚拟机启动通常需要2~5分钟，若通过portal逐一启动多个虚拟机（如20个），将会耗时较长。解决这一问题的方法主要有两种：</p>
<p>A． 逐一迅速启动虚拟机，待第一台虚拟机启动初期完成之后（而不是等待虚拟机彻底启动完成），迅速启动第二台虚拟机。（该过程需要通过脚本实现，结合Start-AzureVM、Get-AzureVM、循环控制等命令来第一时间启动后续的虚拟机）</p>
<p>B． 通过操作托管服务来启动所有的虚拟机，如通过Azure管理主页实现（<strong>management portal&nbsp; 》</strong><strong>&nbsp;cloud services&nbsp;》</strong><strong> target cloud service (which contains<br />target VMs in stopped(de-allocated)</strong><strong>)&nbsp;》</strong><strong> dashboard tab&nbsp;》</strong><strong> start button in the bottom&nbsp;》</strong><strong> click the start.</strong>），该操作过程中，Azure后端负责控制多个虚拟机间的启动次序和即时性，最大限度的保证快速启动。</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7077.2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7077.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/64/69/7077.2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-64-69/7077.2.png" alt="" border="0" /></a></p>
<p>上述方案B也可以通过Azure Powershell或者REST API实现，请参考：</p>
<p><strong>(<em>Start-AzureService</em>)</strong></p>
<p><a href="https://msdn.microsoft.com/en-us/library/azure/dn495171.aspx">https://msdn.microsoft.com/en-us/library/azure/dn495171.aspx</a>&nbsp;&nbsp;</p>
<p>NAME ：&nbsp;&nbsp;&nbsp; Start-AzureService</p>
<p>SYNOPSIS ：&nbsp;&nbsp;&nbsp; Starts the specified hosted service in Azure</p>
<p>&nbsp;</p>
<p>SYNTAX</p>
<p>&nbsp;&nbsp;&nbsp; Start-AzureService [[-ServiceName] &lt;String&gt;] [[-Slot] &lt;String&gt;] [[-Subscription] &lt;String&gt;]&nbsp;[&lt;CommonParameters&gt;]</p>
<p>&nbsp;</p>
<p>DESCRIPTION</p>
<p>&nbsp;&nbsp;&nbsp; Starts the specified hosted service in the cloud, if the service is in the stopped state.&nbsp; Note that the Publish-AzureServiceProject command will attempt to automatically start the service</p>
<p>&nbsp;</p>
<p><strong>REST API:</strong></p>
<p><a href="https://msdn.microsoft.com/en-us/library/azure/ee460808.aspx">https://msdn.microsoft.com/en-us/library/azure/ee460808.aspx</a></p>
<p><em>The <strong>Update Deployment Status</strong> asynchronous operation changes the running status of a deployment. The status of a deployment can be running or suspended.</em></p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;">5. 其他</span></p>
<p>如果虚拟机的状态是stopped，而不是stopped<br />(deallocated)，常规的启动方法是通过Azure管理主页或者PowerShell命令Start-AzureVM，由于处于stopped状态的虚拟机产生的Compute费用和Running状态的虚拟机一样，因此一般情况下不建议保持虚拟机的状态在stopped，如果是异常（如虚拟机内部应用导致关机）导致，需要解决找到问题根源之后再部署该虚拟机服务。</p>
<p>&nbsp;</p>
<p>如果客户需要启动从属于不同托管服务下的多个虚拟机，可以同时调用多个Start-AzureVM命令或者REST请求，直接同步启动多个虚拟机。</p>
<p>&nbsp;</p>
<p>更多信息请参考：</p>
<p>Azure虚拟机状态及生命周期：<a href="https://msdn.microsoft.com/en-us/library/azure/dn763934.aspx">https://msdn.microsoft.com/en-us/library/azure/dn763934.aspx</a></p>
<p>PowerShell命令（虚拟机操作）：<a href="https://msdn.microsoft.com/en-us/library/azure/dn495240.aspx">https://msdn.microsoft.com/en-us/library/azure/dn495240.aspx</a></p>
<p>China Azure中的虚拟机服务：<a href="https://www.windowsazure.cn/home/features/virtual-machines/">https://www.windowsazure.cn/home/features/virtual-machines/</a></p>
<p>Azure技术支持：<a href="https://www.windowsazure.cn/support/contact/?fb=001">https://www.windowsazure.cn/support/contact/?fb=001</a></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
  </channel>
</rss>