大信息领域列式存储与云存储的融合发展
从割裂到协同:大数据列式存储与云存储的融合之路
引言:大数据存储的“两难困境”
作为数据工程师,你是否曾遇到过这样的场景?
- 为了做用户行为分析,你用HDFS存了10TB的用户日志,用ORC格式压缩后查询还是要等半小时——行式存储的分析效率太低,列式存储虽然快,但本地集群扩容成本高得吓人;
- 领导说要降本增效,你把数据迁到了云对象存储(比如S3),结果查询时发现:云存储原生不支持高效的列裁剪和谓词下推,读全量数据的时间比本地HDFS还久——云存储的弹性是香,但分析性能拉胯;
- 业务侧要实时看昨天的GMV,你得先把实时流数据写到Kafka,再同步到HDFS转ORC,最后用Spark查询——数据链路太长,实时性根本达不到要求。
这些痛点的本质,是传统列式存储的“本地化”局限与云存储的“通用化”缺陷之间的矛盾。而解决这个矛盾的关键,正是列式存储与云存储的融合——用列式存储的“分析效率”补云存储的“性能短板”,用云存储的“弹性成本”解列式存储的“扩容痛点”。
本文将带你拆解:
- 列式存储与云存储的核心特性到底是什么?
- 为什么两者融合是大数据存储的必然趋势?
- 融合的关键技术有哪些?如何在实践中落地?
读完本文,你将掌握云原生列式存储的设计思路,能独立完成**“列式格式+云存储+计算引擎”**的融合架构搭建,甚至能将现有大数据系统的存储成本降低50%以上。
准备工作:你需要知道的前置知识
在开始之前,确保你已经掌握以下基础:
1. 技术栈/知识
- 大数据存储基础:了解HDFS、行式存储(如CSV、JSON)与列式存储(如Parquet、ORC)的区别;
- 云存储基础:熟悉对象存储(Object Storage)的概念(如AWS S3、阿里云OSS、Google GCS),知道“桶(Bucket)”“对象(Object)”“元数据(Metadata)”等术语;
- 分布式计算:会用Spark或Presto进行数据查询(能写简单的SQL或DataFrame代码)。
2. 环境/工具
- 一个云账号(推荐AWS免费套餐、阿里云体验账号,或用MinIO本地模拟对象存储);
- 安装Spark(3.x以上版本,支持云存储协议如
s3a); - 可选:Delta Lake或Apache Iceberg(云原生表格式,用于元数据管理)。
第一章:先搞懂——列式存储与云存储的“核心能力”
在讲融合之前,我们需要先“拆”开两者的核心特性——只有理解各自的优势与局限,才能明白融合的价值。
1.1 列式存储:为“分析”而生的存储格式
什么是列式存储?
传统的行式存储(如MySQL的InnoDB)按“行”存储数据:比如一条用户记录(user_id, name, age, order_amount)会被连续存放在磁盘上。而列式存储则按“列”存储:所有user_id存在一起,所有name存在一起,以此类推。
列式存储的核心优势(为什么分析场景选它?)
- 更高的查询效率:分析场景通常只需要查询部分列(比如“统计各用户的order_amount之和”),列式存储可以直接读取目标列的数据,不需要扫描全表(行式存储必须读完整行);
- 更好的压缩比:同一列的数据类型一致(比如order_amount都是数字),可以用更高效的压缩算法(如Snappy、Gzip),压缩比通常是行式存储的3-5倍;
- 支持谓词下推(Predicate Pushdown):计算引擎可以将过滤条件(比如“order_amount > 100”)推给存储层,存储层先过滤数据再返回给计算层,减少数据传输量。
常见的列式存储格式
- Parquet:Apache基金会项目,支持嵌套数据结构,兼容Spark、Presto等几乎所有大数据引擎;
- ORC:Hadoop生态的列式格式,压缩比更高,适合Hive场景;
- Delta Lake/Iceberg:云原生表格式(在Parquet之上加元数据层),支持事务、版本控制、增量查询。
1.2 云存储:为“弹性”而生的基础设施
什么是云存储?
云存储是云计算厂商提供的按需付费的存储服务,核心是“对象存储(Object Storage)”——数据以“对象”的形式存在“桶(Bucket)”中,每个对象包含数据本身、元数据(如文件名、大小、创建时间)和唯一标识符(Key)。
云存储的核心优势(为什么大数据选它?)
- 无限弹性:不需要购买服务器扩容,想存多少存多少,按需申请;
- 高可用性:厂商通常承诺99.9999999%(9个9)的 durability(数据持久性),不用担心硬盘损坏;
- 低成本:相比本地服务器存储,云存储的单位成本更低(比如AWS S3标准存储约0.023美元/GB/月),还支持“存储分层”(热数据存标准存储,冷数据存归档存储,成本再降70%);
- 全局访问:只要有网络,就能从任何地方访问数据,适合分布式计算引擎(如Spark on EMR、Presto on Cloud)。
云存储的局限(为什么需要列式存储?)
- 不支持高效分析:云对象存储的原生接口(如S3的REST API)是为“读写完整对象”设计的,不支持“列裁剪”或“谓词下推”——如果直接读S3上的CSV文件,计算引擎必须下载整个文件才能过滤数据;
- 小文件问题:云存储对小文件(比如<1MB)的处理效率低(每读一个小文件都要发一次API请求),而大数据场景中容易产生大量小文件(比如实时流数据写入)。
1.3 融合的本质:用“列式存储的分析能力”补“云存储的性能短板”
现在,我们可以把两者的优势与局限列成一张表:
| 特性 | 列式存储(Parquet/ORC) | 云存储(S3/OSS) |
|---|---|---|
| 分析效率 | 高(列裁剪、谓词下推) | 低(读全量数据) |
| 存储成本 | 高(本地服务器) | 低(按需付费) |
| 弹性扩容 | 难(需要买服务器) | 易(按需申请) |
| 数据持久性 | 低(依赖本地硬盘) | 高(9个9) |
融合的目标:让云存储具备列式存储的分析能力,同时让列式存储享受云存储的弹性与成本优势。
融合的结果:一种“云原生的列式存储架构”——数据以列式格式(Parquet/Delta)存放在云存储上,计算引擎(Spark/Presto)直接查询云存储上的列式数据,利用列式存储的优化技术(列裁剪、谓词下推)提升效率,同时利用云存储的弹性降低成本。
第二章:手把手实践——列式存储与云存储的融合架构搭建
接下来,我们用**“Spark + S3 + Parquet + Delta Lake”**的组合,搭建一个融合架构,完成“电商用户行为分析”的场景。
2.1 步骤一:环境配置——让Spark能访问S3
要让Spark读取S3上的文件,需要配置S3的访问凭证(Access Key/Secret Key),并添加对应的依赖包。
1. 下载Spark依赖包
Spark默认不包含S3的驱动,需要手动下载以下JAR包,放到Spark的jars目录下:
hadoop-aws-3.3.1.jar(Hadoop的S3客户端);aws-java-sdk-bundle-1.12.262.jar(AWS SDK的捆绑包)。
(如果用阿里云OSS,替换为hadoop-aliyun-3.3.1.jar和aliyun-sdk-oss-3.15.0.jar)
2. 配置S3凭证
在Spark代码中添加S3的访问配置(或通过spark-defaults.conf配置):
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder()
.appName("Cloud Columnar Storage Demo")
.master("local[*]") // 本地测试,生产用集群模式
// 配置S3访问
.config("spark.hadoop.fs.s3a.access.key", "YOUR_AWS_ACCESS_KEY")
.config("spark.hadoop.fs.s3a.secret.key", "YOUR_AWS_SECRET_KEY")
.config("spark.hadoop.fs.s3a.endpoint", "s3.amazonaws.com") // S3 endpoint
.config("spark.hadoop.fs.s3a.path.style.access", "true") // 路径风格(Bucket在路径中)
.getOrCreate()
验证配置是否生效
读取S3上的一个测试文件(比如test.csv):
val testDF = spark.read.csv("s3a://your-bucket-name/test.csv")
testDF.show(5) // 显示前5行,能正常输出说明配置成功
2.2 步骤二:数据写入——将用户行为数据存为S3上的Parquet格式
接下来,我们将模拟的电商用户行为数据(包含user_id、behavior_type、timestamp、amount)写入S3,用Parquet格式存储。
1. 生成模拟数据
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
// 定义Schema
val schema = StructType(Seq(
StructField("user_id", IntegerType, nullable = false
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/959939.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!