【问题标题】:Python Azure Batch - Permission Denied Linux nodePython Azure Batch - 权限被拒绝 Linux 节点
【发布时间】:2017-11-24 12:37:54
【问题描述】:

我正在使用 Azure Batch 在多个 Linux 节点(创建池之后)上运行 python 脚本。每个节点使用 14.04.5-LTS 版本的 Ubuntu。

在脚本中,我在每个节点上上传多个文件,然后在每个节点上运行多个任务。但是,当我尝试执行第一个任务时出现“权限被拒绝”错误。实际上,该任务是几个文件的解压缩(仅供参考,这些 zip 文件的上传很顺利)。 该脚本运行良好,直到上周。我怀疑 Ubuntu 版本的更新,但也许是别的东西。

这是我得到的错误:

错误:无法打开 zipfile [ /mnt/batch/tasks/shared/01-AXAIS_HPC.zip ] 没有权限 解压缩:找不到或打开/mnt/batch/tasks/shared/01-AXAIS_HPC.zip,

这是代码的主要部分:

credentials = batchauth.SharedKeyCredentials(_BATCH_ACCOUNT_NAME,_BATCH_ACCOUNT_KEY)
batch_client = batch.BatchServiceClient(
        credentials,
        base_url=_BATCH_ACCOUNT_URL)
create_pool(batch_client,
                _POOL_ID,
                application_files,
                _NODE_OS_DISTRO,
                _NODE_OS_VERSION)
helpers.create_job(batch_client, _JOB_ID, _POOL_ID)
add_tasks(batch_client,
              _JOB_ID,
              input_files,
              output_container_name,
              output_container_sas_token)

使用 add_task :

def add_tasks(batch_service_client, job_id, input_files,
          output_container_name, output_container_sas_token):

print('Adding {} tasks to job [{}]...'.format(len(input_files), job_id))

tasks = list()

for idx, input_file in enumerate(input_files):
      command = ['unzip -q $AZ_BATCH_NODE_SHARED_DIR/01-AXAIS_HPC.zip -d $AZ_BATCH_NODE_SHARED_DIR',
                 'chmod a+x $AZ_BATCH_NODE_SHARED_DIR/01-AXAIS_HPC/00-EXE/linux/*',
                 'PATH=$PATH:$AZ_BATCH_NODE_SHARED_DIR/01-AXAIS_HPC/00-EXE/linux',    
                 'unzip -q $AZ_BATCH_TASK_WORKING_DIR/'
                 '{} -d $AZ_BATCH_TASK_WORKING_DIR/{}'.format(input_file.file_path,idx+1),                   
                 'Rscript $AZ_BATCH_NODE_SHARED_DIR/01-AXAIS_HPC/03-MAIN.R $AZ_BATCH_TASK_WORKING_DIR $AZ_BATCH_NODE_SHARED_DIR/01-AXAIS_HPC $AZ_BATCH_TASK_WORKING_DIR/'
                  '{} {}' .format(idx+1,idx+1),                     
                 'python $AZ_BATCH_NODE_SHARED_DIR/01-IMPORT_FILES.py '
                  '--storageaccount {} --storagecontainer {} --sastoken "{}"'.format(
                   _STORAGE_ACCOUNT_NAME,
                   output_container_name,
                   output_container_sas_token)]          
      tasks.append(batchmodels.TaskAddParameter(
            'Task{}'.format(idx),
            helpers.wrap_commands_in_shell('linux', command),
            resource_files=[input_file]
            )
      )
Split = lambda tasks, n=100: [tasks[i:i+n] for i in range(0, len(tasks), n)]
SPtasks = Split(tasks)      
for i in range(len(SPtasks)):
    batch_service_client.task.add_collection(job_id, SPtasks[i])

你有什么见解可以帮助我解决这个问题吗?非常感谢。

罗宾

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。

标签: python azure azure-batch


【解决方案1】:

查看错误,即

error: cannot open zipfile [ /mnt/batch/tasks/shared/01-AXAIS_HPC.zip ]
Permission denied unzip: cannot find or open /mnt/batch/tasks/shared/01-AXAIS_HPC.zip,

这似乎是该文件不存在于当前共享目录位置,或者它没有正确的权限。前者的可能性更大。

  • 您使用共享目录方式有什么特别的原因吗?另外,你是如何上传文件的? (即希望正确完成 async 和 await 的使用,即在 shared_dir 内容可用于节点之前,没有贪婪的进程正在运行您的任务。)
  • 旁注:您拥有该节点,因此您可以通过 RDP / SSH 进入该节点并发现 shared_dir 确实存在。

要问的几件事是:你是如何上传这些 zip 文件的。

如果我可能会问,这里的设计\用户场景是什么以及您打算如何使用它。

推荐:

您可以通过其他几种方式在 azure 节点中使用 zip 文件,例如通过资源文件或通过应用程序包。 (应用程序包方式可能更适合处理 *.zip 文件)我添加了一些文档和位置,您可以查看示例实现和指导。

我认为一个好的起点是:希望下面的材料和示例对您有所帮助。 :)

此外,如果池较旧,我建议您重新创建它,以确保您的节点以最新版本运行。

【讨论】:

    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 2019-01-19
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多