当前位置:首页 » 服务存储 » 行式存储格式
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

行式存储格式

发布时间: 2023-05-23 14:46:50

‘壹’ 行式存储和列式存储优缺点和paruqet文件结构

列式存储和行式存储是针对数据在存储介质中的排序形式而言的,假设存在一张table,那么:

图1-1所示为行式存储和列式存储的示意图,一张table包含5个字段(列)即rowid、date/time、customer name以及quantity,共7行,图中的红色箭头表示存储顺序。

存储形式的差异决定了适用场景的不同:

综合来看,列式存储比较适合大数据量(压缩比高)、分析型操作(针对少数几列);不适合频率较高的删除(全列检索)、更新(重新压缩)操作

图2-1所示为列式存储中将某张table基于字典表进行编码压缩的示例,图中左边为源表,假设该table中的customers和material字段的取值均只有右上表所示的5种,那么当源表的行数很大时,customers和material字段就会存在大量重复的取值,为了节省存储空间对这两个字段进行编码,即使用一个字典表(右上图)记录该两个字段的distinct取值,又下表则用右上表字段取值对应的index(整数1、2、3、4、5)来代替原来的string,由于string占用的存储空间比这几个index占用的存储空间大多了,因此可以较大程度上压缩占用的存储空间。

基于列式存储的两个典型实现是:hbase和parquet,其中:

parquet的文件结构如图3-1所示:

从图中可以看出,1个parquet文件由header(1个)、block(可以多个)、footer(1个)组成,分别负责:

图3-2所示为parquet文件中,block、rowgroup、columnchunk以及page的关系:

简而言之:

因此如果将一个parquet文件类比成一张大excel 表,那么:

‘贰’ Hive数据的序列化格式

1. TextFile

Hive数据表的默认格式,存储方式:行存储。
可使用Gzip,Bzip2等压缩算法压缩,压缩后的文件不支持split。
但在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比SequenceFile高几十倍。

2. SequenceFile

Hadoop API提供的一种二进制文件,以的形式序列化到文件中,存储方式:行存储。
支持三种压缩选择:NONE,RECORD,BLOCK。
Record压缩率低,一般建议使用BLOCK压缩。
优势是文件和hadoop api中的MapFile是相互兼容的。

3. RCFile

存储方式:数据按行分块,每块按列存储。结合了行存储和列存储的优点:
首先,RCFile 保证同一行的数据位于同一节点,因此元组重构的开销很低;
其次,像列存储一样,RCFile 能够利用列维度的数据压缩,并且能跳过不必要的列读取;

RCFile的一个行组包括三个部分:
第一部分是行组头部的【同步标识】,主要用于分隔 hdfs 块中的两个连续行组
第二部分是行组的【元数据头部】,用于存储行组单元的信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数
第三部分是【表格数据段】,即实际的列存储数据。在该部分中,同一列的所有域顺序存储。

从图可以看出,首先存储了列 A 的所有域,然后存储列 B 的所有域等。

数据追加:RCFile 不支持任意方式的数据写操作,仅提供一种追加接口,这是因为底层的 HDFS当前仅仅支持数据追加写文件尾部。 

行组大小:行组变大有助于提高数据压缩的效率,但是可能会损害数据的读取性能,因为这样增加了 Lazy 解压性能的消耗。而且行组变大会占用更多的内存,这会影响并发执行的其他MR作业。 考虑到存储空间和查询效率两个方面,Facebook 选择 4MB 作为默认的行组大小,当然也允许用户自行选择参数进行配置。

4. ORCFile

存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
效率比rcfile高,是rcfile的改良版本

5. 自定义格式

用户可以通过实现inputformat和 outputformat来自定义输入输出格式。

6. 总结:

数据仓库的特点:一次写入、多次读取,因此,整体来看, ORCFile 相比其他格式具有较明显的优势。
TextFile 默认格式,加载速度最快,可以采用Gzip、bzip2等进行压缩,压缩后的文件无法split,即并行处理
SequenceFile 压缩率最低,查询速度一般,三种压缩格式NONE,RECORD,BLOCK
RCfile 压缩率最高,查询速度最快,数据加载最慢。

#

‘叁’ hive的几种文件格式

hive文件存储格式包括以下几类:

1、TEXTFILE

2、SEQUENCEFILE

3、RCFILE

4、ORCFILE(0.11以后出现)

其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理;

SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。

前提创建环境:

hive 0.8

创建一张testfile_table表,格式为textfile。

create table if not exists testfile_table( site string, url string, pv bigint, label string) row format delimited fields terminated by ' ' stored as textfile;

load data local inpath '/app/weibo.txt' overwrite into table textfile_table;

一、TEXTFILE
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,
从而无法对数据进行并行操作。
示例:

总结:
相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。

‘肆’ 数据存储形式有哪几种

【块存储】

典型设备:磁盘阵列,硬盘

块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘、做Raid、或者LVM(逻辑卷)等种种方式逻辑划分出N个逻辑的硬盘。(假设划分完的逻辑盘也是5个,每个也是1G,但是这5个1G的逻辑盘已经于原来的5个物理硬盘意义完全不同了。例如第一个逻辑硬盘A里面,可能第一个200M是来自物理硬盘1,第二个200M是来自物理硬盘2,所以逻辑硬盘A是由多个物理硬盘逻辑虚构出来的硬盘。)

接着块存储会采用映射的方式将这几个逻辑盘映射给主机,主机上面的操作系统会识别到有5块硬盘,但是操作系统是区分不出到底是逻辑还是物理的,它一概就认为只是5块裸的物理硬盘而已,跟直接拿一块物理硬盘挂载到操作系统没有区别的,至少操作系统感知上没有区别。

此种方式下,操作系统还需要对挂载的裸硬盘进行分区、格式化后,才能使用,与平常主机内置硬盘的方式完全无异。

优点:

1、 这种方式的好处当然是因为通过了Raid与LVM等手段,对数据提供了保护。

2、 另外也可以将多块廉价的硬盘组合起来,成为一个大容量的逻辑盘对外提供服务,提高了容量。

3、 写入数据的时候,由于是多块磁盘组合出来的逻辑盘,所以几块磁盘可以并行写入的,提升了读写效率。

4、 很多时候块存储采用SAN架构组网,传输速率以及封装协议的原因,使得传输速度与读写速率得到提升。

缺点:

1、采用SAN架构组网时,需要额外为主机购买光纤通道卡,还要买光纤交换机,造价成本高。

2、主机之间的数据无法共享,在服务器不做集群的情况下,块存储裸盘映射给主机,再格式化使用后,对于主机来说相当于本地盘,那么主机A的本地盘根本不能给主机B去使用,无法共享数据。

3、不利于不同操作系统主机间的数据共享:另外一个原因是因为操作系统使用不同的文件系统,格式化完之后,不同文件系统间的数据是共享不了的。例如一台装了WIN7/XP,文件系统是FAT32/NTFS,而Linux是EXT4,EXT4是无法识别NTFS的文件系统的。就像一只NTFS格式的U盘,插进Linux的笔记本,根本无法识别出来。所以不利于文件共享。


【文件存储】

典型设备:FTP、NFS服务器

为了克服上述文件无法共享的问题,所以有了文件存储。

文件存储也有软硬一体化的设备,但是其实普通拿一台服务器/笔记本,只要装上合适的操作系统与软件,就可以架设FTP与NFS服务了,架上该类服务之后的服务器,就是文件存储的一种了。

主机A可以直接对文件存储进行文件的上传下载,与块存储不同,主机A是不需要再对文件存储进行格式化的,因为文件管理功能已经由文件存储自己搞定了。

优点:

1、造价交低:随便一台机器就可以了,另外普通以太网就可以,根本不需要专用的SAN网络,所以造价低。

2、方便文件共享:例如主机A(WIN7,NTFS文件系统),主机B(Linux,EXT4文件系统),想互拷一部电影,本来不行。加了个主机C(NFS服务器),然后可以先A拷到C,再C拷到B就OK了。(例子比较肤浅,请见谅……)

缺点:

读写速率低,传输速率慢:以太网,上传下载速度较慢,另外所有读写都要1台服务器里面的硬盘来承担,相比起磁盘阵列动不动就几十上百块硬盘同时读写,速率慢了许多。


【对象存储】

典型设备:内置大容量硬盘的分布式服务器

对象存储最常用的方案,就是多台服务器内置大容量硬盘,再装上对象存储软件,然后再额外搞几台服务作为管理节点,安装上对象存储管理软件。管理节点可以管理其他服务器对外提供读写访问功能。

之所以出现了对象存储这种东西,是为了克服块存储与文件存储各自的缺点,发扬它俩各自的优点。简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。能否弄一个读写快,利 于共享的出来呢。于是就有了对象存储。

首先,一个文件包含了了属性(术语叫metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(以下简称数据)。

以往像FAT32这种文件系统,是直接将一份文件的数据与metadata一起存储的,存储过程先将文件按照文件系统的最小块大小来打散(如4M的文件,假设文件系统要求一个块4K,那么就将文件打散成为1000个小块),再写进硬盘里面,过程中没有区分数据/metadata的。而每个块最后会告知你下一个要读取的块的地址,然后一直这样顺序地按图索骥,最后完成整份文件的所有块的读取。

这种情况下读写速率很慢,因为就算你有100个机械手臂在读写,但是由于你只有读取到第一个块,才能知道下一个块在哪里,其实相当于只能有1个机械手臂在实际工作。

而对象存储则将元数据独立了出来,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息),而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪些OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。

这时候由于是3台OSD同时对外传输数据,所以传输的速度就加快了。当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。

另一方面,对象存储软件是有专门的文件系统的,所以OSD对外又相当于文件服务器,那么就不存在文件共享方面的困难了,也解决了文件共享方面的问题。

所以对象存储的出现,很好地结合了块存储与文件存储的优点。

最后为什么对象存储兼具块存储与文件存储的好处,还要使用块存储或文件存储呢?

1、有一类应用是需要存储直接裸盘映射的,例如数据库。因为数据库需要存储裸盘映射给自己后,再根据自己的数据库文件系统来对裸盘进行格式化的,所以是不能够采用其他已经被格式化为某种文件系统的存储的。此类应用更适合使用块存储。

2、对象存储的成本比起普通的文件存储还是较高,需要购买专门的对象存储软件以及大容量硬盘。如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储的形式好了,性价比高。

‘伍’ C语言数据文件有几种存储方式每种存储形式各有什么特点

一、auto auto称为自动变量。 局部变量是指在函数内部说明的变量(有时也称为自动变量)。用关键字auto进7行说明, 当auto省略时, 所有的非全程变量都被认为是局部变量, 所以auto实际上从来不用。 局部变量在函数调用时自动产生, 但不会自动初始化, 随函数调用的结束, 这个变量也就自动消失了, 下次调用此函数时再自动产生, 还要再赋值, 退出时又自动消失。 二、static static称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。 1. 静态局部变量 它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它、函数使用, 当再次进入该函数时, 将保存上次的结果。其它与局部变量一样。 2. 静态全程变量 Turbo C2.0允许将大型程序分成若干独立模块文件分别编译, 然后将所有模块的目标文件连接在一起, 从而提高编译速度, 同时也便于软件的管理和维护。静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使用,而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用。 三、extern extern称为外部变量。为了使变量除了在定义它的源文件中可以使用外, 还要被其它文件使用。因此, 必须将全程变量通知每一个程序模块文件, 此时可用extern来说明。 四、register register称为寄存器变量。它只能用于整型和字符型变量。定义符register说明的变量被Turbo C2.0存储在CPU的寄存器中, 而不是象普通的变量那样存储在内存中, 这样可以提高运算速度。但是Turbo C2.0只允许同时定义两个寄存器变量,一旦超过两个, 编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量来处理。因此, 寄存器变量常用在同一变量名频繁出现的地方。另外, 寄存器变量只适用于局部变量和函数的形式参数, 它属于auto型变量,因此, 不能用作全程变量。定义一个整型寄存器变量可写成: register int a;

‘陆’ 数据库应用系统中的数据是以表还是行还是列还是特定的形式储存的

数据库应用系统中的数据以二维表的方式直接存储目标数据。

一个表由行和列组成的,行数据代表具体的生活中的实体数据,列经常被称作是域,也就是行的某个特性,从实体对象本身出发就是对象的属性。

表中的第一行通常称为属性名,表中的每一个元组和属性都是不渗唯蔽可再分的,且元组的次序是无关紧要的。



(6)行式存储格式扩展阅读

行存储和列存储的应用场景

行存储的适用场景:

(1)适合随机的增、删、改、查操作;

(丛州2)需要在行中选取所有属性的查询操作;

(3)需要频繁插入或更新的操作,其操作与索引和行的大小更为相关。

列存储的适用场景:

(1)查询过程中,可针对各列的运算并发执行,在内存中聚合完整记录集,降低查询响应时间;

(2)在数据中高效查找数据,无需维护索引(任何列都能作为索引),查询过程中能够尽量减少无关IO,避免全表扫描;

(3)因为各列独立存储,且数据类型已知,可以山空针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率;如果某一行的某一列没有数据,在列存储时,就可以不存储该列的值,这将比行式存储更节省空间。

‘柒’ avro 和 parquet的区别和联系

avro 和 parquet相比有哪些优势呢?

  1. 可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量

  2. 压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如Run Length Encoding和Delta Encoding)进一步节约存储空间

  3. 只读取需岩厅银要的列,支持向量运算,能够获取更好的扫描性能

  4. Parquet就是基于Google的Dremel系统的数据模型和算法实现的。核心思想是使用“record shredding and assembly algorithm”来伏毕表示复杂的嵌套数据类型,同时辅以按列的高效压缩和编码技术,实现降低存

  5. 与Avro之前新统计系统的日志都是用Avro做序列化和存储,鉴于Parquet的优势和对Avro的兼容,将HDFS上的存储格式改为Paruqet,并且只需做很小的改动就用原读取Avro的API读取Parquet,以提粗宴高近一个数量级。

  6. Parquet文件尾部存储了文件的元数据信息和统计信息,自描述的,方便解析

‘捌’ 大数据常用文件格式介绍

图片看不见的话可以看我CSDN上的文章:
https://blog.csdn.net/u013332124/article/details/86423952

最近在做hdfs小文件合并的项目,涉及了一些文件格式的读写,比如avro、orc、parquet等。期间阅读了一些资料,因此打算写篇文章做个记录。

这篇文章不会介绍如何对这些格式的文件进行读写,只会介绍一下它们各自的特点以及底层存储的编码格式

[图片上传失败...(image-a5104a-1547368703623)]

使用sequencefile还可以将多个小文件合并到一个大文件中,通过key-value的形式组织起来,此时该sequencefile可以看做是一个小文件容器。

[图片上传失败...(image-4d03a2-1547368703623)]

Parquet是一个基于列式存储的文件格式,它将数据按列划分进行存储。Parquet官网上的文件格式介绍图:

[图片上传失败...(image-92770e-1547368703623)]

我们可以看出,parquet由几个部分构成:

[图片上传失败...(image-391e57-1547368703623)]

Orc也是一个列式存储格式,产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。

[图片上传失败...(image-ba6160-1547368703623)]

目前列式存储是大数据领域基本的优化项,无论是存储还是查询,列式存储能做的优化都很多,看完上面对orc和parquet的文件结构介绍后,我们列式存储的优化点做一个总结:

在压缩方面

在查询方面

就网上找到的一些数据来看,Orc的压缩比会比Parquet的高一些,至于查询性能,两个应该不会差距太大。本人之前做过一个测试,在多数场景,hive on mr下,orc的查询性能会更好一些。换成hive on spark后,parquet的性能更好一些

本文介绍的4种大数据存储格式,2个是行式存储,2个是列式存储,但我们可以看到一个共同点:它们都是支持分割的。这是大数据文件结构体系中一个非常重要的特点, 因为可分割使一个文件可以被多个节点并发处理,提高数据的处理速度

另外,当前大数据的主要趋势应该是使用列式存储,目前我们公司已经逐步推进列式存储的使用,本人也在hive上做过一些测试,在多个查询场景下,无论是orc还是parquet的查询速度都完爆text格式的, 差不多有4-8倍的性能提升 。另外,orc和parquet的压缩比都能达到10比1的程度。因此,无论从节约资源和查询性能考虑,在大多数情况下,选择orc或者parquet作为文件存储格式是更好的选择。另外,spark sql的默认读写格式也是parquet。

当然,并不是说列式存储已经一统天下了,大多时候我们还是要根据自己的使用场景来决定使用哪种存储格式。

Sequencefile

https://blog.csdn.net/en_joker/article/details/79648861

https://stackoverflow.com/questions/11778681/advantages-of-sequence-file-over-hdfs-textfile

Avro和Sequencefile区别

https://stackoverflow.com/questions/24236803/difference-between-avrodata-file-and-sequence-file-with-respect-to-apache-sqoop

parquet

https://www.cnblogs.com/ITtangtang/p/7681019.html

Orc

https://www.cnblogs.com/ITtangtang/p/7677912.html

https://www.cnblogs.com/cxzdy/p/5910760.html

Orc和parquet的一些对比

https://blog.csdn.net/colorant/article/details/53699822

https://blog.csdn.net/yu616568/article/details/51188479

‘玖’ “数据湖三剑客”Hudi、Delta Lake和Iceberg 深度对比

一个热爱生活又放荡不羁的程序猿

本文主要讲解如下内容:

一、数据湖的优点

二、目前有哪些开源数据湖组件

三、三大数据湖组件对比

数据湖相比传统数仓而言,最明显的便是优秀的T+0能力,这个解决了Hadoop时代数据分析的顽疾。传统的数据处理流程从数据入库到数据处理通常需要一个较长的环节、涉及许多复杂的逻辑来保证数据的一致性,由于架构的复杂性使得整个流水线具有明显的延迟。

目前开源的数据湖有江湖人称“数据湖三剑客”的 Hudi、Delta Lake和Iceberg

Iceberg官网定义:Iceberg是一个通用的表格式(数据组织格式),提供高性能的读写和元数据管理功能。

Iceberg 的 ACID 能力可以简化整个流水线的设枣罩计,传统 Hive/Spark 在修正数据时需要将数据读取出来,修改后再写入,有极大的修正成本。

[玫瑰]ACID能力,无缝贴合流批一体数据存储

随着flink等技术的不断发展,流批一体生态不断完善,但在流批一体数据存储方面一直是个空白,直到Iceberg等数据湖技术的出现,这片空白被慢慢填补。

Iceberg 提供 ACID 事务能力,上游数据写入即可见,不影响当前数据处理任务,这大大游岩梁简化了 ETL;

Iceberg 提供了 upsert、merge into 能力,可以极大地缩小数据入库延迟;

[玫瑰]统一数据存储,无缝衔接计算引擎和数据存储

Iceberg提供了基于流式的增量计算模型和基于批处理的全量表计算模型。批处理和流任务可以使用相同的存储模型,数据不再孤立;

Iceberg 支持隐藏分区和分区进化,方便业务进行数据分区策略更新。

Iceberg屏蔽了底层数据存储格式的差异,提供对于Parquet,ORC和Avro格式的支持。将上层引擎的能力传导到下层的存储格式。

[玫瑰]开放架构设计,开发维护成本相对可控

Iceberg 的架构和实现并未绑定于某一特定引擎,它实现了通用的数据组织格式,利用此格式可以方便地与不同引擎对接,目前 Iceberg 支持的计算引擎有 Spark、Flink、Presto 以及 Hive。

相比于 Hudi、Delta Lake,Iceberg 的架构实现更为优雅,同时对于数据格式、类型系统有完备的定义和可进化的设计;

面向对象存储的优化。Iceberg 在数据组织方式上充分考虑了对象存储的特性,避免耗时的 listing 和 rename 操作,使其在基于对象存储的数据湖架构适配上更有优势。

[玫瑰]增量数据读取,实时计算的一把利剑

Iceberg 支持通过流式方式读取增量数据,支持 Structed Streaming 以及 Flink table Source。

Apache Hudi是一种数据湖的存储格式,在Hadoop文件系统之上提供了更新数据和删除数据的能力以及消费变化数据的能力。

Hudi支持如下两种表类型:

使用Parquet格式存储数据。Copy On Write表的更新操作需要通过重写实现。

使用列式文件格式(Parquet)和行式文件格式(Avro)混合的方式来存储数据。Merge On Read使用列式格式存放Base数据,同时使用行式格式存放增量数据。最新写入的增量数据存放至行式文件中,根据可配置的策略执行COMPACTION操作合并增量数据至列式文件中。

应用场景

Hudi支持插入、更新和删除数据。可以实时消费消息队列(Kafka)和日志服务SLS等日志数据至Hudi中,同时也支持实时同步数据库Binlog产生的变更数据。

Hudi优化了数据写入过程中产生的小文件。因此,相比其他传统的文件格式,Hudi对HDFS文件神运系统更加的友好。

Hudi支持多种数据分析引擎,包括Hive、Spark、Presto和Impala。Hudi作为一种文件格式,不需要依赖额外的服务进程,在使用上也更加的轻量化。

Hudi支持Incremental Query查询类型,可以通过Spark Streaming查询给定COMMIT后发生变更的数据。Hudi提供了一种消费HDFS变化数据的能力,可以用来优化现有的系统架构。

Delta Lake是Spark计算框架和存储系统之间带有Schema信息数据的存储中间层。它给Spark带来了三个最主要的功能:

第一,Delta Lake使得Spark能支持数据更新和删除功能;

第二,Delta Lake使得Spark能支持事务;

第三,支持数据版本管理,运行用户查询 历史 数据快照。

核心特性

Delta lake

由于Apache Spark在商业化上取得巨 成功,所以由其背后商业公司Databricks推出的Delta lake也显得格外亮眼。在没有delta数据湖之前,Databricks的客户 般会采 经典的lambda架构来构建他们的流批处理场景。

Hudi

Apache Hudi是由Uber的 程师为满 其内部数据分析的需求 设计的数据湖项 ,它提供的fast upsert/delete以及compaction等功能可以说是精准命中 民群众的痛点,加上项 各成员积极地社区建设,包括技术细节分享、国内社区推 等等,也在逐步地吸引潜在 户的 光。

Iceberg

Netflix的数据湖原先是借助Hive来构建,但发现Hive在设计上的诸多缺陷之后,开始转为 研Iceberg,并最终演化成Apache下 个 度抽象通 的开源数据湖 案。

三者均为Data Lake的数据存储中间层,其数据管理的功能均是基于 系列的meta 件。Meta 件的 类似于数据库的catalog,起到schema管理、事务管理和数据管理的功能。与数据库不同的是,这些meta 件是与数据 件 起存放在存储引擎中的, 户可以直接看到。这个做法直接继承了 数据分析中数据对 户可见的传统,但是 形中也增加了数据被不 破坏的风险。 旦删了meta 录,表就被破坏了,恢复难度很 。

Meta包含有表的schema信息。因此系统可以 掌握schema的变动,提供schema演化的 持。Meta 件也有transaction log的功能(需要 件系统有原 性和 致性的 持)。所有对表的变更都会 成 份新的meta 件,于是系统就有了ACID和多版本的 持,同时可以提供访问 历史 的功能。在这些 ,三者是相同的。

Hudi 的设计 标正如其名,Hadoop Upserts Deletes and Incrementals(原为 Hadoop Upserts anD Incrementals),强调了其主要 持Upserts、Deletes 和 Incremental 数据处理,其主要提供的写 具是 Spark HudiDataSource API 和 提供的 HoodieDeltaStreamer,均 持三种数据写 式:UPSERT,INSERT 和 BULK_INSERT。其对 Delete 的 持也是通过写 时指定 定的选项 持的,并不 持纯粹的 delete 接 。

在查询 ,Hudi 持 Hive、Spark、Presto。

在性能 ,Hudi 设计了 HoodieKey , 个类似于主键的东西。对于查询性能, 般需求是根据查询谓词 成过滤条件下推 datasource。Hudi 这 没怎么做 作,其性能完全基于引擎 带的谓词下推和 partition prune 功能。

Hudi 的另 特 是 持 Copy On Write 和 Merge On Read。前者在写 时做数据的 merge,写 性能略差,但是读性能更 些。后者读的时候做 merge,读性能差,但是写 数据会 较及时,因 后者可以提供近实时的数据分析能 。最后,Hudi 提供了 个名为run_sync_tool 的脚本同步数据的 schema 到 Hive 表。Hudi 还提供了 个命令 具 于管理 Hudi 表。

Iceberg 没有类似的 HoodieKey 设计,其不强调主键。没有主键,做 update/delete/merge 等操作就要通过 Join 来实现, Join 需要有 个类似 SQL 的执 引擎。

Iceberg 在查询性能 做了 量的 作。值得 提的是它的 hidden partition 功能。Hidden partition 意思是说,对于 户输 的数据, 户可以选取其中某些列做适当的变换(Transform)形成 个新的列作为 partition 列。这个 partition 列仅仅为了将数据进 分区,并不直接体现在表的 schema中。

Delta 的定位是流批 体的, 持 update/delete/merge,spark 的所有数据写 式,包括基于dataframe 的批式、流式,以及 SQL 的 Insert、Insert Overwrite 等都是 持的。

不强调主键,因此其 update/delete/merge 的实现均是基于 spark 的 join 功能。在数据写 ,Delta 与 Spark 是强绑定的,这 点 Hudi 是不同的:Hudi 的数据写 不绑定 Spark。

在查询 ,Delta 前 持 Spark 与 Presto,但是,Spark 是不可或缺的,因为 delta log 的处理需要 到 Spark。这意味着如果要 Presto 查询 Delta,查询时还要跑 个 Spark 作业。更为难受的是,Presto 查询是基于 SymlinkTextInputFormat 。在查询之前,要运 Spark 作业 成这么个 Symlink 件。如果表数据是实时更新的,意味着每次在查询之前先要跑 个 SparkSQL,再跑 Presto。为此,EMR 在这 做了改进可以不必事先启动 个 Spark 任务。

在查询性能 ,开源的 Delta 乎没有任何优化。

Delta 在数据 merge 性能不如 Hudi,在查询 性能不如 Iceberg,是不是意味着 Delta 是处了呢?其实不然。Delta 的 优点就是与 Spark 的整合能 ,尤其是其流批 体的设计,配合 multi-hop 的 data pipeline,可以 持分析、Machine learning、CDC 等多种场景。使 灵活、场景 持完善是它相 Hudi 和 Iceberg 的最 优点。另外,Delta 号称是 Lambda 架构、Kappa 架构的改进版, 需关 流批, 需关 架构。这 点上 Hudi 和 Iceberg 是 所不及的。

三个引擎的初衷场景并不完全相同,Hudi 为了 incremental 的 upserts,Iceberg 定位于 性能的分析与可靠的数据管理,Delta 定位于流批 体的数据处理。这种场景的不同也造成了三者在设计上的差别。尤其是 Hudi,其设计与另外两个相 差别更为明显。

Delta、Hudi、Iceberg三个开源项 中,Delta和Hudi跟Spark的代码深度绑定,尤其是写 路径。这两个项 设计之初,都基本上把Spark作为他们的默认计算引擎了。 Apache Iceberg的 向 常坚定,宗旨就是要做 个通 化设计的Table Format。

Iceberg完美的解耦了计算引擎和底下的存储系统,便于多样化计算引擎和 件格式,很好的完成了数据湖架构中的Table Format这 层的实现,因此也更容易成为Table Format层的开源事实标准。另 ,Apache Iceberg也在朝着流批 体的数据存储层发展,manifest和snapshot的设计,有效地隔离不同transaction的变更, 常 便批处理和增量计算。并且,Apache Flink已经是 个流批 体的计算引擎, 者都可以完美匹配,合 打造流批 体的数据湖架构。

Apache Iceberg这个项 背后的社区资源 常丰富。在国外,Netflix、Apple、Linkedin、Adobe等公司都有PB级别的 产数据运 在Apache Iceberg上;在国内,腾讯这样的巨头也有 常庞 的数据跑在Apache Iceberg之上,最 的业务每天有 T的增量数据写 。

‘拾’ hdfs 列式存储和行式存储的区别

列式数据库是将同一个数据列的各个值存放在一起。插入某个数据行时,该行的各个数据列的值也会存放到不同的地方。

列式存储: 每一列单独存放,数据即是索引。

只访问涉及得列,如果我们想访问单独一列(比如NAME)会相当迅捷。

一行数据包含一个列或者多个列,每个列一单独一个cell来存储数据。而行式存储,则是把一行数据作为一个整体来存储。

在HANA的世界中,并不是只存在列式存储,行式存储也是存在的。

各自的优缺点: