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

Spark将大型单Parquet文件转Delta表失败求助

问题背景

集群详情

  • Spark 3.4
  • 5个executor
  • 节点配置:16核、112GB内存

Parquet文件详情

  • 第三方提供
  • 源文件存储于ADLS
  • 单个20GB .parquet文件
  • 6800万行数据
  • 1599列
  • 5034个行组

尝试通过Spark SQL将该文件的部分列(所有行)写入新的Delta表,但即使是简单的count(*)操作也会失败。已尽可能简化操作,例如仅写入最小列的10行,执行如下代码仍失败:

CREATE TABLE db.my_table
USING DELTA
AS
SELECT  my_teeny_tiny_column
FROM parquet.`abfss://mycontainer@mystorageaccount.dfs.core.windows.net/files/myfile.parquet`
LIMIT 10

报错信息:
来自异常节点的容器:container_1722263226188_0007_01_000003,主机:vm-######。退出状态:143。诊断信息:[2024-07-29 20:43:20.686]Container killed on request

尝试将文件从Parquet转写为Parquet也出现相同问题。仅执行查询部分可在Notebook中正常显示,但写入操作始终失败。


解决方向

1. 调整Parquet读取相关配置

该文件列数(1599列)和行组数量(5034个)过多,即使只读取单列,Spark解析元数据时仍可能加载大量冗余信息导致内存溢出。可尝试以下配置:

// 关闭Parquet统计信息加载,减少元数据处理压力
spark.conf.set("spark.sql.parquet.statistics.enabled", "false")
// 关闭过滤下推,避免不必要的行组扫描
spark.conf.set("spark.sql.parquet.filterPushdown", "false")
// 调整行组处理粒度,避免单个executor处理过多行组
spark.conf.set("spark.sql.parquet.rowGroupSize", "134217728") // 128MB

2. 拆分大文件预处理

先通过Spark提取目标列并拆分为小文件,再写入Delta表,降低单文件处理压力:

// 第一步:提取目标列并写出为小文件Parquet
spark.read.parquet("abfss://mycontainer@mystorageaccount.dfs.core.windows.net/files/myfile.parquet")
  .select("my_teeny_tiny_column")
  .write
  .mode("overwrite")
  .parquet("abfss://mycontainer@mystorageaccount.dfs.core.windows.net/files/temp_small_parquet")

// 第二步:从临时小文件创建Delta表
spark.sql("""
CREATE TABLE db.my_table
USING DELTA
AS
SELECT * FROM parquet.`abfss://mycontainer@mystorageaccount.dfs.core.windows.net/files/temp_small_parquet`
""")

3. 优化Executor内存与GC配置

退出状态143通常是容器因内存不足被调度器终止,写入阶段的内存需求比查询阶段更高,可调整内存参数:

// 增大executor内存及内存开销
spark.conf.set("spark.executor.memory", "64g")
spark.conf.set("spark.executor.memoryOverhead", "16g")
// 使用G1GC减少内存碎片,降低GC压力
spark.conf.set("spark.executor.extraJavaOptions", "-XX:+UseG1GC -XX:MaxGCPauseMillis=200")

4. 用Parquet工具预处理文件

借助parquet-tools直接提取目标列生成轻量Parquet文件,再交给Spark处理:

# 提取指定列到新文件(需先将ADLS文件下载到本地,处理后再上传)
parquet-tools cat --column my_teeny_tiny_column ./myfile.parquet > ./extracted.parquet

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:16:11