Hadoop文件存储格式

一.压缩形式


记录压缩

概念:每条记录都进行压缩,但是仅压缩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
  • 可读性低

基本操作

  1. 生成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
    
  2. 读取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来说速度最慢。

猜你喜欢

转载自blog.csdn.net/qq_40579464/article/details/105756498