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来说速度最慢。
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop集群重新格式化是指对Hadoop分布式文件系统(HDFS)进行重新格式化,以清除现有的数据和元数据,并使其恢复到初始状态。重新格式Hadoop集群通常是在以下情况下进行: 1. 集群新建或重建:当使用新的硬件或重新安装操作系统时,需要重新格式Hadoop集群。这样可以确保集群中的所有节点都处于相同的状态,并准备好将来存储和处理数据。 2. 故障恢复:当集群发生故障,导致数据无法访问或元数据损坏时,可以通过重新格式化集群来恢复数据的可用性。这样可以清除任何损坏的数据块或元数据,以便后续的数据复制和恢复操作。 3. 节点扩展:当需要扩展现有Hadoop集群的容量或性能时,可以通过向集群中添加新节点并重新格式化它们来实现。这样可以确保新节点被正确地集成到现有集群中,并且具有正确的配置和数据副本。 在重新格式Hadoop集群之前,需要先停止Hadoop服务,以便确保不会有任何写操作在重新格式化过程中发生。然后,可以使用以下命令重新格式Hadoop集群: hdfs namenode -format 此命令将删除HDFS中的所有数据和元数据,并生成一个新的namespaceID。重新格式化完成后,可以启动Hadoop服务,并开始使用集群存储和处理数据。 重新格式Hadoop集群是一个非常谨慎的操作,因为它会删除所有的数据和元数据。因此,在执行此操作之前,必须先备份重要的数据,并确保所有相关的配置文件和参数都正确设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值