一.压缩形式
记录压缩
概念:每条记录都进行压缩,但是仅压缩value
块压缩
概念:将一个文件分成多个块,分别进行压缩(同时压缩多条记录),块与块之间会有标识(sync mark),这样对于每个块的处理就可以并行执行。
二.行式存储和列式存储
概念
行式存储
传统关系型数据库,比如Oracle、Mysql、SQL Server等采用此类方式存储,一行数据在存储介质中连续保存。它适合DQL操作,但是选择时即使只涉及部分列,也会将所有列数据全部读取一遍。
列式存储
列式存储写的时候比较慢,但是读取的时候很快,因为它是按列加载,直接按顺序读取即可。但是选择完成时,被选择的列需要重新组装,并且它的DQL会相对麻烦一些
三.常用文件格式
常用的文件格式有:TextFile、SequenceFile、Avro、Parquet、RC & ORC
TextFile
常采用csv、json等固定长度的纯文本格式
优点
- 便于与其他应用程序、脚本进行数据交换
- 易读性好、便于理解
缺点
- 数据存储量非常庞大
- 查询效率不高
- 不支持块压缩
SequenceFile
按行存储二进制键值对数据,HDFS自带
特点
- 常用于MapReduce作业之间传输数据
- 二进制文件直接将<key , value>序列化到文件中
- 可用于Hadoop中小文件的打包存档
- 支持记录压缩、块压缩
- 二进制文件,可读性低
Avro
Apache Avro是一个序列化系统,出自Hadoop之父Doug Cutting
特点
- 以json格式存储数据定义(对表的描述、字段、字段类型等),以二进制格式存储数据
- 比较通用的数据格式
- 具有丰富的数据结构
- 快速可压缩的二进制数据格式
- 自带远程调用RPC
- 可读性低
基本操作
-
生成avro文件
//1.制作schema信息文件(user.avsc) { "namespace": "example.avro", "type": "record", "name": "User", "fields": [ {"name": "name", "type": "string"}, {"name": "favorite_number", "type": ["int", "null"]}, {"name": "favorite_color", "type": ["string", "null"]} ]} //2.制作json文件(user.json) {"name": "Alyssa", "favorite_number":{"int": 256}, "favorite_color": null} {"name": "Ben", "favorite_number": {"int": 7}, "favorite_color": {"string":"red"}} {"name": "Charlie", "favorite_number": null, "favorite_color": {"string":"blue"} //3.制作文件(使用avro-tools-1.8.2.jar),利用user.avsc、user.json,制作文件user.avro java -jar avro-tools-1.8.2.jar fromjson --schema-file user.avsc user.json > user.avro
-
读取avro文件元数据、数据
//获取元数据 java -jar avro-tools-1.8.2.jar getmeta user.avro //获取数据 java -jar avro-tools-1.8.2.jar tojson user.avro
Parquet
Apache Parquet是Hadoop生态系统中任何项目都能使用的列式存储格式,由Twitter和Cloudera合作开发
特点
- Parquet格式是Spark SQL默认的数据源
- 按列进行存储,按需读取列,压缩编码可以降低磁盘存储空间(比如有5个"d",它能够将数据转化成类似于这种结构:“d5”)
RC
由Facebook开源,
特点
- 存储行集合,并在集合中以列格式存储行数据
- 引入轻量级索引,允许跳过不相关的行块
- 可分割,允许并行处理行集合
- 支持块压缩
ORC
RC的优化版本
特点
- 常用于Hive
- 压缩率极高
在Hive中常用的使用方式:一般读入源文件为Avro格式,在Hive中的中间过程可以使用ORC存储,而最后保存也选择Avro格式保存。因为Avro格式比较通用,而ORC格式在很多地方并不能使用。
四.各种格式比较
可分割:文件从某个位置切分开来,是否仍旧能够读取数据
模式演化(元数据):更改schema,生产者和消费者可以同时使用schema的不同版本,且一切都可以继续工作
五.存储格式的选择
读取(速度从高到低排序)
-
Avro:查询随时间变化,支持扩展字段
-
Parquet:适合在宽表上查询少数列
-
Parquet & ORC:以牺牲性能为代价,优化读取能力
-
TextFile:可读性最佳,但是文件读取速度慢
Hive查询(速度从高到低排序)
- ORC**(常用)**:几乎专门为Hive定制的格式,速度很快
- Parquet**(常用)**
- Text
- Avro**(常用)**:占地小,节省磁盘空间,也是比较通用的格式
- SequenceFile:占地小,节省磁盘空间;本身是为了MR的k、v对设计,而非Hive,所以对于Hive来说速度最慢。