优化写入

通过将写入与底层存储(UFS)解耦,加速 Alluxio 中的写入密集型工作负载。本指南涵盖了提高吞吐量和减少延迟的两种主要方法:客户端写入缓存(仅限 FUSE)和集群级写入缓存

客户端写入缓存(仅限 FUSE)

客户端写入缓存是 FUSE 独有的功能,它通过将数据缓冲到本地磁盘,然后异步持久化到 UFS 来提高写入性能。这种方法最大限度地减少了网络开销,非常适合对性能敏感的任务。

概述

主要优点包括:

  • 高吞吐量: 对于大型顺序写入,实现接近本地磁盘的写入速度。

  • 快速创建小文件: 允许快速创建许多小文件,而无需等待 UFS 操作。

用例和限制

在使用客户端写入缓存之前,请了解这些关键的权衡:

  • 数据丢失风险: 如果在异步上传到 UFS 完成之前本地磁盘发生故障,本地磁盘缓冲区上的数据将会丢失

  • 硬件依赖: 本地缓冲区必须是高性能 SSD。使用标准 HDD 不会带来显著的性能提升。

  • 写后读一致性: 通过缓存写入的文件在异步上传完成之前无法读取

由于这些限制,客户端写入缓存最适合能够容忍少量数据丢失风险的性能关键型任务,例如写入中间 AI 模型检查点。

启用客户端写入缓存

配置需要在 FUSE 客户端上设置静态属性并定义基于路径的动态规则。

静态配置

在每个 FUSE 客户端节点上的 conf/alluxio-site.properties 中添加以下内容。请注意,属性名称使用内部术语 write.back

# Enable the client-side write cache feature
alluxio.user.write.back.enabled=true
# Set the local directory for the write cache buffer (must be on an SSD)
alluxio.user.fuse.write.back.dir=/data/alluxio/writeback
# Define the local disk quota for the buffer (0 means no limit)
alluxio.user.fuse.write.back.dir.quota=1TB

基于路径的动态配置

使用正则表达式为特定的 Alluxio 路径激活缓存。您可以通过向协调器的 REST API 发送 PUT 请求来动态设置这些规则。

$curl -sS 'http://<coordinator-host>:19999/api/v1/conf' -X PUT -H 'Content-Type: application/json' --data '{"key":"PathConfigEntity","conf":"{\"configs\":[{\"randomWriteEnabled\":false,\"localWriteBackEnabled\":true,\"uploadIntervalMs\":null,\"regexPattern\":\"/test/b/.*\"}]}"}'

conf 值是一个定义基于路径的规则的 JSON 字符串。例如:

{
  "configs": [
    {
      "localWriteBackEnabled": true,
      "regexPattern": "/user/ai_user1/checkpoint/.*"
    },
    {
      "localWriteBackEnabled": true,
      "regexPattern": "/user/ai_user2/checkpoint/.*"
    }
  ]
}

注意: API 目前仅支持替换整个配置。

空间不足时的降级模式

为防止在超出本地磁盘配额时出错,您可以将缓存配置为回退到同步写入。在这种“降级模式”下,新的写入将被阻塞,直到缓冲的文件上传到 UFS,从而释放空间。后续写入将绕过缓冲区直接写入 UFS,直到缓冲区恢复正常。

使用以下属性启用此回退行为:

alluxio.user.fuse.write.back.degraded.sync.write.on.insufficient.space=true

加速小文件写入

为了加快写入许多小文件的速度,请启用布隆过滤器。它通过快速确定文件存在来避免昂贵的 UFS 检查。

alluxio.user.fuse.write.back.status.bloom.filter.enabled=true

布隆过滤器默认容量为 1000 万个项目,每 5 分钟刷新一次。如果您观察到较高的误报率(通过 alluxio_write_back_bloom_filter_fpp 指标),可以缩短刷新周期:

alluxio.user.fuse.write.back.status.bloom.filter.refresh.period=1min

默认情况下,空文件是同步写入的。要加速空文件的创建,可以禁用此优化:

alluxio.user.fuse.write.back.sync.flush.empty.file=false

处理上传失败

如果文件连续三次上传到 UFS 失败,它将被标记为失败并移动到缓存目录中的 UPLOAD_FAILED 子目录。这些文件不会自动删除以防止数据丢失。请监控 alluxio_upload_manager_upload_failed_files 指标并手动处理这些文件。

集群级写入缓存

对于 UFS 性能是主要瓶颈的工作负载,集群级写入缓存提供最大的写入性能。数据直接写入构成写入缓存的一组专用 Alluxio 组件,完全绕过 UFS 进行初始写入。

此功能非常适合不需要立即持久化的临时数据,例如:

  • AI 模型训练检查点。

  • 大规模数据处理作业的 Shuffle 数据。

概述

集群级写入缓存是一个独立于标准 Alluxio 工作节点管理的存储集群。客户端直接与缓存组件交互,处理为写入缓存挂载的任何路径。

部署集群级写入缓存

使用 Alluxio Operator for Kubernetes 部署集群级写入缓存。部署在 AlluxioCluster 定义的 cacheOnly 部分下进行配置,这反映了内部组件名称。

apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
metadata:
  name: alluxio
spec:
  image: <PRIVATE_REGISTRY>/alluxio-enterprise
  imageTag: <TAG>
  
  # ... other configurations ...

  cacheOnly:
    enabled: true
    mountPath: "/write-cache"
    image: <PRIVATE_REGISTRY>/alluxio-cacheonly
    imageTag: <TAG>
    license: <YOUR_BASE64_ENCODED_LICENSE>
    
    journal:
      storageClass: "gp2"

    worker:
      count: 2
    tieredstore:
      levels:
        - level: 0
          alias: SSD
          mediumtype: SSD
          path: /data1/cacheonly/worker
          type: hostPath
          quota: 10Gi

访问集群级写入缓存

部署后,所有对配置的 mountPath(例如 /write-cache)的请求都将路由到集群级写入缓存。

通过 Alluxio CLI 访问:

bin/alluxio fs ls /write-cache

通过 Alluxio FUSE 访问:

cd ${fuse_mount_path}/write-cache
echo '123' > test.txt
cat test.txt

异步持久化到 UFS

对于最终需要持久化的数据,Alluxio 提供可选的异步持久化机制,将数据从缓存路径上传到相应的 UFS 路径。

限制

  • 元数据操作: 仅支持基本的文件持久化;像 rename 这样的操作无法可靠处理。

  • 无 UFS 清理: 从缓存中删除文件不会从 UFS 中删除它。

  • 无协调: Alluxio 无法自动协调缓存和 UFS 之间文件的不同版本。

配置

要启用异步持久化,请在标准 Alluxio 主节点和集群级写入缓存的主节点上配置文件路径映射文件。

  1. alluxio-site.properties 中设置属性

    属性
    描述

    alluxio.gemini.master.async.upload.local.file.path

    异步上传路径映射 JSON 文件的路径。

  2. 创建 JSON 映射文件。此文件定义了从缓存路径到 UFS 支持的 Alluxio 路径的映射。请注意,cacheOnlyMountPoint 键是必需的。

    {
      "cacheOnlyMountPoint": "/write-cache",
      "asyncUploadPathMapping": {
        "/write-cache/a": "/s3/a",
        "/write-cache/b": "/local/c"
      },
      "blackList": [
        ".tmp"
      ]
    }

高级配置

多副本写入

通过设置复制因子,在集群级写入缓存中启用多副本写入以实现容错。

# In your AlluxioCluster spec:
properties:
  "alluxio.gemini.user.file.replication": "2"

分段上传

通过在客户端内存中缓冲数据并在后台上传来提高写入性能。请注意,属性名称使用内部术语 cache.only

# In your AlluxioCluster spec:
properties:
  "alluxio.gemini.user.file.cache.only.multipart.upload.enabled": "true"
  "alluxio.gemini.user.file.cache.only.multipart.upload.threads": "16"
  "alluxio.gemini.user.file.cache.only.multipart.upload.buffer.number": "16"

注意: 此功能会显著增加客户端内存使用量。

缓存驱逐

集群级写入缓存中的文件不会自动驱逐。您必须使用 rmalluxio fs rm 手动删除它们以释放空间。

Last updated