数据存储方案:选对存储,回放分析就成功了一半
做数据回放分析,说白了就是跟数据存储打交道。我这些年折腾过不少存储方案,踩过的坑能绕公司三圈。今天咱们就聊聊文件存储、数据库存储和云存储这三类方案,看看它们各自适合什么场景。
文件存储:最朴素的方案,但别小看它
文件存储是最基础的方式。你想想看,数据回放分析的第一步,就是把数据存下来。文件存储简单直接,但选对格式很重要。
CSV:人人都能看懂,但性能堪忧
CSV 格式我最早接触。那时候刚入行,觉得 CSV 多方便啊,Excel 能打开,Python 能读,谁都能用。但后来我发现,CSV 在大数据场景下就是个坑。
- 没有 schema 信息,字段类型全靠猜
- 压缩率低,存储空间浪费严重
- 读取速度慢,尤其是按列读取时
- 不支持嵌套结构,复杂数据得拆成多个文件
我曾经有个项目,每天产生 500GB 的 CSV 日志。查询一次要等十几分钟,后来换成 Parquet,同样的数据量,查询时间降到了 30 秒。嗯,这里要注意,CSV 只适合小规模数据或者临时分析。
Parquet:列式存储的王者
Parquet 是我现在最常用的文件格式。它采用列式存储,配合压缩算法,性能提升非常明显。
# 用 PySpark 写 Parquet 文件
df.write \
.mode("overwrite") \
.parquet("hdfs://data/events/")
# 读取时自动推断 schema
df = spark.read.parquet("hdfs://data/events/")
df.printSchema()
我个人习惯用 Parquet 存储时序数据。为什么呢?因为回放分析经常要按时间范围过滤数据,Parquet 的谓词下推功能能跳过不相关的数据块,读取效率极高。
| 特性 | CSV | Parquet | Avro |
|---|---|---|---|
| 存储方式 | 行式 | 列式 | 行式 |
| 压缩率 | 低 | 高(可达到 10:1) | 中 |
| 读取性能 | 慢 | 快(按列读取) | 中 |
| Schema 支持 | 无 | 强 | 强 |
| 适用场景 | 小数据、临时分析 | 大数据分析、数据仓库 | 数据序列化、消息队列 |
Avro:序列化的好帮手
Avro 跟 Parquet 不一样,它是行式存储。你想想看,什么时候需要行式存储?当你要一条一条处理数据的时候。比如 Kafka 消息的序列化,Avro 就是首选。
数据库存储:需要实时查询时,别犹豫
文件存储虽然好,但有个硬伤——不支持实时查询。你想想看,如果我要查某个时间点的数据,文件存储得全量扫描,数据库就不一样了。
时序数据库 InfluxDB:专为时间序列而生
InfluxDB 是我做回放分析时的利器。它针对时间戳做了大量优化,写入和查询速度都很快。
-- 创建保留策略,自动清理旧数据
CREATE RETENTION POLICY "one_year" ON "mydb" DURATION 365d REPLICATION 1 DEFAULT
-- 查询最近一小时的 CPU 使用率
SELECT mean("usage_user") FROM "cpu"
WHERE time > now() - 1h
GROUP BY time(5m)
我曾经有个物联网项目,每秒要写入 10 万条数据。用 MySQL 根本扛不住,换成 InfluxDB 后,写入延迟从 500ms 降到了 5ms。说白了,时序数据就该用时序数据库。
关系型 MySQL:结构化数据的稳妥选择
MySQL 虽然老,但胜在稳定。如果你的数据回放分析需要复杂的关联查询,MySQL 还是靠谱的。
我建议这样用:把元数据(比如设备信息、用户信息)存在 MySQL 里,时序数据存在 InfluxDB 或文件里。这样既保证了关联查询的能力,又避免了大数据量下的性能问题。
云存储:弹性扩展,按需付费
云存储的好处不用多说。你想想看,本地存储扩容得买硬盘、装机器,云存储一个 API 调用就搞定了。
S3 和 OSS:对象存储的标杆
AWS S3 和阿里云 OSS 本质上是一样的——对象存储。它们适合存什么?大文件、冷数据、备份数据。
# 用 boto3 上传文件到 S3
import boto3
s3 = boto3.client('s3')
s3.upload_file('data.parquet', 'my-bucket', 'events/2024/01/data.parquet')
# 生成预签名 URL,临时分享数据
url = s3.generate_presigned_url(
'get_object',
Params={'Bucket': 'my-bucket', 'Key': 'events/2024/01/data.parquet'},
ExpiresIn=3600
)
我个人习惯把历史数据归档到 S3 或 OSS。比如三个月前的数据,查询频率很低,放在本地存储就是浪费钱。云存储的冷存储方案,成本能降到本地存储的十分之一。
知识体系总览
下面这张图,是我对数据存储方案的总结。你一看就明白了。
这张图把三种存储方案的核心特性都列出来了。你想想看,文件存储成本低但实时性差,数据库存储性能好但成本高,云存储扩展性强但查询慢。没有完美的方案,只有最适合你场景的方案。
可可精品资料库