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个地点被打印。
疑问
- 是否误解了Glue Job的Automatically Scale特性?
- 限制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
相关产品推荐
相关产品推荐

