2016-12-01 47 views
0

我是Azure的新手,我正在尝试在此处构建一个简单的Azure批处理案例。Azure Batch Pool启动任务从Blob下载资源文件FileShare

我在批池堆放启动任务...

我创作了一批账户,并在美国东部的存储帐户,然后我创建了一个通用 - 文件共享在存储帐户与容器。我手动更新了一个名为Test.txt的文件。

我想要做的就是要求批量池下载此文件在启动任务。

所以代码老话:

string storageConnectionString = String.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", StorageAccountName, StorageAccountKey); 

// Retrieve the storage account 
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString); 
CloudFileClient fileClient = storageAccount.CreateCloudFileClient(); 
SharedAccessFilePolicy fileShareConstraint = new SharedAccessFilePolicy 
{ 
    SharedAccessExpiryTime = DateTime.UtcNow.AddHours(48), 
    Permissions = SharedAccessFilePermissions.Read, 
}; 
var fileShare = fileClient.GetShareReference(inputContainerName); 
var rootDir = fileShare.GetRootDirectoryReference(); 
var testFile = rootDir.GetFileReference("test.txt"); 
var sasUrl = fileShare.GetSharedAccessSignature(fileShareConstraint); 
var fileUrl = string.Format("{0}{1}", testFile.StorageUri.PrimaryUri, sasUrl); 

var list = new List<ResourceFile>(); 
var testResourceFile = new ResourceFile(fileUrl, "test.txt"); 

list.Add(testResourceFile); 
await CreatePoolAsync(batchClient, PoolId, list); 

然后CreatePoolAsync方法:

private static async Task CreatePoolAsync(BatchClient batchClient, string poolId, IList<ResourceFile> resourceFiles) 
{ 

    Console.WriteLine("Creating pool [{0}]...", poolId); 

    // Create the unbound pool. Until we call CloudPool.Commit() or CommitAsync(), no pool is actually created in the 
    // Batch service. This CloudPool instance is therefore considered "unbound," and we can modify its properties. 

    //if(await batchClient.PoolOperations.GetPoolAsync(poolId) == null) 
    //{ 

    CloudPool pool = batchClient.PoolOperations.CreatePool(
     poolId: poolId, 
     targetDedicated: 1,               // 3 compute nodes 
     virtualMachineSize: "small",            // single-core, 1.75 GB memory, 225 GB disk 
     cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "4")); // Windows Server 2012 R2 
    pool.MaxTasksPerComputeNode = 2; 

    // Create and assign the StartTask that will be executed when compute nodes join the pool. 
    // In this case, we copy the StartTask's resource files (that will be automatically downloaded 
    // to the node by the StartTask) into the shared directory that all tasks will have access to. 
    pool.StartTask = new StartTask 
    { 
     // Specify a command line for the StartTask that copies the task application files to the 
     // node's shared directory. Every compute node in a Batch pool is configured with a number 
     // of pre-defined environment variables that can be referenced by commands or applications 
     // run by tasks. 

     // Since a successful execution of robocopy can return a non-zero exit code (e.g. 1 when one or 
     // more files were successfully copied) we need to manually exit with a 0 for Batch to recognize 
     // StartTask execution success. 

     CommandLine = "cmd /c (robocopy %AZ_BATCH_TASK_WORKING_DIR% %AZ_BATCH_NODE_SHARED_DIR%) ^& IF %ERRORLEVEL% LEQ 1 exit 0", 
     //CommandLine = "cmd /c net use E: \\krisblob2.file.core.windows.net\\krisfilecontiner1 /u:krisblob2 aqTFKyPqcpeI3BrEnlx8RTBAmDaN5FK+mxpBtdgn3v6IT+IbPgDhVU4ojRA1wAmMpYPEHQ9Gzh/A1mAHtxNs+A==", 
     //CommandLine = [email protected]"cmd /c net use Z: \\{StorageAccountName}.file.core.windows.net\krisfilecontiner1 /u:{StorageAccountName} {StorageAccountKey}", 
     //CommandLine = "cmd /c %AZ_BATCH_TASK_WORKING_DIR%\\WinPcap_4_1_3.exe /passive", 
     ResourceFiles = resourceFiles, 
     WaitForSuccess = true 
    }; 
}  

的inputcontainer是我给的文件共享容器名称。

当我运行的代码,启动任务总是失败,出现错误:

BlobDownloadMiscError消息

Miscellaneous error encountered while downloading one of the specified Azure Blob(s) Details   The value for one of the HTTP headers is not in the correct format. RequestId:944807de-001a-00bb-73ae-4ac746000000 Time:2016-11-30T02:04:59.8679984Z

谁能帮我解决这个问题呢?

谢谢!

+0

刚试过你的代码,没有遇到这个问题......你能告诉我哪一行抛出错误吗? – forester123

+0

实际上,在Azure门户池启动任务信息中发现错误。基本上当Compute节点加入池时,并试图下载我指定的资源文件。 –

+0

就是这样,在创建和启动节点后,我的一面也出现同样的错误。我会检查并稍后再回来。 – forester123

回答

0

Azure的批量resource files只能从Azure的Blob存储,而不是Azure的文件存储采购。

您需要net use上的共享,并手动将文件复制的文件或移动到Azure的Blob存储来代替。

+0

看起来这是正确的!映射驱动器后,计算节点可以访问它中的文件!非常感谢! –