一. 传统系统常见文件存储格式

在Windows有很多种文件格式,例如:JPEG文件用来存储图片、MP3文件用来存储音乐、DOC文件用来存储WORD文档。每一种文件存储某一类的数据,例如:我们不会用文本来存储音乐、不会用文本来存储图片。windows上支持的存储格式是非常的多。

1. 文件系统块大小

  • 在服务器/电脑上,有多种块设备(Block Device),例如:硬盘、CDROM、软盘等等
  • 每个文件系统都需要将一个分区拆分为多个块,用来存储文件。不同的文件系统块大小不同

2. Hadoop 中文件存储格式

在Hadoop中,没有默认的文件格式,格式的选择取决于其用途。而选择一种优秀、适合的数据存储格式是非常重要的。使用HDFS的应用程序(例如MapReduce或Spark)性能中的最大问题、瓶颈是在特定位置查找数据的时间和写入到另一个位置的时间,而且管理大量数据的处理和存储也很复杂(例如:数据的格式会不断变化,原来一行有12列,后面要存储20列)
选择合适的文件格式可能会带来一些明显的好处:

  1. 可以保证写入速度
  2. 可以保证读取速度
  3. 文件是可被切分的
  4. 对压缩支持友好
  5. 支持schema的更改
    image.png
    每种格式都有优点和缺点,数据处理的不同阶段可以使用不同的格式才会更有效率。通过选择一种格式,最大程度地发挥该存储格式的优势,最小化劣势。

    3. BigData File Viewer工具

    1. 介绍
    • 一个跨平台(Windows,MAC,Linux)桌面应用程序,用于查看常见的大数据二进制格式,例如Parquet,ORC,AVRO等。支持本地文件系统,HDFS,AWS S3等
      github地址:https://github.com/Eugene-Mar...
    2. 功能介绍
    • 打开并查看本地目录中的Parquet,ORC和AVRO,HDFS,AWS S3等
    • 将二进制格式的数据转换为文本格式的数据,例如CSV
    • 支持复杂的数据类型,例如数组,映射,结构等
    • 支持Windows,MAC和Linux等多种平台
    • 代码可扩展以涉及其他数据格式

4. Hadoop丰富的存储格式

1. Text File
  • 简介:
    文本文件在非Hadoop领域很常见,在Hadoop领域也很常见。 数据一行一行到排列,每一行都是一条记录。以典型的UNIX方式以换行符【\n】终止,文本文件是可以被切分的,但如果对文本文件进行压缩,则必须使用支持切分文件的压缩编解码器,例如BZIP2。因为这些文件只是文本文件,压缩时会对所有内容进行编码。可以将每一行成为JSON文档,可以让数据带有结构
  • 应用场景:
    仅在需要从Hadoop中直接提取数据,或直接从文件中加载大量数据的情况下,才建议使用纯文本格式或CSV
  • 优点:
    简单易读、轻量级
  • 缺点:

    • 读写速度慢
    • 不支持块压缩,在Hadoop中对文本文件进行压缩/解压缩会有较高的读取成本,因为需要将整个文件全部压缩或者解压缩。
    • 不支持块压缩,在Hadoop中对文本文件进行压缩/解压缩会有较高的读取成本,因为需要将整个文件全部压缩或者解压缩。
2. Sequence File
  1. 简介
    Sequence最初是为MapReduce设计的,因此和MapReduce集成很好,在Sequence File中,每个数据都是以一个key和一个value进行序列化存储,Sequence File中的数据是以二进制格式存储,这种格式所需的存储空间小于文本的格式。与文本文件一样,Sequence File内部也不支持对键和值的结构指定格式编码
  2. 应用场景
    通常把Sequence file作为中间数据存储格式。例如:将大量小文件合并放入到一个SequenceFIle中
    image.png
  3. 结构
    image.png
  4. 优点:

    • 与文本文件相比更紧凑,支持块级压缩

      • 压缩文件内容的同时,支持将文件切分
      • 序列文件在Hadoop和许多其他支持HDFS的项目支持很好,例如:Spark
      • 它是让我们摆脱文本文件迈出第一步
    • 它可以作为大量小文件的容器
  5. 缺点:

    • 对具有SQL类型的Hive支持不好,需要读取和解压缩所有字段
    • 不存储元数据,并且对schema扩展中的唯一方式是在末尾添加新字段
    3. Avro File
    1. 简介
      Apache Avro是与语言无关的序列化系统,由Hadoop创始人 Doug Cutting开发,vro是基于行的存储格式,它在每个文件中都包含JSON格式的schema定义,从而提高了互操作性并允许schema的变化(删除列、添加列)。 除了支持可切分,支持压缩,Avro是一种自描述格式,它将数据的schema直接编码存储在文件中,可以用来存储复杂结构的数据。Avro可以进行快速序列化,生成的序列化数据也比较小
    2. 应用场景
      适合于一次性需要将大量的列(数据比较宽)、写入频繁的场景,随着更多存储格式的发展,常用于Kafka和Druid中
    3. 结构
      直接将一行数据序列化在一个block中
      image.png
    4. 优点:

      • 如果只需要对数据文件中的少数列进行操作,行式存储效率较低,例如:我们读取15列中的2列数据,基于行式存储就需要读取数百万行的15列。而列式存储就会比行式存储方式高效
      • 列式存储因为是将同一列(类)的数据存储在一起,压缩率要比方式存储高
4. RCFile
  1. 简介:
    RCFile是为基于MapReduce的数据仓库系统设计的数据存储结构。它结合了行存储和列存储的优点,可以满足快速数据加载和查询有效利用存储空间以及适应高负载的需求。RCFile是由二进制键/值对组成的flat文件,它与sequence file有很多相似之处,在数仓中执行分析时,这种面向列的存储非常有用。当我们使用面向列的存储类型时,执行分析很容易
  2. 应用场景
    常用在Hive中
  3. 结构

image.png

  • RCFile可将数据分为几组行,并且在其中将数据存储在列中
  • RCFile首先将行水平划分为行拆分(Row Group),然后以列方式垂直划分每个行拆分(Columns)。
  • RCFile将行拆分的元数据存储为record的key,并将行拆分的所有数据存储value
  • 作为行存储,RCFile保证同一行中的数据位于同一节点中
  • 作为列存储,RCFile可以利用列数据压缩,并跳过不必要的列读取
  1. 优点

    • 基于列式的存储,更好的压缩比
    • 利用元数据存储来支持数据类型
    • 支持Split
  2. 缺点:
    RC不支持schema扩展,如果要添加新的列,则必须重写文件,这会降低操作效率
5. ORC File
  1. 简介
    Apache ORC(Optimized Row Columnar,优化行列)是Apache Hadoop生态系统面向列的开源数据存储格式,它与Hadoop环境中的大多数计算框架兼容,ORC代表“优化行列”,它以比RC更为优化的方式存储数据,提供了一种非常有效的方式来存储关系数据,然后存储RC文件。ORC将原始数据的大小最多减少75%,数据处理的速度也提高了
  2. 应用场景
    常用在Hive中
  3. 结构
    image.png
  4. 优点'
  5. 比TextFile,Sequence File 和 RCFile 具备更好的性能
  6. 列数据单独存储
  7. 带类型的数据存储格式,使用类型专用的编码器
  8. 轻量级索引
  9. 缺点
    与RC文件一样,ORC也是不支持列扩展的

    6. Parquet File
    1. 简介

    Parquet File是另一种列式存储的结构,来自于Hadoop的创始人Doug Cutting的Trevni项目,基于列的二进制存储格式,可以存储嵌套的数据结构,当指定要使用列进行操作时,磁盘输入/输出操效率很高,Parquet与Cloudera Impala兼容很好,并做了大量优化,支持块压缩,与RC和ORC文件不同,Parquet serdes支持有限的schema扩展。在Parquet中,可以在结构的末尾添加新列

    1. 结构

    image.png

    1. 优点:

    非常适合进行压缩,具有出色的查询性能,尤其是从特定列查询数据时,效率很高

    1. 缺点:

    Parquet也具有压缩和查询性能方面的优点,与非列文件格式相比,写入速度通常较慢。

    5. Parent Vs ORC

    • ORC文件格式压缩比parquet要高,parquet文件的数据格式schema要比ORC复杂,占用的空间也就越高
    • ORC文件格式的读取效率要比parquet文件格式高
    • 如果数据中有嵌套结构的数据,则Parquet会更好
    • Hive对ORC的支持更好,对parquet支持不好,ORC与Hive关联紧密
    • ORC还可以支持ACID、Update操作等
    • Spark对parquet支持较好,对ORC支持不好
    • 为了数据能够兼容更多的查询引擎,Parquet也是一种较好的选择

    image.png

6. ProtoBuf 和Thrift

由于Protobuf和Thrift是不可split的,因此它们在HDFS中并不流行

7. 新一代的存储格式Apache Arrow

  1. Arrow简介
    pache Arrow是一个跨语言平台,是一种列式内存数据结构,主要用于构建数据系统。Apache Arrow在2016年2月17日作为顶级Apache项目引入
    image.png
    Apache Arrow发展非常迅速,并且在未来会有更好的发展空间。它可以在系统之间进行高效且快速的数据交换,而无需进行序列化,而这些成本已与其他系统(例如Thrift,Avro和Protocol Buffers)相关联,每一个系统实现,它的方法(method)都有自己的内存存储格式,在开发中,70%-80%的时间浪费在了序列化和反序列化上
    image.png
    Arrow促进了许多组件之间的通信。 例如,使用Python(pandas)读取复杂的文件并将其转换为Spark DataFrame。
    image.png

    1. Arrow是如何提升数据移动性能的

      • 利用Arrow作为内存中数据表示的两个过程可以将数据从一种方法“重定向”到另一种方法,而无需序列化或反序列化。 例如,Spark可以使用Python进程发送Arrow数据来执行用户定义的函数
      • 无需进行反序列化,可以直接从启用了Arrow的数据存储系统中接收Arrow数据。 例如,Kudu可以将Arrow数据直接发送到Impala进行分析
      • Arrow的设计针对嵌套结构化数据(例如在Impala或Spark Data框架中)的分析性能进行了优化。

捕风
47 声望16 粉丝