You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Glue Job不必要Worker使用问题及自动扩缩容疑问

AWS Glue 4.0 任务Worker扩缩容与并行执行问题

问题背景

我运行一个Glue 4.0示例任务,核心代码如下:

locations = ['Singapore', 'Australia', 'Brazil'] 
# Process tables in parallel using Spark's parallelize method
sc.parallelize(locations).foreach(
    lambda location: process_locations(
        location=location
    )
)

# Commit the job bookmarks after processing all tables
job.commit()

其中process_locations函数仅打印传入的地点:

def process_locations(location): 
    print(location)

代码可正常打印地点,但调整Worker数量时出现异常:

  • 开启自动扩缩容时,预期使用4个Worker(3个执行器+1个驱动),但日志显示生成15个Worker,仅3个有打印内容;
  • 将最大Worker数设为2时,仅生成2个日志文件,且仅1个地点被打印。

疑问

  1. 是否误解了Glue Job的Automatically Scale特性?
  2. 限制Worker数为2时,为何遗漏另外2个地点的打印?

解答

1. 关于Glue自动扩缩容的误解

你确实对Glue的Automatically Scale特性存在误解:

  • Glue的自动扩缩容不是固定按“执行器数+驱动”来分配Worker,而是基于Spark作业的实时资源需求动态调整Worker数量。它会根据作业的任务并行度、数据量、计算负载等因素,自动创建或释放Worker,日志里的15个Worker是作业运行过程中曾经启动过的总数,而非同时运行的数量。
  • 你用sc.parallelize(locations)生成了3个分区(对应3个并行任务),只有处理这3个任务的Worker会执行print操作并产生相关日志,其他Worker可能是Glue为作业初始化、资源预分配或内部调度临时创建的,没有处理用户任务,因此不会有打印输出。
  • Glue的驱动节点不算入Worker计数,Worker仅指承载Spark执行器的节点,所以你预期的“3个执行器+1个驱动=4个Worker”本身就是错误的,驱动节点是独立于Worker的。

2. 限制Worker数为2时遗漏打印的原因

出现这种情况主要和Spark任务调度、Glue日志收集机制有关:

  • 当你限制最大Worker数为2时,Spark会将3个任务分配到2个执行器上(比如1个执行器处理2个任务,另1个处理1个),理论上3个地点都应该被打印,但你只看到1个,大概率是日志输出未被完整捕获:
    • Glue的Worker日志会上传到S3,但如果任务执行速度极快,Worker在日志上传完成前就被销毁,部分日志会丢失;
    • 同一个Worker上的多个任务输出可能被合并到同一份日志文件中,但你可能只查看了其中部分内容,或者日志文件存在延迟加载的情况。
  • 另外,Spark的foreach是行动算子,任务在执行器上异步执行,如果执行器出现资源竞争或短暂调度延迟,也可能导致部分print输出未被正确记录,但实际上任务已经执行完成。

内容的提问来源于stack exchange,提问作者Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:11:18