一、Text
文本通常采用CSV,JSON等固定长度的纯文本格式
优点:
1、便于与其他应用程序或脚本进行数据交互
2、易读性好,便于理解
缺点:
1、数据存储量庞大
2、查询效率不高
3、不支持块压缩
由于之前我们用的都是Text类型,所以这里就不展开讲了
二、SequenceFile
按行存储二进制键值对数据,HDFS自带的数据格式
SequenceFIle中的key和value可以是任意类型的Writable
特点以及作用:
二进制文件直接将<Key,Value>序列化到文件中
常用于在MapReduce作业之间传输数据
可用作Hadoop中小文件的打包存档(小文件合并)
即使在压缩数据时也支持分割
存储结构
1、记录结构
2、块结构
【注意:记录内部结构取决于是否启用压缩,如果已经启用压缩,则取决于是记录压缩还是快压缩】
压缩
1、记录压缩(record)
仅仅压缩value
2、快压缩(block)
一次压缩多条记录,利用记录间的相似性进行压缩,效率更高
查看文件内容
hdfs dfs -text SequenceFIle文件名.seq
三、Avro
是一个数据序列化系统,出自Hadoop之父 Doug Cutting
以JSON格式存储数据定义(Schema)
以二进制格式存储数据
特点:
丰富的数据结构
快速可压缩的二进制数据格式
容器文件用于持久化数据
自带远程过程调用RPC
动态语言可以方便地处理Avro数据
数据类型:
1、基本数据类型
null, boolean, int, long, float, double, bytes, string
2、复杂数据类型
record,enum,array,map,union,fixed
例子:
首先编写对应的 JSON文件和AVSC文件
1.user.json
{"name": "Alyssa", "favorite_number": 256, "favorite_color": "black"}
{"name": "Ben", "favorite_number": 7, "favorite_color": "red"}
{"name": "Charlie", "favorite_number": 12, "favorite_color": "blue"}
2.user.avsc
{
"namespace": "example.avro",
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "favorite_number", "type": "int"},
{"name": "favorite_color", "type": "string"}
]
}
【注意:你得有这些jar 包】
然后利用如下命令生成 Avro文件
java -jar avro-tools-1.8.2.jar fromjson --schema-file user.avsc user.json > user.avro
想要把Avro文件转成 JSON文件
java -jar avro-tools-1.8.2.jar tojson user.avro
获取Avro元数据
java -jar avro-tools-1.8.2.jar getmeta user.avro
Avro文件存储格式
四、Parquet
是Hadoop生态系统中任何项目都可以用的列式存储格式,由Facebook和Cloudera合作开发
Parquet是Spark的默认数据源
特点:
1、按需求读取列
2、压缩编码降低磁盘存储空间
Parquet文件结构
- 行组(Row Group)
- 列块(Column Chunk)
- 页(Page)
按照行将数据物理上划分为多个组,每个行组包含一定的行数,通常行组大小等于HDFS块的大小
五、RC & ORC
RC
Record Columnar 有Facebook开源
特点:
存储行集合,并在集合中以列格式存储行数据
引入轻量级索引,允许跳过不相关的行块
可分割:允许并行处理行集合
可压缩
ORC
Optimized Row Columnar
RC的优化版
RC的存储结构
- 集行存储和列存储的优点
- 设计思想和Parquet类似,先按行水平切割为多个行组,再对每个行组内的数据进行按列存储
ORC存储格式 - Stripe
每个ORC文件首先会被横向切分成多个Stripe
每个stripe默认的大小是250MB
每个stripe由多组(Row Groups)行数据组成 - IndexData
保存了该stripe上数据的位置,总行数 - RowData
以stream的形式保存数据 - Stripe Footer
包含该stripe统计结果:Max,Min,count等信息 - FileFooter
该表的统计结果
各个Stripe的位置信息 - Postscript
该表的行数,压缩参数,压缩大小,列等信息
六、不同文件格式的对比
存储格式的选择
写:一般不重要
读:
Avro——查询随时间变化的数据集
Parquet ——适合在宽表上查询少数列
Parquet & ORC以牺牲写性能为代价优化读取性能
TextFile读起来很慢
Hive的查询(快—>慢)
ORC—>Parquet—>Text—>Avro—>SequenceFile