自动选择虚拟机

如果您使用 workerMachineType 流水线选项将作业固定到特定机器类型,则可能会因资源缺货而导致延迟或作业失败。自动虚拟机选择功能可解决此问题,它会使用 Compute Engine 实例灵活性,从兼容且可用的机器类型池中自动选择工作器。这有助于确保您的 Dataflow 流水线可靠地获取容量,从而帮助您保持一致的性能并避免中断。

不支持的配置

如果您的流水线配置了以下任一项,则系统会关闭“自动选择虚拟机”功能:

  • Dataflow Prime 已启用。
  • 设置了 min_cpu_platform 流水线选项。
  • 使用 Hyperdisk Balanced 磁盘或自定义预配性能(IOPS 和吞吐量)。使用这些配置启动的作业将会失败。
  • 机密虚拟机已启用。
  • 需要加速器(GPU 或 TPU)。
  • 不使用 Dataflow Shuffle 或 Streaming Engine 的作业。

启用自动选择虚拟机

在以下任一情况下,系统都会自动启用“自动选择虚拟机”功能:

  • 如果您为不需要加速器(GPU 或 TPU)的流水线步骤设置了 min_ram 或 cpu_count 资源提示。如需了解如何将资源提示与基于模板的作业搭配使用,请参阅流水线资源提示。

自动选择虚拟机行为

单独或组合配置 min_ram 和 cpu_count 资源提示。例如:

  1. 仅指定 cpu_count=2 的作业可能会预配具有 n4-standard-2(2 个 vCPU,8 GB RAM)、c4-standard-2(2 个 vCPU,7 GB RAM)和其他机器类型的实例。
  2. 同时具有 cpu_count=4 和 min_ram=16GB 的作业可能会预配具有 n4-standard-4(4 个 vCPU,16 GB RAM)、c4-highmem-4(4 个 vCPU,31 GB RAM)和其他机器类型的实例。

“自动选择虚拟机”功能可优化虚拟机选择,以确保资源可用性。这意味着,在使用自动虚拟机选择功能提高某些经过高度调优的作业的可获取性时,您可能会遇到性能下降的情况。我们建议您先在一部分现有作业上测试虚拟机自动选择功能,然后再逐步扩大部署范围。如需详细了解可获取性,请参阅 Batch 文档中的提高作业的资源可获取性。

Dataflow 会尝试先使用第 4 代机器家族(例如 N4 或 C4),以提高效率。如果您的区域中没有第 4 代机器、配额不足或与您的配置不兼容,Dataflow 会自动回退到广泛可用的第 2 代机器家族(例如 N2 或 E2),以确保您的作业可以启动,而不会因容量问题而延迟。

如果您在使用资源提示(右侧拟合)启用自动虚拟机选择功能时指定了 pd-ssd 或 pd-standard 等磁盘类型,Dataflow 将仅预配兼容的第 2 代机器家族。为确保实现最大兼容性并允许使用较新的机器世代,请勿分配磁盘类型。

查看所选机器类型

由于自动虚拟机选择功能会在创建工作器虚拟机时选择机器类型,因此作业的工作器可以使用不同的机器类型。如需查看作业使用的机器类型,请使用 Cloud Monitoring API 查询工作器虚拟机指标。Cloud Monitoring 会在 machine_type 系统元数据标签中记录每个工作器虚拟机的机器类型。Dataflow 会向每个工作器虚拟机添加 dataflow_job_id 标签。

如需运行以下命令,您需要安装 Google Cloud CLI 和 curl。如需获得查询指标所需的权限,请让您的管理员为您授予项目的 Monitoring Viewer (roles/monitoring.viewer) 角色。

以下命令会列出 Dataflow 作业的工作器使用的机器类型。该命令会调用 projects.timeSeries.list 方法,并仅使用内置 shell 命令将响应格式化为表格:

PROJECT_ID="PROJECT_ID"
JOB_ID="JOB_ID"
START_TIME="${JOB_ID%%_*}T00:00:00Z"
END_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)"

TOKEN="$(gcloud auth print-access-token)" &&
RESPONSE="$(curl -fsS --get \
    "https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/timeSeries" \
    -H "Authorization: Bearer ${TOKEN}" \
    --data-urlencode "filter=metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\" metadata.user_labels.\"dataflow_job_id\"=\"${JOB_ID}\"" \
    --data-urlencode "interval.startTime=${START_TIME}" \
    --data-urlencode "interval.endTime=${END_TIME}" \
    --data-urlencode "aggregation.alignmentPeriod=60s" \
    --data-urlencode "aggregation.perSeriesAligner=ALIGN_MEAN" \
    --data-urlencode "aggregation.crossSeriesReducer=REDUCE_COUNT" \
    --data-urlencode 'aggregation.groupByFields=metadata.system_labels."machine_type"' \
    --data-urlencode "view=FULL" \
    --data-urlencode "prettyPrint=true" \
    --data-urlencode "fields=timeSeries.metadata,timeSeries.points.value,nextPageToken")" &&
printf '%s\n' "$RESPONSE" | {
  printf '%-22s%s\n' MACHINE_TYPE PEAK_INSTANCES
  type= peak=0
  while IFS= read -r line; do
    case $line in
      *'"int64Value": "'*)
        v=${line#*'"int64Value": "'}; v=${v%%'"'*}
        [ "$v" -gt "$peak" ] && peak=$v ;;
      *'"machine_type": "'*)
        type=${line#*'"machine_type": "'}; type=${type%%'"'*} ;;
      '    }' | '    },')
        [ -n "$type" ] && printf '%-22s%s\n' "$type" "$peak"
        type= peak=0 ;;
      *'"nextPageToken":'*)
        printf 'Warning: output is incomplete; use a shorter time range.\n' >&2 ;;
    esac
  done
}

替换以下内容:

  • PROJECT_ID:运行作业的项目的 ID
  • JOB_ID:Dataflow 作业的 ID

输出中包含与作业工作器使用的每种机器类型对应的行。PEAK_INSTANCES 列显示同时运行的该机器类型的工作器数量上限。输出类似于以下内容:

MACHINE_TYPE          PEAK_INSTANCES
c4-standard-2         1
n4-standard-2         4

该命令会根据每个正在运行的虚拟机报告的 compute.googleapis.com/instance/cpu/utilization 指标,统计每分钟内作业中每种机器类型的虚拟机数量。指标数据最长可能需要 4 分钟才会显示在 Monitoring 中,并且该命令可能不会统计运行时间少于 1 分钟的虚拟机。

任务 ID 以任务的创建日期(太平洋时间)开头。默认情况下,START_TIME 是该日期的世界协调时间 (UTC) 午夜,始终在作业开始之前,END_TIME 是当前时间。如需查询其他时间范围,请将 START_TIME 和 END_TIME 设置为 RFC 3339 格式的 UTC 时间戳。例如 START_TIME="2026-11-04T18:00:00Z" 和 END_TIME="2026-11-05T18:00:00Z"。

如果该命令输出警告,提示输出不完整,请针对较短的时间范围运行该命令。对于运行数周的作业,可能会出现此警告。

Monitoring 会以 10 分钟为间隔存储超过 6 周的数据。如需查询该数据,请将 aggregation.alignmentPeriod 更改为 600s。

限制

使用自动虚拟机选择功能时,系统会为使用可移植运行程序的流处理作业停用可移植运行程序容器映像更新。

Compute Engine 预留

如果您将 Compute Engine 预留与“自动选择虚拟机”功能搭配使用,请注意以下事项:

  • 如果您有配置为自动使用的预留,则当“自动选择虚拟机”功能预配与预留匹配的机器类型时,系统可能会使用这些预留。
  • 自动选择虚拟机功能会使用可用的计算实例。因此,您无法指定服务使用特定预留中的实例。

已知问题

使用“自动选择虚拟机”功能时,请注意以下已知问题:

意外的并行

如果您在使用自动虚拟机选择功能和适当调整功能时,发现工作器虚拟机的 CPU 利用率较低或并行度不符合预期,请检查以下设置。

横向自动扩缩

如果您停用横向自动扩缩,作业运行时的最大并行数量可能会低于预期。为避免此问题,请保持启用横向自动扩缩。如需了解详情,请参阅适配支持和限制。

工作器执行线程

默认情况下,Dataflow 会根据所选机器类型的 vCPU 数量设置每个工作器的线程数。如果您仍然观察到 CPU 利用率低或并行性不符合预期,则可以通过设置 numberOfWorkerHarnessThreads 或 number_of_worker_harness_threads 流水线选项来替换默认值。此选项会全局应用于流水线中的所有工作器池。