请默认的当前工作目录是什么?

本文介绍默认当前工作目录 (CWD) 如何用于笔记本和文件执行。

注意

使用 Databricks Runtime 14.0 及更高版本和默认工作区配置提高整个工作区中 CWD 行为的一致性。

笔记本文件中本地执行的代码有两种默认 CWD 行为:

  1. CWD 返回包含正在运行的笔记本或脚本的目录。
  2. CWD 返回一个目录,该目录表示附加到驱动程序的临时存储卷。

此 CWD 行为会影响所有代码,包括 %sh 和不使用 Apache Spark 的 Python 或 R 代码。 此行为取决于代码语言、Databricks Runtime 版本、工作区路径和工作区管理员配置。

对于 Scala 代码,CWD 是附加到驱动程序的临时存储

对于使用所有其他语言编写的代码:

  • 在 Databricks Runtime 14.0 及更高版本中,CWD 是包含正在运行的笔记本或脚本的目录。 无论代码是否位于 /Workspace/Repos 都是如此。
  • 对于运行 Databricks Runtime 13.3 LTS 及更低版本的笔记本,CWD 取决于代码是否位于 /Workspace/Repos
  • 对于在 /Workspace/Repos 外部的路径中执行的代码,CWD 是附加到驱动程序的临时存储卷
  • 对于在 /Workspace/Repos 中的路径中执行的代码,CWD 取决于管理员配置设置和群集 DBR 版本:
    • 在 DBR 8.4 及更高版本中,对于 enableWorkspaceFilesystem 设置为 dbr8.4+true 的工作区,CWD 是包含正在运行的笔记本或脚本的目录。 在低于 8.4 的 DBR 版本中,它是附加到驱动程序的临时存储卷
    • 在 DBR 11.0 及更高版本中,对于 enableWorkspaceFilesystem 设置为 dbr11.0+ 的工作区,CWD 是包含正在运行的笔记本或脚本的目录。 在低于 11.0 的 DBR 版本中,它是附加到驱动程序的临时存储卷
    • 对于 enableWorkspaceFilesystem 设置为 false 的工作区,CWD 是附加到驱动程序的临时存储卷

获取代码中的 CWD

要获取管道笔记本的工作区 CWD,请调用 os.getcwd()。 必须使用 import os 在笔记本的开头导入 os 模块(默认的 Python 文件系统交互模块)。 例如:

import os
...
cwd = os.getcwd()

也可以通过在管道笔记本的开头调用 os.chdir('/path/to/dir') 来设置 CWD。 只有在从已启用 WSFS 的工作区中运行笔记本时,才能设置 CWD。

这对工作负载有何影响?

对工作负载的最大影响与文件的持久性和位置有关:

  • 在 Databricks Runtime 13.3 LTS 及更低版本中,对于在 /Workspace/Repos 外部路径中执行的代码,许多代码片段将数据存储在临时存储卷上的默认位置,该卷在群集终止时会永久删除。
  • 在 Databricks Runtime 14.0 及更高版本中,这些操作的默认行为将创建与正在运行的笔记本一起存储的工作区文件,这些文件将一直保留到显式删除为止。

有关工作区文件中固有的性能差异和其他限制的说明,请参阅“使用工作区文件”。

还原为旧行为

可以使用 Python 方法 os.chdir() 更改任何笔记本的当前工作目录。 如果要确保每个笔记本使用的是附加到驱动程序的临时存储卷上的 CWD,则可以将以下命令添加到每个笔记本的第一个单元格,然后在任何其他代码之前运行它:

import os

os.chdir("/tmp")