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

无需本地下载,将Kaggle数据集上传至AWS S3的方案咨询

解决方案:通过AWS Lambda将Kaggle数据集直接传输到S3

可行性分析

该方案可行,但需通过流式传输规避Lambda的临时存储限制。Lambda自带的/tmp目录最大仅10GB,无法存储完整的50GB文件,但通过“边下载边上传到S3”的流式处理方式,无需将完整文件落地到本地,可绕过这一限制。需注意Lambda的最长执行时间为15分钟,需确保数据集的下载+上传过程能在该窗口内完成(取决于Kaggle的出口速率与S3的上传速率)。

实现步骤

1. 准备Kaggle认证信息

从Kaggle账户获取API Token(kaggle.json文件),将其存储到AWS Secrets Manager中,避免硬编码在代码里。

2. 创建包含Kaggle依赖的Lambda层

Lambda默认环境未预装kaggle包,需打包依赖作为自定义层:

  • 在本地创建与Lambda目标Python版本匹配的虚拟环境(以Python 3.9为例):
    python3.9 -m venv kaggle-layer
    source kaggle-layer/bin/activate
    pip install kaggle
    deactivate
    
  • 进入虚拟环境的site-packages目录,将所有依赖文件打包为ZIP:
    cd kaggle-layer/lib/python3.9/site-packages
    zip -r ../../../../kaggle-layer.zip .
    
  • 在AWS Lambda控制台上传该ZIP包,创建新的层。

3. 配置Lambda权限

为Lambda执行角色添加以下权限:

  • SecretsManagerRead权限:用于读取存储的Kaggle认证信息
  • S3PutObject权限:用于将数据写入目标S3存储桶
  • CloudWatchLogsFullAccess:用于调试日志查看

4. 编写Lambda流式传输代码

核心逻辑是通过Kaggle API获取数据流,直接上传到S3,不落地到本地临时存储:

import os
import boto3
import json
from kaggle.api.kaggle_api_extended import KaggleApi

def lambda_handler(event, context):
    # 从Secrets Manager读取Kaggle认证信息
    secrets_manager = boto3.client('secretsmanager')
    secret_response = secrets_manager.get_secret_value(SecretId='kaggle-api-token')
    kaggle_creds = json.loads(secret_response['SecretString'])
    
    # 配置Kaggle API环境变量
    os.environ['KAGGLE_USERNAME'] = kaggle_creds['username']
    os.environ['KAGGLE_KEY'] = kaggle_creds['key']
    
    api = KaggleApi()
    api.authenticate()
    
    # 替换为你的数据集名称、目标S3桶和存储路径
    dataset_name = 'theRequieredDataset'
    s3_bucket = 'your-target-s3-bucket'
    s3_key = f'datasets/{dataset_name}.zip'
    
    # 流式下载数据集并直接上传到S3
    with api.datasets_download(dataset=dataset_name, path=None, quiet=False) as response:
        s3_client = boto3.client('s3')
        s3_client.upload_fileobj(response, s3_bucket, s3_key)
    
    return {
        'statusCode': 200,
        'body': f'Dataset {dataset_name} successfully uploaded to S3://{s3_bucket}/{s3_key}'
    }

注:若数据集为单文件,可改用api.datasets_download_file()指定具体文件名。

关键注意事项

  • 执行时间限制:若50GB数据传输超时,可拆分任务(如按数据集内的文件分批处理),用AWS Step Functions编排多个Lambda执行。
  • Kaggle API速率限制:避免短时间内频繁调用,可添加重试机制。
  • 网络优化:若Lambda配置在VPC内,需启用NAT网关以优化外部网络访问Kaggle的速率。

替代方案

若Lambda的时间/存储限制无法满足需求,可考虑以下方案:

  • AWS EC2实例:挂载足够容量的EBS卷,直接下载数据集后上传到S3,无运行时间限制,适合超大规模文件。
  • AWS Glue作业:最长可运行48小时,支持更大临时存储,可运行Kaggle下载脚本完成传输。
  • ECS Fargate容器:在容器中执行kaggle datasets download ... | aws s3 cp - s3://bucket/path,实现流式传输,无需存储完整文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:27:36