通用通用程序的插件脚本
通用调度器接口提供了完全的灵活性来配置 MATLAB® 客户端、MATLAB 工作单元和第三方调度器的交互。插件脚本定义了 MATLAB 如何与您的设置交互。
下表列出了支持的插件脚本函数及其评估阶段:
| 文件名 | 阶段 |
independentSubmitFcn.m | 提交独立作业 |
communicatingSubmitFcn.m | 提交通信作业 |
getJobStateFcn.m | 查询作业状态 |
cancelJobFcn.m | 取消作业 |
cancelTaskFcn.m | 取消任务 |
deleteJobFcn.m | 删除作业 |
deleteTaskFcn.m | 删除任务 |
postConstructFcn.m | 创建 parallel.cluster.Generic 实例后 |
仅当这些插件脚本具有预期的文件名并且位于集群的 PluginScriptsLocation 属性指定的文件夹中时,才会对其进行评估。
注意
要提交独立作业,independentSubmitFcn.m 必须存在;要提交通信作业,communicatingSubmitFcn.m 必须存在。
示例插件脚本
下载示例插件脚本
为了支持通用调度器接口的使用,MathWorks® 为以下第三方调度器提供了附加功能或插件,您可以从 GitHub® 存储库或附加功能资源管理器下载这些附加功能或插件,并根据要求进行编辑。选择与您的设置最匹配的示例插件脚本之一。
| 插件 | GitHub 存储库 |
|---|---|
Parallel Computing Toolbox™ plugin for MATLAB Parallel Server™ with Slurm | https://github.com/mathworks/matlab-parallel-slurm-plugin |
Parallel Computing Toolbox plugin for MATLAB Parallel Server with IBM Spectrum® LSF® | https://github.com/mathworks/matlab-parallel-lsf-plugin |
Parallel Computing Toolbox plugin for MATLAB Parallel Server with Grid Engine | https://github.com/mathworks/matlab-parallel-gridengine-plugin |
Parallel Computing Toolbox plugin for MATLAB Parallel Server with PBS | https://github.com/mathworks/matlab-parallel-pbs-plugin |
Parallel Computing Toolbox plugin for MATLAB Parallel Server with HTCondor | https://github.com/mathworks/matlab-parallel-htcondor-plugin |
使用这些工作流之一为您的调度器下载适当的插件脚本。
您可以从 GitHub 存储库下载插件。
从您计算机上的命令窗口克隆 GitHub 存储库。例如,要使用 Slurm 克隆 MATLAB Parallel Server 的 Parallel Computing Toolbox 插件的存储库,请使用:
git clone https://github.com/mathworks/matlab-parallel-slurm-plugin
在浏览器中访问 GitHub 页面并将插件下载为 ZIP 存档。
或者,要从 MATLAB 附加功能资源管理器安装附加功能,请转到主页选项卡,在环境部分中点击附加功能图标。在附加功能资源管理器中,搜索附加功能并安装它。
您还可以从 MATLAB Central™ File Exchange 下载插件。
如果 MATLAB 客户端无法直接向调度器提交作业,MATLAB 支持使用 ssh 协议向远程集群提交命令。
如果客户端和集群节点没有共享文件系统,MATLAB 支持使用 sftp(SSH 文件传输协议)在您的计算机和集群之间复制作业和任务文件。
修改示例脚本
您可以设置其他属性来自定义客户端与集群的交互方式,而无需修改插件脚本。有关详细信息,请参阅自定义示例插件脚本的行为。
如果您的调度器或集群配置未完全由某个存储库支持,您可以修改其中一个包的脚本以满足您的要求。有关如何为通用调度器编写一组插件脚本的更多信息,请参阅编写自定义插件脚本。
包装器脚本
示例插件脚本使用包装器脚本来简化 independentSubmitFcn.m 和 communicatingSubmitFcn.m 的实现。这些脚本不是必需的,但是使用它们是一种很好的做法,可以使您的代码更具可读性。下表描述了这些脚本:
| 文件名 | 描述 |
independentJobWrapper.sh | 在 independentSubmitFcn.m 中使用,以适当的参量嵌入对 MATLAB 可执行文件的调用。它使用环境变量来确定可执行文件及其参量的位置。有关其使用示例,请参阅 SLURM 调度器的示例脚本。 |
communicatingJobWrapper.sh | 在 communicatingSubmitFcn.m 中用于在集群中分配通信作业。该脚本实现了提交调度器作业以启动 MPI 进程中的步骤。有关其使用示例,请参阅 SLURM 调度器的示例脚本。 |
编写自定义插件脚本
注意
当编写自己的插件脚本时,最好先修改与您的设置最匹配的示例插件脚本之一。有关示例插件脚本的列表,请参阅示例插件脚本。
independentSubmitFcn
当您向通用集群提交独立作业时,independentSubmitFcn.m 函数会在 MATLAB 客户端会话中执行。
该函数的声明行必须是:
function independentSubmitFcn(cluster,job,environmentProperties)MATLAB 独立作业中的每个任务都对应于调度器上的单个作业。该函数的作用是向您的第三方调度器提交 N 个作业,其中 N 是独立作业中的任务数。每项作业必须:
设置工作单元 MATLAB 所需的五个环境变量,以识别要运行的单个任务。有关详细信息,请参阅配置工作单元环境。
调用适当的 MATLAB 可执行文件来启动 MATLAB 工作单元并运行任务。有关详细信息,请参阅提交调度器作业以运行 MATLAB 工作单元。
配置工作单元环境. 下表列出了运行单个任务时必须在工作单元 MATLAB 上设置的五个环境变量和值:
| 环境变量名称 | 环境变量值 |
PARALLEL_SERVER_DECODE_FUNCTION | 'parallel.cluster.generic.independentDecodeFcn' |
PARALLEL_SERVER_STORAGE_CONSTRUCTOR | environmentProperties.StorageConstructor |
PARALLEL_SERVER_STORAGE_LOCATION |
|
PARALLEL_SERVER_JOB_LOCATION | environmentProperties.JobLocation |
PARALLEL_SERVER_TASK_LOCATION | environmentProperties.TaskLocations{n}(用于 nth 任务) |
许多调度器支持将客户端环境复制作为提交命令的一部分。如果是这样,您可以在客户端中设置先前的环境变量,以便调度器可以将它们复制到工作单元环境中。如果没有,您必须修改您的提交命令以转发这些变量。
提交调度器作业以运行 MATLAB 工作单元. 一旦在工作单元上定义了给定作业和任务的五个必需参量,就可以通过调用带有适当参量的 MATLAB 可执行文件来运行该任务。要调用的 MATLAB 可执行文件在 environmentProperties.MatlabExecutable 中定义。要传递的参量在 environmentProperties.MatlabArguments 中定义。
注意
如果您无法从客户端计算机直接提交给您的调度器,请参阅 从远程主机提交 以获取有关如何使用 ssh 提交的说明。
SLURM 调度器的示例脚本. 该脚本展示了具有共享文件系统的 SLURM 调度器的基本提交函数。有关更完整的示例,请参阅 示例插件脚本。
function independentSubmitFcn(cluster,job,environmentProperties) % Specify the required environment variables. setenv('PARALLEL_SERVER_DECODE_FUNCTION', 'parallel.cluster.generic.independentDecodeFcn'); setenv('PARALLEL_SERVER_STORAGE_CONSTRUCTOR', environmentProperties.StorageConstructor); setenv('PARALLEL_SERVER_STORAGE_LOCATION', environmentProperties.StorageLocation); setenv('PARALLEL_SERVER_JOB_LOCATION', environmentProperties.JobLocation); % Specify the MATLAB executable and arguments to run on the worker. % These are used in the independentJobWrapper.sh script. setenv('PARALLEL_SERVER_MATLAB_EXE', environmentProperties.MatlabExecutable); setenv('PARALLEL_SERVER_MATLAB_ARGS', environmentProperties.MatlabArguments); for ii = 1:environmentProperties.NumberOfTasks % Specify the environment variable required to identify which task to run. setenv('PARALLEL_SERVER_TASK_LOCATION', environmentProperties.TaskLocations{ii}); % Specify the command to submit the job to the SLURM scheduler. % SLURM will automatically copy environment variables to workers. commandToRun = 'sbatch --ntasks=1 independentJobWrapper.sh'; [cmdFailed, cmdOut] = system(commandToRun); end end
前面的示例向调度器提交了一个简单的 bash 脚本 independentJobWrapper.sh。independentJobWrapper.sh 脚本使用环境变量嵌入 MATLAB 可执行文件和参量:
#!/bin/sh # PARALLEL_SERVER_MATLAB_EXE - the MATLAB executable to use # PARALLEL_SERVER_MATLAB_ARGS - the MATLAB args to use exec "${PARALLEL_SERVER_MATLAB_EXE}" ${PARALLEL_SERVER_MATLAB_ARGS}
communicatingSubmitFcn
当您向通用集群提交通信作业时,communicatingSubmitFcn.m 函数将在 MATLAB 客户端会话中执行。
该函数的声明行必须是:
function communicatingSubmitFcn(cluster,job,environmentProperties)此函数的目的是向您的调度器提交单个作业。此作业必须:
设置 MATLAB 工作单元所需的四个环境变量来识别要运行的作业。有关详细信息,请参阅配置工作单元环境。
调用 MPI 将您的作业分配给
NMATLAB 个工作单元。N对应于 MATLAB 作业的NumWorkersRange属性中指定的最大值。有关详细信息,请参阅提交调度器作业以启动 MPI 进程。
配置工作单元环境. 下表列出了在工作单元 MATLAB 上运行通信作业的任务时必须设置的四个环境变量和值:
| 环境变量名称 | 环境变量值 |
PARALLEL_SERVER_DECODE_FUNCTION | 'parallel.cluster.generic.communicatingDecodeFcn' |
PARALLEL_SERVER_STORAGE_CONSTRUCTOR | environmentProperties.StorageConstructor |
PARALLEL_SERVER_STORAGE_LOCATION |
|
PARALLEL_SERVER_JOB_LOCATION | environmentProperties.JobLocation |
许多调度器支持将客户端环境复制作为提交命令的一部分。如果是这样,您可以在客户端中设置先前的环境变量,以便调度器可以将它们复制到工作单元环境中。如果没有,您必须修改您的提交命令以转发这些变量。
提交调度器作业以启动 MPI 进程. 在为给定作业定义四个必需的参数后,通过使用 N 启动 mpiexec 工作单元 MATLAB 来运行您的作业。mpiexec 是随 Parallel Computing Toolbox 一起提供的软件,它实现了消息传递接口 (MPI) 标准,以允许在工作单元的 MATLAB 进程之间进行通信。有关 mpiexec 的更多信息,请参阅 MPICH 主页。
要运行您的作业,您必须向您的调度器提交一份作业,调度程序将执行以下步骤。请注意,matlabroot 指的是工作单元节点上的 MATLAB 安装位置。
从调度器请求
N进程。N对应于 MATLAB 作业的NumWorkersRange属性中指定的最大值。调用
mpiexec启动工作单元 MATLAB 处理。每个主机上启动的工作单元 MATLAB 的数量应该与调度器分配的进程数量相匹配。mpiexec可执行文件位于matlabroot/bin/mw_mpiexec。mpiexec命令自动将环境变量转发给启动的进程。因此,在运行mpiexec之前,请确保设置了 配置工作单元环境 中列出的环境变量。要了解有关
mpiexec选项的更多信息,请参阅使用 Hydra 进程管理器。
注意
有关上述步骤的完整示例,请参阅 示例插件脚本 中任何示例插件脚本提供的 communicatingJobWrapper.sh 脚本。如果您需要编写自己的脚本,请使用此脚本作为起点。
SLURM 调度器的示例脚本. 以下脚本展示了具有共享文件系统的 SLURM 调度器的基本提交函数。
提交的作业包含在 bash 脚本 communicatingJobWrapper.sh 中。该脚本实现了提交调度器作业以启动 MPI 进程中 SLURM 调度器的相关步骤。有关更完整的示例,请参阅 示例插件脚本。
function communicatingSubmitFcn(cluster,job,environmentProperties) % Specify the four required environment variables. setenv('PARALLEL_SERVER_DECODE_FUNCTION', 'parallel.cluster.generic.communicatingDecodeFcn'); setenv('PARALLEL_SERVER_STORAGE_CONSTRUCTOR', environmentProperties.StorageConstructor); setenv('PARALLEL_SERVER_STORAGE_LOCATION', environmentProperties.StorageLocation); setenv('PARALLEL_SERVER_JOB_LOCATION', environmentProperties.JobLocation); % Specify the MATLAB executable and arguments to run on the worker. % Specify the location of the MATLAB install on the cluster nodes. % These are used in the communicatingJobWrapper.sh script. setenv('PARALLEL_SERVER_MATLAB_EXE', environmentProperties.MatlabExecutable); setenv('PARALLEL_SERVER_MATLAB_ARGS', environmentProperties.MatlabArguments); setenv('PARALLEL_SERVER_CMR', cluster.ClusterMatlabRoot); numberOfTasks = environmentProperties.NumberOfTasks; % Specify the command to submit a job to the SLURM scheduler which % requests as many processes as tasks in the job. % SLURM will automatically copy environment variables to workers. commandToRun = sprintf('sbatch --ntasks=%d communicatingJobWrapper.sh', numberOfTasks); [cmdFailed, cmdOut] = system(commandToRun); end
getJobStateFcn
当您查询使用通用集群创建的作业的状态时,getJobStateFcn.m 函数会在 MATLAB 客户端会话中执行。该函数的声明行必须是:
function state = getJobStateFcn(cluster,job,state)当使用第三方调度器时,调度器可能会拥有比工具箱从本地作业存储位置可用的更多有关您的作业的最新信息。如果您的集群不与客户端计算机共享文件系统,则这种情况尤其如此,远程文件系统在将大型数据文件传播回本地数据位置时可能会很慢。
要从调度器中检索该信息,请将名为 getJobStateFcn.m 的函数添加到集群的 PluginScriptsLocation 中。
传递到此函数的状态是从本地作业存储派生的状态。然后,此函数的主体可以查询调度器以确定作业的更准确状态,并将其返回以代替存储的状态。为此目的编写的函数必须返回作业对象状态的有效值。允许的值为 ‘pending'、‘queued'、‘running'、‘finished' 或 ‘failed'。
有关将 MATLAB 任务与其对应的调度器作业 ID 配对的说明,请参阅 使用通用调度器管理作业。
cancelJobFcn
当您取消使用通用集群创建的作业时,cancelJobFcn.m 函数将在 MATLAB 客户端会话中执行。该函数的声明行必须是:
function OK = cancelJobFcn(cluster,job)当您取消使用通用调度器接口创建的作业时,默认情况下此操作只会影响存储中的作业数据。要取消调度器上的相应作业,您必须向调度器提供要做什么以及何时执行的指令。为了实现这一点,请将一个名为 cancelJobFcn.m 的函数添加到集群的 PluginScriptsLocation 中。
然后,该函数主体可以向调度器发送命令,例如,从队列中删除相应的作业。该函数必须返回一个逻辑标量,表明取消调度器上的作业是成功还是失败。
有关将 MATLAB 任务与其对应的调度器作业 ID 配对的说明,请参阅 使用通用调度器管理作业。
cancelTaskFcn
当您取消使用通用集群创建的任务时,cancelTaskFcn.m 函数将在 MATLAB 客户端会话中执行。该函数的声明行必须是:
function OK = cancelTaskFcn(cluster,task)当您取消使用通用调度器接口创建的任务时,默认情况下,这只会影响存储中的任务数据。要取消调度器上的相应作业,您必须向调度器提供要做什么以及何时执行的指令。为了实现这一点,请将一个名为 cancelTaskFcn.m 的函数添加到集群的 PluginScriptsLocation 中。
然后,该函数的主体可以向调度器发送命令,例如,从调度器队列中删除相应的作业。该函数必须返回一个逻辑标量,表明取消调度器上的作业是成功还是失败。
有关将 MATLAB 任务与其对应的调度器作业 ID 配对的说明,请参阅 使用通用调度器管理作业。
deleteJobFcn
当您删除使用通用集群创建的作业时,deleteJobFcn.m 函数将在 MATLAB 客户端会话中执行。该函数的声明行必须是:
function deleteTaskFcn(cluster,task)当您删除使用通用调度器接口创建的作业时,默认情况下,这只会影响存储中的作业数据。要删除调度器上的相应作业,您必须向调度器提供要做什么以及何时执行的指令。为了实现这一点,请将一个名为 deleteJobFcn.m 的函数添加到集群的 PluginScriptsLocation 中。
然后,该函数的主体可以向调度器发送命令,例如,从调度器队列中删除相应的作业。
有关将 MATLAB 任务与其对应的调度器作业 ID 配对的说明,请参阅 使用通用调度器管理作业。
deleteTaskFcn
当您删除使用通用集群创建的任务时,deleteTaskFcn.m 函数将在 MATLAB 客户端会话中执行。该函数的声明行必须是:
function deleteTaskFcn(cluster,task)当您删除使用通用调度器接口创建的任务时,默认情况下,这只会影响存储中的任务数据。要删除调度器上的相应作业,您必须向调度器提供要做什么以及何时执行的指令。为了实现这一点,请将一个名为 deleteTaskFcn.m 的函数添加到集群的 PluginScriptsLocation 中。
然后,该函数的主体可以向调度器发送命令,例如,从调度器队列中删除相应的作业。
有关将 MATLAB 任务与其对应的调度器作业 ID 配对的说明,请参阅 使用通用调度器管理作业。
postConstructFcn
在 MATLAB 中创建集群实例后,postConstructFcn.m 函数将在 MATLAB 客户端会话中执行。例如,以下代码行创建集群的一个实例并运行与 postConstructFcn 集群配置文件关联的 ‘myProfile' 函数:
c = parcluster('myProfile');postConstructFcn 函数的声明行必须是:
function postConstructFcn(cluster)如果您需要在使用集群之前对其进行自定义配置,请在集群的 postConstructFcn.m 中添加一个名为 PluginScriptsLocation 的函数。此函数的主体可以包含您需要的任何额外设置步骤。
创建集群配置文件并验证插件脚本
为了验证您的自定义插件脚本是否运行良好以及并行计算产品是否在您的集群上正确安装和配置,您必须使用通用调度器接口在 MATLAB 客户端端上设置集群配置文件。有关详细说明,请参阅创建通用集群配置文件。
添加用户自定义
如果您需要在运行时修改插件脚本的功能,请使用通用调度器接口的 AdditionalProperties 属性。
作为示例,考虑 SLURM 调度器。SLURM 的提交命令接受 –-nodelist 参量,允许您指定想要运行的节点。您可以更改此参量的值,而不必修改插件脚本。要添加此功能,请在 independentSubmitFcn.m 或 communicatingSubmitFcn.m 脚本中包含以下代码模式:
% Basic SLURM submit command submitCommand = 'sbatch'; % Check if property is defined if isprop(cluster.AdditionalProperties, 'NodeList') % Add appropriate argument and value to submit string submitCommand = [submitCommand ' --nodelist=' cluster.AdditionalProperties.NodeList]; end
有关如何使用此编码模式的示例,请参阅示例插件脚本 中脚本的提交函数。
或者,要修改独立作业和通信作业的提交命令,请在 getCommonSubmitArgs 函数中包含上述代码模式。getCommonSubmitArgs 函数是示例插件脚本中包含的辅助函数,您可以使用它来修改两种类型作业的提交命令。
从集群配置文件管理器设置其他属性
通过修改以上示例中的脚本,您可以向通用集群配置文件中添加 AdditionalProperties 条目来指定要使用的节点列表。这为与您共享集群配置文件的任何人提供了一种记录添加到插件脚本中的自定义内容的方法。
要将 NodeList 属性添加到您的集群配置文件:
通过选择并行 > 创建和管理集群配置文件,从 MATLAB 桌面启动集群配置文件管理器。
选择通用集群的配置文件,然后点击编辑。
导航到 AdditionalProperties 表,然后点击 Add。
输入
NodeList作为名称。将字符串设置为类型。
将值设置为节点列表。
从 MATLAB 命令行设置附加属性
通过修改 添加用户自定义 中的脚本,您可以在提交作业之前通过设置集群对象的相应属性从 MATLAB 命令行编辑节点列表:
c = parcluster; c.AdditionalProperties.NodeList = 'gpuNodeName'; j = c.batch('myScript');
显示 AdditionalProperties 对象以查看所有当前定义的属性及其值:
>> c.AdditionalProperties
ans =
AdditionalProperties with properties:
ClusterHost: 'myClusterHost'
NodeList: 'gpuNodeName'
RemoteJobStorageLocation: '/tmp/jobs'使用通用调度器管理作业
作业管理的第一个要求是识别与 MATLAB 作业对象对应的调度器上的作业。当您向调度器提交一份作业时,提交函数中执行提交的命令可以从调度器返回一些有关该作业的数据。该数据通常包含作业 ID。通过将该调度器作业 ID 与 MATLAB 作业对象一起存储,您稍后可以在向调度器发送管理命令时通过此作业 ID 引用调度器作业。类似地,您可以存储 MATLAB 任务 ID 到调度器作业 ID 的映射,以帮助管理单个任务。您可以使用 setJobClusterData (Parallel Computing Toolbox) 函数来存储此集群数据。
保存作业调度器数据
此示例显示如何修改 independentSubmitFcn.m 函数来解析提交给 SLURM 调度器的每个命令的输出。您可以使用正则表达式提取每个任务的调度器作业 ID,然后使用函数来存储它。
% Pattern to extract scheduler job ID from SLURM sbatch output searchPattern = '.*Submitted batch job ([0-9]+).*'; jobIDs = cell(numberOfTasks, 1); for ii = 1:numberOfTasks setenv('PARALLEL_SERVER_TASK_LOCATION', environmentProperties.TaskLocations{ii}); commandToRun = 'sbatch --ntasks=1 independentJobWrapper.sh'; [cmdFailed, cmdOut] = system(commandToRun); jobIDs{ii} = regexp(cmdOut, searchPattern, 'tokens', 'once'); end % set the job IDs on the job cluster data cluster.setJobClusterData(job, struct('ClusterJobIDs', {jobIDs}));
检索作业调度器数据
此示例修改 cancelJobFcn.m 以取消 SLURM 调度器上的相应作业。该示例使用 getJobClusterData (Parallel Computing Toolbox) 来检索作业调度器数据。
function OK = cancelJobFcn(cluster, job) % Get the scheduler information for this job data = cluster.getJobClusterData(job); jobIDs = data.ClusterJobIDs; for ii = 1:length(jobIDs) % Tell the SLURM scheduler to cancel the job commandToRun = sprintf('scancel ''%s''', jobIDs{ii}); [cmdFailed, cmdOut] = system(commandToRun); end OK = true;
从远程主机提交
如果 MATLAB 客户端无法直接提交给您的调度器,请使用 parallel.cluster.RemoteClusterAccess (Parallel Computing Toolbox) 建立连接并在远程主机上运行命令。
以下代码以用户 remoteHostname 的身份在远程主机 user 上执行命令。
% This will prompt for the password of user access = parallel.cluster.RemoteClusterAccess.getConnectedAccess... ('remoteHostname', 'user'); % Execute a command on remoteHostname [cmdFailed, cmdOut] = access.runCommand(commandToRun);
有关使用远程主机提交的插件脚本的示例,请参阅 示例插件脚本 中的远程提交模式。
不使用共享文件系统提交
如果 MATLAB 客户端没有与集群节点共享文件系统,则使用 parallel.cluster.RemoteClusterAccess (Parallel Computing Toolbox) 建立连接并在客户端和集群节点之间复制作业和任务文件。
这个 parallel.cluster.RemoteClusterAccess (Parallel Computing Toolbox) 对象使用 ssh 协议,因此需要在远程主机上运行 ssh 守护进程服务。要建立连接,您必须在计算机上运行 ssh 代理,或者提供以下之一:
用户名和密码
有效的标识文件
多因素身份验证的正确响应
当客户端没有与集群节点共享的文件系统时,必须指定在客户端端上使用的本地作业存储位置和在集群上使用的远程作业存储位置。远程作业存储位置必须对集群的所有节点可用。
parallel.cluster.RemoteClusterAccess 使用文件镜像来持续同步本地作业和任务文件与集群上的作业和任务文件。当文件镜像首次启动时,本地作业和任务文件将上传到远程作业存储位置。在作业执行时,文件镜像不断检查远程作业存储位置是否有新文件和更新,并将文件复制到客户端的本地存储中。此过程可确保 MATLAB 客户端始终能够查看调度器上执行的作业和任务的最新情况。
此示例以用户 remoteHostname 的身份连接到远程主机 user,并将 /remote/storage 建立为要同步的远程集群存储位置。然后,它启动一项作业的文件镜像,将作业的本地文件复制到集群上的 /remote/storage,然后将所有更改同步回本地计算机。
% This will prompt for the password of user access = parallel.cluster.RemoteClusterAccess.getConnectedAccessWithMirror... ('remoteHostname', '/remote/storage', 'user'); % Start file mirroring for job access.startMirrorForJob(job);