Hadoop 入门笔记六 : Hadoop常用文件存储格式

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

  • 在服务器/电脑上,有多种块设备(Block Device),例如:硬盘、CDROM、软盘等等
  • 每个文件系统都需要将一个分区拆分为多个块,用来存储文件。不同的文件系统块大小不同
2. Hadoop 中文件存储格式 在Hadoop中,没有默认的文件格式,格式的选择取决于其用途。而选择一种优秀、适合的数据存储格式是非常重要的。使用HDFS的应用程序(例如MapReduce或Spark)性能中的最大问题、瓶颈是在特定位置查找数据的时间和写入到另一个位置的时间,而且管理大量数据的处理和存储也很复杂(例如:数据的格式会不断变化,原来一行有12列,后面要存储20列)
选择合适的文件格式可能会带来一些明显的好处:
  1. 可以保证写入速度
  2. 可以保证读取速度
  3. 文件是可被切分的
  4. 对压缩支持友好
  5. 支持schema的更改
    Hadoop 入门笔记六 : Hadoop常用文件存储格式
    文章图片

    每种格式都有优点和缺点,数据处理的不同阶段可以使用不同的格式才会更有效率。通过选择一种格式,最大程度地发挥该存储格式的优势,最小化劣势。
    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中
    Hadoop 入门笔记六 : Hadoop常用文件存储格式
    文章图片
  3. 结构
    Hadoop 入门笔记六 : Hadoop常用文件存储格式
    文章图片
  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中
      Hadoop 入门笔记六 : Hadoop常用文件存储格式
      文章图片
    4. 优点:
      • 如果只需要对数据文件中的少数列进行操作,行式存储效率较低,例如:我们读取15列中的2列数据,基于行式存储就需要读取数百万行的15列。而列式存储就会比行式存储方式高效
      • 列式存储因为是将同一列(类)的数据存储在一起,压缩率要比方式存储高
4. RCFile
  1. 简介:
    RCFile是为基于MapReduce的数据仓库系统设计的数据存储结构。它结合了行存储和列存储的优点,可以满足快速数据加载和查询,有效利用存储空间以及适应高负载的需求。RCFile是由二进制键/值对组成的flat文件,它与sequence file有很多相似之处,在数仓中执行分析时,这种面向列的存储非常有用。当我们使用面向列的存储类型时,执行分析很容易
  2. 应用场景
    常用在Hive中
  3. 结构
Hadoop 入门笔记六 : Hadoop常用文件存储格式
文章图片

  • 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. 结构
    Hadoop 入门笔记六 : Hadoop常用文件存储格式
    文章图片
  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. 结构
    Hadoop 入门笔记六 : Hadoop常用文件存储格式
    文章图片

    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也是一种较好的选择
    Hadoop 入门笔记六 : Hadoop常用文件存储格式
    文章图片

6. ProtoBuf 和Thrift 【Hadoop 入门笔记六 : Hadoop常用文件存储格式】由于Protobuf和Thrift是不可split的,因此它们在HDFS中并不流行
7. 新一代的存储格式Apache Arrow
  1. Arrow简介
    pache Arrow是一个跨语言平台,是一种列式内存数据结构,主要用于构建数据系统。Apache Arrow在2016年2月17日作为顶级Apache项目引入
    Hadoop 入门笔记六 : Hadoop常用文件存储格式
    文章图片

    Apache Arrow发展非常迅速,并且在未来会有更好的发展空间。它可以在系统之间进行高效且快速的数据交换,而无需进行序列化,而这些成本已与其他系统(例如Thrift,Avro和Protocol Buffers)相关联,每一个系统实现,它的方法(method)都有自己的内存存储格式,在开发中,70%-80%的时间浪费在了序列化和反序列化上
    Hadoop 入门笔记六 : Hadoop常用文件存储格式
    文章图片

    Arrow促进了许多组件之间的通信。 例如,使用Python(pandas)读取复杂的文件并将其转换为Spark DataFrame。
    Hadoop 入门笔记六 : Hadoop常用文件存储格式
    文章图片

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

    推荐阅读