传统文件存储格式:就jpeg,mp3,doc等
server/ host上,由块设备,如硬盘。软盘等
- 每个文件系统将一个分区拆为多个块存储文件,文件系统块大小不同
hadoop没有默认文件格式,格式选择取决用途。在HDFS应用程序(如MapReduce or Spark)中, 性能瓶颈在于特定位置查找数据和写入消耗的时间。管理大量数据也很复杂(数据的存储,数据格式变化)
需要选择合适的文件格式
- 保证读写速度
- 文件可切分
- 压缩支持
- schema更改支持
数据处理的不同阶段使用不同格式:发挥优势
Hadoop 存储格式
Text File
文本文件,每一行一条记录。文本文件可以被切分。 若要压缩文件,需要压缩解码器(支持切分文件)
场景:直接从文件加载大量数据情况下建议使用纯文本or csv
优点:
- 简单
- 轻量
缺点
- 读写慢
- 不支持块压缩,hadoop压缩、解压读取成本较高
Sequence File
数据以kv序列化存储, Sequence数据以二进制格式存储,内部不支持对kv结构指定格式编码
多数作为 中间数据结构,大量小文件合并于SequenceFile中
优点
- 紧凑
- 支持块级压缩
- 压缩的同时可以切分文件
- 序列文件支持别的项目
- 摆脱文本文件
- 大量小文件的容器
缺点
- 对SQL的Hive支持不好,要读取解压所有字段
- 不存储元数据
- 扩展唯一方法为append
Avro File
语言无关的序列化系统。基于行,包含JSON的schema定义,提高互操作性允许schema变化(删除行列)
可切分、可压缩。 schema直接编码存储在文件里面,存复杂结构数据,可以快速sequentialize,序列化数据较小
场景
- 一次性把大量数据(列)写入或频繁写入的场景
一行数据序列化于一个block里面
优点
- 操作少量列较低效,行存储效率较低(读某两列数据,那么可能需要读取全部的行)此时列式存储效率更高效
- 列式将同一列(类数据存在一起)压缩率更高
RCFile
基于MR的数据仓库系统设计的数据存储结构,结合了行存储和列存储的优点。满足快速加载和查询 —— 利用存储空间,适应高负载需求。 二进制kv组成的flat文件。
分析的时候一般使用列存储
- 数据分为几组行,数据存储在列中
- 行水平拆分 row group,然后列方式垂直划分 columns
- 行存储:RCFile保证一行数据在一个节点中
- RCFile用列数据压缩,跳过不必要的列读取
优点
- 列式储存 压缩比更好
- 元数据支持数据类型
- 支持split
缺点
不支持schema扩展,如果要添加新的列,需要重写文件
ORC
优化行列,比RC更优化存储数据。原始数据大小最多减小75%
性能高,列数据单独存储,类型专用编码器,轻量级索引
Parquet
列式存储,二进制,可存储嵌套数据结构
- 合适压缩,合适查询 —— 特别是特定列
- 写入速度较慢。
压缩文件的选择
- 若文件不可切分 —— 只有一个CPU处理文件,其他CPU空闲,影响效率
- 支持切分的算法可能压缩解压缩较慢,影响查询效率