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

AWS SageMaker批量转换大Parquet文件时split_type报错求助

解决AWS SageMaker批量转换Parquet文件的拆分与内存问题

问题根源

你遇到的核心矛盾是:

  • 使用split_type='Line'会破坏Parquet的二进制结构:Parquet是列存二进制格式,按行(换行符)拆分后,每个批次的内容不再是完整的Parquet文件,导致pd.read_parquet无法识别魔法字节。
  • 不设置split_type时,max_payload=100仍触发"Too much data for max payload size",说明你的Parquet文件行组(row group)大小超过了100MB,SageMaker无法拆分单个行组。

解决方案

方案1:移除split_type,利用SageMaker对Parquet的原生拆分支持

SageMaker对Parquet格式有原生支持,会自动按行组拆分数据,无需指定split_type='Line'。你需要:

  1. 确保Parquet文件的行组大小不超过max_payload设置的值(单位MB)。如果原文件行组过大,先预处理拆分。
  2. 修正模型代码中的笔误(output_fn中误用output变量)。

修正后的Transformer代码

transformer = Transformer(
    model_name=model_name,
    instance_type='ml.m5.4xlarge',
    instance_count=1,
    output_path=output_path,
    accept='application/x-parquet',
    strategy='MultiRecord',
    max_payload=100,  # 单位为MB,根据实例内存调整
)
transformer.transform(
    data=data, 
    content_type='application/x-parquet'
    # 移除split_type参数,SageMaker自动处理Parquet行组拆分
)

修正后的模型代码

from io import BytesIO
import pandas as pd

def input_fn(input_data, content_type):
    if content_type == 'application/x-parquet':
        data = BytesIO(input_data)
        df = pd.read_parquet(data)
        return df
    else:
        raise ValueError(f"{content_type} not supported by script!")


def output_fn(prediction, accept):
    if accept == "application/x-parquet":
        buffer = BytesIO()
        # 修正:将output改为prediction,同时添加seek(0)确保读取完整内容
        prediction.to_parquet(buffer)
        buffer.seek(0)
        return buffer.getvalue()
    else: 
        raise Exception(f"Requested unsupported ContentType in Accept: {accept}")

方案2:预处理拆分大Parquet文件(推荐)

如果原Parquet文件的行组过大(超过max_payload),SageMaker无法拆分单个行组,此时建议先将大文件拆分为多个小Parquet文件(每个大小接近max_payload),再进行批量转换:

拆分Parquet的示例代码

import pyarrow.parquet as pq

# 读取大Parquet文件
table = pq.read_table("s3://your-bucket/path/to/large_file.parquet")
# 按行组拆分,写入到指定目录(会生成多个小Parquet文件)
pq.write_to_dataset(
    table,
    root_path="s3://your-bucket/path/to/split_parquets",
    max_row_group_size=100_000  # 根据单条数据大小调整,确保单个行组不超过100MB
)

之后将transformer.transform中的data参数指向拆分后的目录即可,SageMaker会自动遍历所有小文件进行处理,大幅降低单批次内存压力。

关键注意事项

  • Parquet的压缩格式:优先使用Snappy压缩,它支持流式读取,更适合SageMaker的批量拆分场景。
  • max_payload的单位是MB,不要混淆为KB或GB。
  • 实例内存:如果拆分后仍有内存问题,可升级到更大的实例(如ml.m5.8xlarge),但预处理拆分是更经济的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:21:11