Hadoop常用数据模型(文件存储格式)

20 篇文章 0 订阅

一、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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值