Linux服务器自动化:基于CDSAPI的ERA5日数据批量下载实战

张开发
2026/4/19 16:40:38 15 分钟阅读

分享文章

Linux服务器自动化:基于CDSAPI的ERA5日数据批量下载实战
1. 为什么需要自动化下载ERA5数据如果你正在研究气候变化、气象分析或者相关领域大概率会用到ERA5数据。作为欧洲中期天气预报中心ECMWF提供的第五代全球气候再分析数据ERA5包含了从1950年至今的各类气象要素时间分辨率高达小时级别空间分辨率达到0.25°×0.25°。但实际操作中你会发现一个头疼的问题官网虽然提供了下载入口但每次只能手动选择一个月的数据进行下载。想象一下如果你需要下载1950-2020年这70年的数据每个月都要重复相同的操作84次不仅耗时耗力还容易出错。更糟的是服务器连接不稳定时经常下载到一半就中断又得从头再来。我在做博士课题时就深受其害经常半夜爬起来检查下载进度。直到发现了CDSAPI这个神器配合Python脚本终于实现了配置一次自动下载的梦想。现在就把这套经过实战检验的方案分享给你让你也能告别手动下载的噩梦。2. 环境准备与CDSAPI配置2.1 服务器基础环境搭建首先确保你的Linux服务器已经准备好Python环境。我推荐使用Miniconda来管理环境既能隔离不同项目又不会污染系统Pythonwget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装完成后创建一个专属环境conda create -n era5 python3.8 conda activate era5接下来安装基础依赖库pip install numpy pandas cdsapi requests2.2 获取CDSAPI认证密钥CDSAPI需要通过密钥认证才能使用数据下载服务。登录Copernicus Climate Data Store官网在用户页面找到API key部分。你会看到类似这样的内容url: https://cds.climate.copernicus.eu/api/v2 key: 123456:abcdefgh-1234-5678-9012-345678901234这个密钥是你的个人凭证相当于下载数据的密码一定要妥善保管不要泄露。2.3 配置.cdsapirc文件在服务器上创建配置文件vim ~/.cdsapirc将刚才获取的url和key按以下格式填入url: https://cds.climate.copernicus.eu/api/v2 key: 123456:abcdefgh-1234-5678-9012-345678901234保存后记得修改文件权限chmod 600 ~/.cdsapirc这个步骤很关键我遇到过因为权限设置不当导致认证失败的情况。测试配置是否成功可以运行import cdsapi c cdsapi.Client()如果没有报错说明认证通过可以开始下载数据了。3. 核心下载脚本解析3.1 基础下载函数先来看最核心的下载函数我对其进行了优化增加了超时重试机制def download_month(year, month, variable2m_temperature, statisticdaily_mean, areaNone): c cdsapi.Client(timeout3600, retry_max5) params { product_type: reanalysis, variable: variable, statistic: statistic, year: year, month: month, time_zone: UTC00:00, format: netcdf } if area: # 设置下载区域 [北纬, 西经, 南纬, 东经] params[area] area try: result c.retrieve(reanalysis-era5-single-levels, params) filename fERA5_{variable}_{statistic}_{year}{month}.nc result.download(filename) return filename except Exception as e: print(f下载{year}-{month}失败: {str(e)}) return None这个函数有几个实用特性超时设置为1小时避免大数据量下载中断最多自动重试5次应对网络波动支持自定义下载区域减少不必要的数据量返回下载结果状态便于后续处理3.2 多进程批量下载单线程下载速度太慢我们可以利用多进程加速from multiprocessing import Pool def batch_download(years, months, variables, max_workers4): tasks [] for year in years: for month in months: for var in variables: tasks.append((year, month, var)) with Pool(max_workers) as pool: results pool.starmap(download_month, tasks) return results实测在16核服务器上设置max_workers8可以将下载速度提升5-6倍。不过要注意CDS服务器有并发限制建议不要超过8个进程每个进程都会占用内存监控服务器负载下载失败的任务会自动重试3.3 断点续传与日志记录长期下载任务最怕中途中断。我增加了日志功能记录下载进度import logging from datetime import datetime logging.basicConfig( filenameera5_download.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) def resume_download(checkpoint_fileprogress.json): try: with open(checkpoint_file) as f: progress json.load(f) except: progress {completed: []} all_tasks generate_tasks() # 你的任务生成逻辑 remaining [t for t in all_tasks if t not in progress[completed]] for task in remaining: success download_month(*task) if success: progress[completed].append(task) with open(checkpoint_file, w) as f: json.dump(progress, f)这样即使程序中断重新运行时会自动跳过已完成的月份从断点处继续下载。4. 实战技巧与性能优化4.1 参数选择建议ERA5提供了海量参数合理选择能显著提升效率参数类型推荐设置说明formatnetcdf比grib格式更通用grid0.5/0.5平衡精度与大小area根据需要全球数据量很大time00:00日数据只需一个时次对于区域研究一定要设置area参数。比如只下载中国区域area [54, 73, 18, 135] # 北纬54°到18°东经73°到135°4.2 服务器性能调优长时间运行下载任务时这些设置能提升稳定性使用tmux或screen保持会话tmux new -s era5_download设置合理的ulimit值ulimit -n 8192 # 提高文件描述符限制监控下载进度watch -n 60 ls -lh *.nc | wc -l # 每分钟检查文件数量4.3 常见问题排查遇到问题先检查这几个方面认证失败确认.cdsapirc文件位置和内容正确检查密钥是否过期每年需要更新一次下载中断增加timeout值检查服务器网络稳定性分批次下载不要一次性请求太多数据数据不符合预期仔细核对variable名称在CDS网页端先测试少量数据参考官方变量表https://confluence.ecmwf.int/display/CKB/ERA5datadocumentation5. 进阶应用场景5.1 自动化任务调度配合crontab可以实现定时自动下载0 3 * * * /path/to/conda/envs/era5/bin/python /path/to/download_script.py /path/to/logfile.log 21这个例子设置每天凌晨3点自动运行下载脚本适合追更最新数据。5.2 数据预处理流水线下载完成后通常需要预处理可以扩展脚本import xarray as xr def process_file(filename): ds xr.open_dataset(filename) # 执行你的处理逻辑如重采样、计算统计量等 processed ds.resample(time1D).mean() output_name fprocessed_{filename} processed.to_netcdf(output_name) return output_name5.3 与云存储集成如果使用AWS等云服务可以自动上传到S3import boto3 def upload_to_s3(local_path, bucket): s3 boto3.client(s3) s3.upload_file(local_path, bucket, os.path.basename(local_path)) print(fUploaded {local_path} to {bucket})这套方案在我实验室已经稳定运行两年多累计下载了超过50TB的ERA5数据。最关键的体会是一定要做好错误处理和日志记录长期运行的任务总会遇到各种意外情况。现在我们的系统即使遇到网络中断也能自动恢复研究人员只需要在最后检查日志确认数据完整性即可。

更多文章