Azure批处理池启动任务以从Blob FileShare下载资源文件 [英] Azure Batch Pool Start up task to download resource file from Blob FileShare

查看:162
本文介绍了Azure批处理池启动任务以从Blob FileShare下载资源文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Azure的新手,我正在尝试在此处构建一个简单的Azure批处理案例.

I'm new to Azure, and I'm trying to build a simple Azure batch case here.

我正在堆积批处理池启动"任务...

I'm stacking at the Batch Pool Start up task...

我在美国东部创建了一个批处理帐户和一个存储帐户,然后在带有容器的存储帐户中创建了一个常规文件共享.我手动更新了一个名为Test.txt的文件.

I created a batch account and a storage account in East US, and then I created a general -- Fileshare in the storage account with a container. I manually updated a file called Test.txt.

我要做的是在启动任务时要求批处理池下载此文件.

What I want to do is to ask the Batch Pool to download this file at the startup task.

所以代码去了:

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方法:

Then the CreatePoolAsync method:

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 = $@"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是我在文件共享中为容器指定的名称.

The inputcontainer was the name I gave to the container in the file share.

运行代码时,启动任务总是失败,并显示以下错误:

When I ran the code, the startup task always failed with error:

BlobDownloadMisc错误消息

在遇到其他错误 下载指定的Azure Azure Blob之一详细信息 HTTP标头之一格式不正确. 申请编号:944807de-001a-00bb-73ae-4ac746000000 时间:2016-11-30T02:04:59.8679984Z

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

有人可以帮我解决这个问题吗?

Could anyone help me to solve this problem?

谢谢!

推荐答案

Azure Batch 资源文件只能从Azure Blob存储而不是Azure文件存储中获取.

Azure Batch resource files can only be sourced from Azure Blob Storage and not Azure File Storage.

您将需要net use挂载共享并手动复制文件,或者将文件移动到Azure Blob存储.

You will need to net use mount the share and copy the files manually or move your files to Azure Blob storage instead.

这篇关于Azure批处理池启动任务以从Blob FileShare下载资源文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆