AWS Glue读取Databricks JDBC大数据集时Spark并行失效问题
问题解决:AWS Glue读取Databricks JDBC数据时单Executor工作、超时问题
核心原因
JDBC读取未配置分区参数,导致Spark无法将数据拆分到多个分区并行处理;同时写入时未做重分区,单文件写入加重单Executor负载。
解决方案步骤
1. 配置JDBC分区读取,实现并行拉取
在create_dynamic_frame_from_options的connection_options中添加分区相关参数,利用Databricks表中的数值型或日期型字段做分区键,让Spark启动多个并行任务拉取数据:
dynamic_frame = glueContext.create_dynamic_frame_from_options( connection_type="jdbc", connection_options={ "url": "jdbc:databricks://<databricks-instance>", "dbtable": f"({query}) t", "user": "<databricks-user>", "password": "<databricks-password>", "driver": "com.databricks.driver.jdbc.Driver", # 新增分区配置 "partitionColumn": "id", # 替换为你表中存在的数值型/日期型字段,比如自增ID、创建时间 "lowerBound": "1", # 分区字段的最小值 "upperBound": "45000000", # 分区字段的最大值(对应4500万行) "numPartitions": "10" # 要拆分的分区数,根据Glue集群的executor数量调整,比如10-20 } )
注意:partitionColumn必须是查询结果中存在的字段,且字段类型支持范围拆分;numPartitions建议设置为集群executor数量的1-2倍,避免资源浪费。
2. 写入前重分区,并行生成多个Parquet文件
将DynamicFrame转换为DataFrame后执行重分区,再转回DynamicFrame写入,让多个executor同时处理写入任务:
# 将DynamicFrame转为Spark DataFrame并重分区 df = dynamic_frame.toDF().repartition(10) # 分区数和JDBC读取的numPartitions对应或调整 repartitioned_dynamic_frame = DynamicFrame.fromDF(df, glueContext, "repartitioned_df") # 写入S3 glueContext.write_dynamic_frame.from_options( frame=repartitioned_dynamic_frame, connection_type="s3", connection_options={ "path": "s3://<s3-bucket>/<s3-prefix>" }, format="glueparquet" )
如果需要后续合并文件,可以在写入后用Glue的mergeFiles操作,或者在写入时设置groupFiles参数,但优先保证读取和写入的并行性解决超时问题。
3. 调整Glue集群配置(可选)
如果集群资源不足,可调整Glue作业的Worker类型和数量:
- 选择更大的Worker类型(比如G.2X、G.4X)
- 增加Worker数量,确保集群有足够的executor来处理并行任务
验证效果
调整后,Glue集群的多个executor会同时参与数据读取和写入,任务执行时间会显著缩短,避免超时;最终生成多个Parquet文件,总大小仍为450MB左右,数据完整性不受影响。
内容的提问来源于stack exchange,提问作者Meyer Cohen
相关产品推荐
相关产品推荐

