Hadoop常见的文件格式及压缩算法

news/2024/4/29 14:34:13/文章来源:https://www.cnblogs.com/tangshanqun/p/16602547.html

前言

 该文章中将会整理一些大数据中常见的文件格式及压缩算法的理论知识,作为后期实践的理论指导。理论+实践才会更方便用这些文件格式和压缩算法。
    目前hadoop中常见的文件格式有textfile、sequencefile、avro、rcfile、orcfile、parquet等,上述六种文件格式又可以划分为行式存储(textfile、sequencefile、avro)和列式存储(rcfile、orcfile、parquet)。那么什么是行式存储?什么又是列式存储呢?

一、行式存储及列式存储

1.行式存储

行式存储就是每一行的所有数据存在一个block中,各个block之间连续存储。

优点:

  • 因为每一行的所有字段都存在一起,因此对数据进行插入(INSERT)和修改(UPDATE)操作很方便。
  • 整表查询比较方便,可以很快将整张表组装出来。

缺点:

  • 查询(SELECT)时如果涉及到某条数据,需要把该行数据所有内容都读取到内存中,即使只SELECT一两个字段也要把整行数据都读进来。读取数据的时候硬盘寻址范围很大。
  • 要加速查询的话需要建立索引,建立索引需要花费很多时间。
  • 空值也要占固定的空间。

应用场景:

行式存储用于存储关系型数据,用于使用数据的时候需要经常用到数据之间的依赖关系的场景,即读取的时候需要整行数据或者整行中大部分列的数据,需要经常用到插入、修改操作,比如存储用户的注册信息等。

2.列式存储

列式存储就是每一列的所有数据存在一起,不同列之间可以分开存储。

优点:

  • 每一列单独存储,因此仅SELECT个别列的时候,可以仅读取需要的那几个列,相当于为每一列都建立了索引。因此硬盘寻道范围小。
  • 数据压缩。列式存储的时候可以为每一列创建一个字典,存储的时候就仅存储数字编码即可,降低了存储空间需求

缺点:

  • SELECT完成时,被选中的数据需要重新组装。
  • 插入(INSERT)和修改(UPDATE)操作比较麻烦。

应用场景:

列式存储适合分布式数据库和数据仓库,适合于对大量数据进行统计分析,列与列之间关联性不强,仅进行插入和读取操作的场景,如网站流量统计、用户行为分析等。

二、具体的文件格式

看完具体的大类划分,我们再看看具体的文件格式。

1. TextFile

默认格式,存储方式为行存储,数据不做压缩,磁盘开销大,数据解析开销大。可结合 Gzip、Bzip2 使用(系统自动检查,执行查询时自动解压),但使用 这种方式,压缩后的文件不支持 split,Hive 不会对数据进行切分,从而无法对数据进行并行操作。并且在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比 SequenceFile 高几十倍 。

2. SequenceFile

 

SequenceFile 是 Hadoop API 提供的一种二进制文件支持,存储方式为行存储,其具有使用方便、可分割、可压缩的特点。SequenceFile 支持三种压缩选择:NONE,RECORD,BLOCK。Record 压缩率低,一般建议使用 BLOCK 压缩。优势是文件和 hadoop api 中的 MapFile 是相互兼容的 。

3. Avro

Avro格式是Hadoop的一种基于行的存储格式,被广泛用作序列化平台。Avro格式以JSON格式存储模式,使其易于被任何程序读取和解释。数据本身以二进制格式存储,使其在Avro文件中紧凑且高效。Avro格式是语言中立的数据序列化系统。它可以被多种语言处理(目前是C、C++、C#、Java、Python和Ruby)。Avro格式的一个关键特性是对随时间变化的数据模式的强大支持,即模式演变。Avro处理模式更改,例如缺少字段、添加的字段和更改的字段。Avro格式提供了丰富的数据结构。例如,您可以创建包含数组、枚举类型和子记录的记录。

4. RCFile

RCFile是为基于MapReduce的数据仓库系统设计的数据存储结构。它结合了行存储和列存储的优点,可以满足快速数据加载和查询,有效利用存储空间以及适应高负载的需求。RCFile是由二进制键/值对组成的flat文件,它与sequence file有很多相似之处,在数仓中执行分析时,这种面向列的存储非常有用。当我们使用面向列的存储类型时,执行分析很容易。缺点是RC不支持schema扩展,如果要添加新的列,则必须重写文件,这会降低操作效率。

5. OrcFile

 

Apache ORC是Apache Hadoop生态系统面向列的开源数据存储格式,它与Hadoop环境中的大多数计算框架兼容,ORC代表“优化行列”,它以比RC更为优化的方式存储数据,提供了一种非常有效的方式来存储关系数据,然后存储RC文件。ORC将原始数据的大小最多减少75%,数据处理的速度也提高了。

6. Parquet

与以行方式存储数据的传统方法相比,Parquet文件格式在存储和性能方面更高效。这对于从“宽”(具有许多列)表中读取特定列的查询特别有用,因为只读取需要的列,并且最小化 IO。Parquet的独特功能之一是它也可以以柱状方式存储具有嵌套结构的数据。这意味着在 Parquet 文件格式中,即使是嵌套字段也可以单独读取,而无需读取嵌套结构中的所有字段。Parquet 格式使用记录分解和组装算法以柱状方式存储嵌套结构。

三、压缩算法

压缩格式

工具

算法

文件扩展名

是否可切分

default/deflate

deflate

.deflate

gzip

gzip

deflate

.gz

bzip2

bzip2

bzip2

.bz2

lzo

lzop

lzo

.lzo

lz4

lz4

.lz4

snappy

snappy

.snappy

四、总结

Hadoop支持的文件格式和压缩算法非常多,每种文件格式和压缩算法都有自己独特的特点和一定的应用场景。下一期我们讲讲这些内容,并选择合适的文件格式和压缩算法组合,作为默认的文件格式和压缩算法。

如有错误,不吝指正。

参考文章

  1. https://zhuanlan.zhihu.com/p/459444652
  2. https://www.51cto.com/article/615292.html
  3. https://segmentfault.com/a/1190000040823167
  4. https://blog.csdn.net/longyanchen/article/details/97160466

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_2351.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 + Socket.io + Knex + TypeScript 实现可以私聊的聊天室

前言 下文只在介绍实现的核心代码,没有涉及到具体的实现细节,如果感兴趣可以往下看,在文章最后贴上了仓库地址。项目采用前后端模式,前端使用 Vite + Vue3 + TS;后端使用 Knex + Express + TS。目前项目还没有完全实现,文章的目的是记录阶段性“胜利”和分享知识。 关于搭…

Docker入门-基础知识

Docker入门-基础知识 Cloud研习社 Cloud研习社 2022-06-17 07:26 发表于山东收录于合集#实战经验33个 #云计算34个 #计算机37个 #docker3个 #IT23个 Docker 是一个用于开发、发布和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分离,以便您可以快速交付软件。…

AJAX概念和AJAX实现原生JS方式

AJAX概念 概念:ASynchronous JavaScript And XML 异步的JavaScript 和 XML1.异步和同步:客户端和服务器端相互通信的基础上同步:客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作。异步:客户端不需要等待服务器端的响应。在服务器处理请求的过程中,客户端…

mysql初识

mysql需要了解哪些知识 1.sql操作 2.索引 索引原理 索引优化 sql语句优化 3.事务 并发读异常的问题 并发死锁怎么解决 4. mysql与缓存 解决读性能问题 集群的内容OLTP: OLTP(online transaction processing)翻译为联机事务处理;主要对数据库增删改查; OLTP主要用来记录某类…

5个必知的高级SQL函数

5个必知的高级SQL函数SQL是关系数据库管理的标准语言,用于与数据库通信。它广泛用于存储、检索和操作数据库中存储的数据。SQL不区分大小写。用户可以访问存储在关系数据库管理系统中的数据。SQL允许描述数据。用户可以轻松创建和删除表和数据库。我们可以使用SQL库、模块和预…

Golang基础教程

以下使用goland的IDE演示,包含总计的golang基础功能共20个章节 一、go语言结构: 二、go基础语法:三、变量四、常量五、运算符 六、条件语句 七、循环 八、函数 九、变量作用域 十、数组 十一、指针 十二、结构体 十三、切片 十四、范围(Range) 十五、集合 十六、递归 十七、…

ceph 009 管理定义crushmap 故障域

管理和自定义crushmap 定义pg到osd的映射关系 通过crush算法使三副本映射到理想的主机或者机架 更改故障域提高可靠性 pg到osd映射由crush实现下载时需要将对象从osd搜索到,组成文件,那么对象多了就会效率变低,那么从pg组里面搜索。提高效率 对象放在pg要通过hash算法 95个…

网络编程-TCP通信程序(下)代码

TCP通信的客户端:向服务器发送连接请求,给服务端发送数据,读取服务端回写的数据 表示客户端的类:java.net.Socket:该类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通讯的端点。套接字:包含了IP地址和端口号的网络单位 构造方法: Socket(String host, …

IfcDocumentInformation

IfcDocumentInformation实体定义 IfcDocumentInformation捕获外部文档的“元数据”。本规范未定义文件的实际内容;相反,它可以在Location属性之后找到。可以使用IfcDocumentReference从交换结构中全部或部分引用相同的IFCDocationInformation(例如,通过引用特定章节或段落)…

Volatile介绍

介绍 volatile 是 Java 虚拟机提供的轻量级的同步机制,它可以保证可见性(缓存一致性协议)和有序性(禁止指令重排序,也就是通过内存屏障来实现),但是不保证原子性。JMM 介绍 JMM 是一个抽象的概念,它描述的是一种规范。这些规范定义了程序中各种变量的访问规则。 JMM 定…

monodepth2学习-KITTI数据集内容

KITTI数据集介绍 monodepth2采用KITTI数据集进行训练,KITTI数据集主要是针对自动驾驶领域的图形处理技术,主要应用在评测立体图像(stereo)、光流(optical flow)、3D物体检查等计算机视觉领域。KITTI数据集采用配备有两个灰度摄像头,两个彩色摄像头和一个Velodye 64激光雷…

代码审计-PHP反序列化漏洞

什么是序列化序列化可以实现将对象压缩并格式化,方便数据的传输和存储。 为什么要序列化? PHP 文件在执行结束时会把对象销毁,如果下次要引用这个对象的话就很麻烦,所以就有了对象序列化,实现对象的长久存储,对象序列化之后存储起来,下次调用时直接调出来反序列化之后就…

世事无常,人生有定,此乃时也、运也、命也

参考: https://www.163.com/dy/article/H6NVOULE0528OPI5.html“万般皆由命,半点不由人。”半生已过,红尘辗转,才真正明白人的寿命与财富,在你来到人世间的那一刻上天就安排好了,半点由不得我们自己。正所谓“世事无常,人生有定,此乃时也、运也、命也!” 所谓命者。先…

三次握手,四次挥手

三次握手 连接建立阶段: 第一次握手:客户端的应用进程主动打开,并向服务端发出请求报文段。其首部中:SYN=1,seq=x。 第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。 第三次握手:客户端收到确认报文之后…

操作系统学习笔记4 | CPU管理 多进程图像

操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件。操作系统通过多进程图像实现对CPU的管理。所以多进程图像是操作系统的核心图像。操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件。而通过学习笔记3的简史回顾,操作系统通过多进…

Hadoop十九

HDFS API操作在Windows上操作hadoop,需要添加hadoop依赖,我的hadoop是3.3.1版本的,我用的依赖是3.2.0的,需要配置环境变量 PATH添加如下路径: 然后双击依赖中的一闪而过就是成功的。 在maven项目中添加如下依赖<dependencies><!-- https://mvnrepository.com/a…

框架-逻辑层(逻辑层简介和注册程序)

逻辑层简介 小程序逻辑层 小程序开发框架的逻辑层是使用JavaScript编写的。 逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈。 在 JavaScript 的基础上,微信做了一些修改,以方便地开发小程序。增加 App 和 Page 方法,进行程序和页面的注册。 增加 getApp和g…

德飞莱 C51 学习笔记

《电子元件基础教程》 :数字集成电路 从结构上分为 : TTL 型 和 CMOS 型 《跟我学数字电子技术》: 数字电路分为 组合逻辑电路 和 时序逻辑电路

golang中GOPATH、GOROOT、GOBIN不生效等相关问题

比较重要的三个配置:GOPATH、GOROOT、GOBIN GOPATH : go项目开发的工程目录 GOROOT: go安装所在的目录 GOBIN: go项目编译完二进制程序目录 不生效问题,其实应该好好检查是否上面相关路径配置是否正确 编辑vim ~/.bash_profile 添加以下3个配置export GOROOT="/usr/loca…