一. 传统零碎常见文件存储格局
在Windows有很多种文件格式,例如:JPEG文件用来存储图片、MP3文件用来存储音乐、DOC文件用来存储WORD文档。每一种文件存储某一类的数据,例如:咱们不会用文原本存储音乐、不会用文原本存储图片。windows上反对的存储格局是十分的多。
1. 文件系统块大小
- 在服务器/电脑上,有多种块设施(Block Device),例如:硬盘、CDROM、软盘等等
- 每个文件系统都须要将一个分区拆分为多个块,用来存储文件。不同的文件系统块大小不同
2. Hadoop 中文件存储格局
在Hadoop中,没有默认的文件格式,格局的抉择取决于其用处。而抉择一种优良、适宜的数据存储格局是十分重要的。应用HDFS的应用程序(例如MapReduce或Spark)性能中的最大问题、瓶颈是在特定地位查找数据的工夫和写入到另一个地位的工夫,而且治理大量数据的解决和存储也很简单(例如:数据的格局会一直变动,原来一行有12列,前面要存储20列)
抉择适合的文件格式可能会带来一些显著的益处:
- 能够保障写入速度
- 能够保障读取速度
- 文件是可被切分的
- 对压缩反对敌对
反对schema的更改
每种格局都有长处和毛病,数据处理的不同阶段能够应用不同的格局才会更有效率。通过抉择一种格局,最大水平地施展该存储格局的劣势,最小化劣势。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等多种平台
- 代码可扩大以波及其余数据格式
- 一个跨平台(Windows,MAC,Linux)桌面应用程序,用于查看常见的大数据二进制格局,例如Parquet,ORC,AVRO等。反对本地文件系统,HDFS,AWS S3等
4. Hadoop丰盛的存储格局
1. Text File
- 简介:
文本文件在非Hadoop畛域很常见,在Hadoop畛域也很常见。 数据一行一行到排列,每一行都是一条记录。以典型的UNIX形式以换行符【\n】终止,文本文件是能够被切分的,但如果对文本文件进行压缩,则必须应用反对切分文件的压缩编解码器,例如BZIP2。因为这些文件只是文本文件,压缩时会对所有内容进行编码。能够将每一行成为JSON文档,能够让数据带有构造 - 利用场景:
仅在须要从Hadoop中间接提取数据,或间接从文件中加载大量数据的状况下,才倡议应用纯文本格式或CSV
- 长处:
简略易读、轻量级 毛病:
- 读写速度慢
- 不反对块压缩,在Hadoop中对文本文件进行压缩/解压缩会有较高的读取老本,因为须要将整个文件全副压缩或者解压缩。
- 不反对块压缩,在Hadoop中对文本文件进行压缩/解压缩会有较高的读取老本,因为须要将整个文件全副压缩或者解压缩。
2. Sequence File
- 简介
Sequence最后是为MapReduce设计的,因而和MapReduce集成很好,在Sequence File中,每个数据都是以一个key和一个value进行序列化存储,Sequence File中的数据是以二进制格局存储,这种格局所需的存储空间小于文本的格局。与文本文件一样,Sequence File外部也不反对对键和值的构造指定格局编码 - 利用场景
通常把Sequence file作为两头数据存储格局。例如:将大量小文件合并放入到一个SequenceFIle中 - 构造
长处:
与文本文件相比更紧凑,反对块级压缩
- 压缩文件内容的同时,反对将文件切分
- 序列文件在Hadoop和许多其余反对HDFS的我的项目反对很好,例如:Spark
- 它是让咱们解脱文本文件迈出第一步
- 它能够作为大量小文件的容器
毛病:
- 对具备SQL类型的Hive反对不好,须要读取和解压缩所有字段
- 不存储元数据,并且对schema扩大中的惟一形式是在开端增加新字段
3. Avro File
- 简介
Apache Avro是与语言无关的序列化零碎,由Hadoop创始人 Doug Cutting开发,vro是基于行的存储格局,它在每个文件中都蕴含JSON格局的schema定义,从而进步了互操作性并容许schema的变动(删除列、增加列)。 除了反对可切分,反对压缩,Avro是一种自描述格局,它将数据的schema间接编码存储在文件中,能够用来存储简单构造的数据。Avro能够进行疾速序列化,生成的序列化数据也比拟小 - 利用场景
适宜于一次性须要将大量的列(数据比拟宽)、写入频繁的场景,随着更多存储格局的倒退,罕用于Kafka和Druid中 - 构造
间接将一行数据序列化在一个block中 长处:
- 如果只须要对数据文件中的多数列进行操作,行式存储效率较低,例如:咱们读取15列中的2列数据,基于行式存储就须要读取数百万行的15列。而列式存储就会比行式存储形式高效
- 列式存储因为是将同一列(类)的数据存储在一起,压缩率要比形式存储高
4. RCFile
- 简介:
RCFile是为基于MapReduce的数据仓库零碎设计的数据存储构造。它联合了行存储和列存储的长处,能够满足疾速数据加载和查问,无效利用存储空间以及适应高负载的需要。RCFile是由二进制键/值对组成的flat文件,它与sequence file有很多相似之处,在数仓中执行剖析时,这种面向列的存储十分有用。当咱们应用面向列的存储类型时,执行剖析很容易 - 利用场景
罕用在Hive中 - 构造
- RCFile可将数据分为几组行,并且在其中将数据存储在列中
- RCFile首先将行程度划分为行拆分(Row Group),而后以列形式垂直划分每个行拆分(Columns)。
- RCFile将行拆分的元数据存储为record的key,并将行拆分的所有数据存储value
- 作为行存储,RCFile保障同一行中的数据位于同一节点中
- 作为列存储,RCFile能够利用列数据压缩,并跳过不必要的列读取
长处
- 基于列式的存储,更好的压缩比
- 利用元数据存储来反对数据类型
- 反对Split
- 毛病:
RC不反对schema扩大,如果要增加新的列,则必须重写文件,这会升高操作效率
5. ORC File
- 简介
Apache ORC(Optimized Row Columnar,优化行列)是Apache Hadoop生态系统面向列的开源数据存储格局,它与Hadoop环境中的大多数计算框架兼容,ORC代表“优化行列”,它以比RC更为优化的形式存储数据,提供了一种十分无效的形式来存储关系数据,而后存储RC文件。ORC将原始数据的大小最多缩小75%,数据处理的速度也进步了 - 利用场景
罕用在Hive中 - 构造
- 长处'
- 比TextFile,Sequence File 和 RCFile 具备更好的性能
- 列数据独自存储
- 带类型的数据存储格局,应用类型专用的编码器
- 轻量级索引
毛病
与RC文件一样,ORC也是不反对列扩大的6. Parquet File
- 简介
Parquet File是另一种列式存储的构造,来自于Hadoop的创始人Doug Cutting的Trevni我的项目,基于列的二进制存储格局,能够存储嵌套的数据结构,当指定要应用列进行操作时,磁盘输出/输入操效率很高,Parquet与Cloudera Impala兼容很好,并做了大量优化,反对块压缩,与RC和ORC文件不同,Parquet serdes反对无限的schema扩大。在Parquet中,能够在构造的开端增加新列
- 构造
- 长处:
非常适合进行压缩,具备杰出的查问性能,尤其是从特定列查问数据时,效率很高
- 毛病:
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也是一种较好的抉择
6. ProtoBuf 和Thrift
因为Protobuf和Thrift是不可split的,因而它们在HDFS中并不风行
7. 新一代的存储格局Apache Arrow
Arrow简介
pache Arrow是一个跨语言平台,是一种列式内存数据结构,次要用于构建数据系统。Apache Arrow在2016年2月17日作为顶级Apache我的项目引入
Apache Arrow倒退十分迅速,并且在将来会有更好的倒退空间。它能够在零碎之间进行高效且疾速的数据交换,而无需进行序列化,而这些老本已与其余零碎(例如Thrift,Avro和Protocol Buffers)相关联,每一个零碎实现,它的办法(method)都有本人的内存存储格局,在开发中,70%-80%的工夫节约在了序列化和反序列化上
Arrow促成了许多组件之间的通信。 例如,应用Python(pandas)读取简单的文件并将其转换为Spark DataFrame。Arrow是如何晋升数据挪动性能的
- 利用Arrow作为内存中数据表示的两个过程能够将数据从一种办法“重定向”到另一种办法,而无需序列化或反序列化。 例如,Spark能够应用Python过程发送Arrow数据来执行用户定义的函数
- 无需进行反序列化,能够间接从启用了Arrow的数据存储系统中接管Arrow数据。 例如,Kudu能够将Arrow数据间接发送到Impala进行剖析
- Arrow的设计针对嵌套结构化数据(例如在Impala或Spark Data框架中)的剖析性能进行了优化。