在 GitHub 上编辑

外部依赖与输出

有时你需要直接从本地项目之外的源位置流式传输数据依赖,或将数据输出直接流式传输到某个外部位置,例如云存储或 HDFS。

若要在没有流水线的情况下对 外部数据进行版本管理,请参阅导入外部数据

外部依赖的工作原理

外部依赖将由 DVC 进行跟踪,并在它们发生变化时被检测到(例如,在执行 dvc repro 时触发阶段执行)。

要将外部位置的文件或目录定义为阶段依赖,请在 dvc.yamldeps 字段中指定其远程 URL 或外部路径。使用的格式应与以下支持的 dvc remote 类型/协议的 url 相同:

  • Amazon S3
  • Microsoft Azure Blob 存储
  • Google Cloud Storage
  • SSH
  • HDFS
  • HTTP
  • 工作区外的本地文件和目录

示例

让我们来看一个例子,定义并运行一个名为 download_file 的阶段,该阶段仅从外部位置下载一个文件,涵盖所有支持的位置类型。

有关使用需要手动身份验证设置的远程位置的信息,请参见远程别名示例

$ dvc stage add -n download_file \
          -d s3://mybucket/data.txt \
          -o data.txt \
          aws s3 cp s3://mybucket/data.txt data.txt
$ dvc stage add -n download_file \
          -d azure://mycontainer/data.txt \
          -o data.txt \
          az storage copy \
                     -d data.json \
                     --source-account-name my-account \
                     --source-container mycontainer \
                     --source-blob data.txt
$ dvc stage add -n download_file \
          -d gs://mybucket/data.txt \
          -o data.txt \
          gsutil cp gs://mybucket/data.txt data.txt
$ dvc stage add -n download_file \
          -d ssh://user@example.com/path/to/data.txt \
          -o data.txt \
          scp user@example.com:/path/to/data.txt data.txt

DVC 需要同时支持 SSH 和 SFTP 访问才能使用 SSH 远程存储。请检查是否可以使用诸如 sshsftp(GNU/Linux)等工具进行双向连接。
请注意,服务器的 SFTP 根目录可能与其物理根目录(/)不同。

$ dvc stage add -n download_file \
          -d hdfs://user@example.com/data.txt \
          -o data.txt \
          hdfs fs -copyToLocal \
                  hdfs://user@example.com/data.txt data.txt

包括 HTTPs

$ dvc stage add -n download_file \
          -d https://example.com/data.txt \
          -o data.txt \
          wget https://example.com/data.txt -O data.txt
$ dvc stage add -n download_file \
          -d /home/shared/data.txt \
          -o data.txt \
          cp /home/shared/data.txt data.txt

你可能希望将外部位置封装为可独立管理的配置实体。如果连接需要身份验证、多个依赖项(或阶段)重复使用同一位置,或者 URL 将来可能会更改,则此方法非常有用。

DVC remotes 正好可以实现这一点。你可以使用 dvc remote add 来定义它们,然后使用格式为 remote://{remote_name}/{path} 的特殊 URL(远程别名)来定义外部依赖。

让我们看一个使用 SSH 的示例。首先,注册并配置远程:

$ dvc remote add myssh ssh://user@example.com
$ dvc remote modify --local myssh password 'mypassword'

更多细节(例如为不同类型的远程设置访问凭据),请参考 dvc remote modify

现在,在定义阶段时使用该远程的别名:

$ dvc stage add -n download_file \
          -d remote://myssh/path/to/data.txt \
          -o data.txt \
          wget https://example.com/data.txt -O data.txt

外部输出的工作原理

外部输出将由 DVC 跟踪其变化,但不会保存在缓存中用于版本控制

在 DVC 3.0 中,已弃用将外部输出保存到外部缓存的功能。

要将外部位置的文件或目录定义为输出,可通过 dvc stage add -O 指定其远程 URL 或外部路径,或将其添加到 dvc.yamlouts 字段中。关于支持的外部输出类型及预期的 URL 格式,请参见上方外部依赖的示例。

示例

让我们来看一个例子,定义并运行一个名为 upload_file 的阶段,该阶段仅将文件上传到外部位置。

$ dvc stage add -n upload_file \
          -d data.txt \
          -O s3://mybucket/data.txt \
          aws s3 cp data.txt s3://mybucket/data.txt
内容

🐛 发现问题?告诉我们!或者修复它:

在 GitHub 上编辑

有疑问?加入我们的聊天,我们会为您提供帮助:

Discord 聊天