Spark场景下Avro与ORC格式读取内存消耗及性能差异问询
Spark读取ORC与Avro格式的内存占用差异解答
你的判断在全量字段读取、全量数据转换的场景下是完全正确的,具体分场景说明如下:
- 全量读取+全量转换场景:两者内存消耗基本无差异
存储层的体积差异仅来自Avro(行存)和ORC(列存+高压缩比)的存储结构、压缩策略区别,数据被Spark读取后都会被反序列化为统一的内部UnsafeRow对象格式,同一套数据的内部二进制表示完全一致,后续执行转换操作时内存占用不会有明显区别。 - 列裁剪场景:ORC内存占用远低于Avro
ORC是原生列存储格式,Spark读取时可以直接按需读取目标列,不需要的列完全不会被加载到内存;而Avro是行存储格式,哪怕你仅需要单个字段,也必须读取整行所有字段完成反序列化后再丢弃冗余列,这种场景下两者内存占用差距可达数倍到数十倍。
还有两个常见的特殊情况可以参考:
如果你开启了ORC向量化读取配置
spark.sql.orc.enableVectorizedReader=true,ORC的内存占用会进一步降低,向量化 reader 会批量处理多行数据,大幅减少零散对象的内存开销。
如果你读取后调用cache()/persist()做内存缓存,使用默认反序列化存储级别时两者缓存占用基本一致;如果使用序列化存储级别,缓存的是Spark内部对象序列化后的结果,和原始存储格式无关,全量字段场景下也不会有明显差异。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

