将 Snowflake 暂存区卷与服务搭配使用¶
Snowflake 支持应用程序容器的 各种存储卷类型,包括内部暂存区、本地存储、内存存储和块存储卷。本部分介绍如何为内部暂存区配置卷和卷挂载。
在服务规范中指定 Snowflake 暂存区¶
要创建服务容器使用 Snowflake 暂存区挂载的服务,请在服务规范中提供必要的配置,如下所示:
指定用于定义要使用的暂存区卷的
spec.volumes
字段。volumes: - name: <name> source: <stage name>
以下字段为必填字段:
name
:卷的名称。source
:要挂载的 Snowflake 内部暂存区,例如,@my_stage
、@my_stage/folder
。这个值必须放在双引号内。
指定
spec.containers.volumeMounts
字段以描述在应用程序容器中将卷挂载到何处。您在此字段中提供的信息对于所有支持的存储卷都是相同的。 例如:volumeMounts: - name: <name> mountPath: <absolute-directory-path>
在以下示例规范中,app
容器挂载了 @model_stage
内部暂存区:
spec:
containers:
- name: app
image: <image1-name>
volumeMounts:
- name: models
mountPath: /opt/models
volumes:
- name: models
source: "@model_stage"
访问控制要求¶
服务的所有者角色是用于创建服务的角色。这也是服务在与 Snowflake 交互时使用的角色。所有者角色确定授予应用程序容器访问已挂载暂存区的权限。所有者角色必须对暂存区具有 READ 权限。
如果所有者角色在某个暂存区没有 WRITE 权限,则该暂存区的挂载为只读。也就是说,容器只能从暂存区读取文件。所有者角色需要暂存区挂载的暂存区 WRITE 权限才能支持读取和写入。
准则和限制¶
当应用程序容器使用暂存区挂载时,以下准则和限制适用:
限制
以下是一般限制。如果您在这些限制方面遇到任何问题,请联系您的账户代表。
每项服务最多可支持五个暂存区卷。这引用了 服务规范 中的
spec.volumes
字段。每个节点仅支持八个暂存区挂载。 Snowflake 管理每个节点的暂存区挂载限制,与管理内存、CPU 和 GPU 的方式类似。当现有节点无法支持所请求的暂存区挂载时,启动新的服务实例可能会导致 Snowflake 启动新节点。
您只能在暂存区中挂载暂存区或子目录。例如,
@my_stage
、@my_stage/folder
。您不能在一个暂存区挂载单个文件,例如@my_stage/folder/file
。不支持外部暂存区。仅支持 Snowflake 内部暂存区。
AWS 上的账户同时支持 SNOWFLAKE_FULL 和 SNOWFLAKE_SSE 暂存区加密(请参阅 内部暂存区参数)。
Azure 上的账户目前支持 SNOWFLAKE_SSE 加密暂存区。在执行 CREATE STAGE 时,请使用 ENCRYPTION 参数指定加密类型:
CREATE STAGE my_stage ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
不支持从多个暂存区挂载(安装在不同容器上的同一个暂存区卷)对同一文件进行并发写入。
暂存区挂载不是完全 POSIX 兼容的文件系统。例如:
文件和目录重命名不是原子的。
不支持硬链接。
监控文件系统变更的 Linux 内核子系统索引节点通知 (inotify) 不适用于暂存区挂载。
准则
暂存区挂载针对顺序读写进行了优化。
避免在暂存区挂载中同时写入多个文件。
暂存区挂载 I/O 操作的延迟可能高于容器文件系统和块存储卷上的 I/O 操作。您应始终检查 I/O 操作的状态码,以确保它们成功。
为保持性能,请避免创建或修改大于 25 GB 的文件。
暂存区挂载异步上传文件更新。只有在成功关闭或刷新文件描述符后,才能保证在暂存区挂载中对文件所做的变更保留到暂存区中。暂存区挂载中的文件变更可能会有一些延迟才能对其他容器和 Snowflake 可见。
已挂载暂存区中的每个目录应包含少于 100,000 个文件。预计
readdir
延迟会随着目录中文件数量的增加而增加。暂存区挂载不是网络文件系统。不要使用暂存区挂载进行多客户协调。
不要同时打开同一个文件的多个句柄。使用打开的文件句柄进行读取或写入操作,但不能将两者混用。要在写入文件后读取文件,请关闭该文件,然后在读取之前重新打开该文件。