从基础知识了解Apache Carbondata

使用SparkSQL时,我正在浏览Parquet,ORC等几种文件格式。我偶然发现Carbondata并试图理解它。 令我惊讶的是,目前没有太多资源可以帮助我立即理解基础知识。 这篇博客文章将尝试使用官方文档从基础上解释Carbondata。

概述:

基本介绍

需要统一文件格式

Carbondata结构,详细说明了数据工程中使用q $ R的基本术语

下一步是什么?

那么,什么是Apache Carbondata?

Apache CarbonData是一种索引的列式数据格式,用于在大数据平台上进行快速分析,例5 # # F + d如 Apache Hadoop,Ap= U N nache Sd } n n k . 0park等

资料来源:https://carbondata.apache.org/

简而J % % D A D G言之,Carbondata将使您能够使用单个副本z 0 J访问整个数据。 查询处理中的挑战8 R w 3 S是我们有不同类型的查询:

OLAP查询和详细查询。

大扫描查询和小扫描查询:您可能有需要比较大扫描的查询,也可能有在较小区域内扫描的查询。

点查询:消耗大= m f表的很少部分。

因此] p I k,统一的文件格式使您可$ W ` k R以拥有不同类型的查询(导致不同类型的数据访问)。

从基础知识了解Apache Carbondata

> Carbondata7 3 i ` ~\'s unified file format

正如Apache所声称的,您可L z 7以使用此列M q f s存储快速查询PB级数据。

让我3 V 1 9 K Y U hW = ; 6 a d a j )开始讨论CarbonData文件格式的体系结构。 简而言之,它具有三个组成部分:文件头,文7 = s Z E q件尾和小块。

什么是小块?

carbondata文件中的数据集

每个小块包含每个列的一个列块 w c (

一列块可能包含T b v一个或多个列页面,具体取决于所使用文件格式的版本

让我给您一些有关列页面的可视化信息。 假设您有4页的数据,每页包含25行和4列H q % E Q 2 ( f h。 Carbondata的数据块将包含列块,并在其中包含列页面,即它将包含从第1页到第4页的列数据(不是所有数据)。

文件页脚在这里很重要。 CarbonData利用它来进行快速查; P p 2 2 w询处理和优化扫描,这仅仅是因为它是在内存中读取的。

与文, f ^档中一样,我们首先讨论文件目录结构。

CarbonData文件存储在由carbon.storelocation配置指定的位置(在carbon.properties中配置;如果未配置,默认值为../carbon.store)。

这是结构,取自文档:

从基础知识了解Apache Carbondata

> CarbonData Folder Structure

再次从文档中对此结构进行说明:

ModifiedTime.htmlt使用文件的修改时间属性记录元数据的时间戳。 使用放置表和创建表时,文/ A g x r } | T ,件的修改时间将更新。 这对于所有数据库都是通用的,因此与数据库并行保存

c g ! F v W a [认名称是数据库名称,其中包含用户表。当用户未指定任何数据库名称时,将使用默认名称。 否则,用户配置的数据库名称将是目录名称。 user_table是表名。

元数据目录存储模式文件,表状态和字典文件(包括.dict,.dictmeta和.sortind` ? o i 1 Q Kex)。 有三种类型的元数据数据信息文件。

数据和索引文件存储在X - P ) L 名为Fact的目录下。 事实目录具有Part0分区目录,其中0是分区号。

Part0目录下有一个Segment_0目录,其中0是段号。

Segment_0目录中有两种文件类型,carbondata和ca( E - s rbonindex。

第4点与称为数据分区的概念有关。 因此,从这个来源开始,最好的解释是从下. f W B E Z 面开始的。

想象一下,我们有一本写在一本书中的百科全书,随着时间的流逝,历史和社会事件在这本书中得到了更新。在某* 8 s f 0 6 t S些时候,这本书太大了,我们需要用卡车搬运它,因此我们需要将这本书分成几册。数据分区是一种在加载主数据期间物理分割数据的技术。使用这种方法,我们将根据用户0 Q 6设置的规则将表拆分为较小的部分。当我们有非常大的表需要大量时间来读取整个数据集时,通常会使用它,因此它将使我们能够改善维护,性能或管理。关于用户如何对宽数据表进行分区,基本上有两种方法:水平(按行)或垂直(按列)。水平分区包括将表的行分布在不同的分区中Q : U e I,而垂直分区包括将表的列分布。我们不会忘记我们正A { 9 r 5 n Y n y在处理大量数据,并且将使用分布式文件系统将信息存储在群集中。最受欢迎的之一是HadoopW ] v , } $ - 9 HDFS。

分区和分段有什么区别?

两者都用于本地化数据,以便更快地访问和处理。 分段是指在群t k #集的@ k y , a所有节点之间组织和分配数据。 分区意味着在群集的节点内组织数据。

文件内容详细信息

创建表后,将生成user_table目录,并在MetB 5 ` , D b +adata目录中生成用于记录表结构的架构文件。

批量加载数据时,每次批量加载都会生成一个新的段目录。 调度尝试控制3 s q每个节点上的任务处理数据加载任务。 每个任务将生成多个carbondata文件和一个carbonic Q { @ w Lndex文件。

如您所见,批量加载数据将创建一个新的细分目录。 段目录做什么? 在每个分区(此处为P0)下,您| @ 1 B U s O将在所有e ` c M j p q节点上拥有一个有组织的数据。 这将使Carbondata具有快速的数据清除p = y Y ! n ~ 5和高查A ? r c D 6 3询性能。 目的是在所有节点上分布这批数据,以便它们在执行查询时可以并行参与。p ^ c & b R 4 n

在全局字典生成期间,如果使用两次通过方案,则在加载数据之前h P ) 1 7,将为每个字典编码列生成相应的dict,dictmets t 1 !a和sortindex文件,并且预定义字典可以提供部分字典文件 减少需求的方法。 通过扫描全部数据来生成字典编码的列; 全字典方法还可以提供所有- W A 3 f p字典代码列的字典文件,以避免扫描数据。 如果采用单次通过方式,则在加载数据时实时生成| # V j W v 0 X全局词典代码,加载数据后,将a ; 4 - 2 5词典固化为词典文件。

以下各节使B ( N Z Q用由thrift文件生成5 b O的Java对象描述carbondata文件格式来逐个解释每个文件的{ m } ! :内容(您也可以直接读取thrift文件中定义的格式)

现在我们知道了文件格式,让我们讨论Carbondata如何存储用户数据的架构。

从基础知识了解Apache Carbondata

> Schema of User\'s data

在开始解释上图之前,我们应该了解存储桶表的含义。

存储桶是一种将数据均匀分布在许多文件中的方法。 …每个存储区的数据都存储在HDFS上表目录下的单独HDFS文件中。

桶是分区的D & D . T D y K a替代方法。 它将数据集分解为更易于管理的部分。

如果您感到困惑或想要更清楚地了解什么是存储分区或存储分区与分区之间的区别,请在StackOverflow上阅读此答案。

现在,对模式图的说明:

TableSchema类TableSchema类不存储表名,它是从目录名(user_table)推断出来的。 tableProperties用于记录与表f I h 5 4 /相关的属性,例如:table_blocksize。

ColumnSchema类编码器用于记录列存储中使用的编码。 columnProperties用于记录与列相关的属性。

BucketingInfo类创建存储桶表时,可以指定表中的存储桶数以及要拆分存储桶的列。

DataType类描述CarQ 0 * c . *bonDQ z L 9 Q v # :ata支持的数据类型。

编码类CarbonData文件中可能使用的几种编码。

到目前为止,一切都与CarbonData如何存储有关您的数据的东西有关。 现在,我们将研究CarbonData如何存储我们的数据。

CarbonData文件格式; ~ 0 B

从基础知识了解Apache Carbondata

> CarbonData file format

我已经在上面描述了文件格式是什么。 我希望该图可以帮助您更好地可视化它。

我没有告诉您有关Blocklets的不同版本。 这与数据的版本控制无关。

因此,共有W S 3 T V三个版本:V1,V2和V3

从基础知识了解Apache Carbondata

> Vd x X1 version of CarbonData fil* h & c @ 0e format

块包括所有列数据页,RLE页和rq 3 4 M = Z Y DowID页。 由于小块中的页面是根据页面类型进行分组的,因此每列的三段数据被分配并存l 3 g : @ P G H储在小块中,并且所有页面的偏移量和长度信息都需要记录在页脚部分中。

RLE是游程长度编码

页脚存储在内存中读取的偏移量和长度信息。

从基础知识了解Apache Carbondata

> V2 version of CarbonData file formatt 0 k & g V + O

该小块由所有列的ColumnChunk组成。 列的ColumnChunk由ColumnPage组成,其中包括数据块标题,数据页面,RLE页面和rowID页面。 由于ColumnChunk将列的三种类型的Page数据聚合在一起,因此它可以使用更少的读取器来读取列数据。 由于页眉部分记录了所有页面# E L f @ H ,的长度信息,因m ^ B Q n此页脚部分只需要记录ColumnChunk的偏f ; { W F移量和长度,还可以减少页脚数据量。

q R o j A E * 8 BV1相比,V2在以下方面得到了改进:

所有列均以列组块的形式存储,而V1具有所有列数据页,即- m % 4 i在V1中,如果列C1存在于3页中,则将显示所有页。 而在V2中,所有列都将存在。

V1,V2中除了提供的数据页,RLE页和rowID页之外,还具有数据块头。

在V1中,页脚记录所有页面的偏移量和长度信息,而在V2Q , . Q中,页脚记录ColumnChunk的偏移量和长度。 由a q f 4 s u ^ _ 3于列块的长度小于存储所有页面的长度,因此V2中的页脚大小小于V1中的页脚大小。 因此,由于读取页脚并将其存储在内存中,因此V2将比V1使用更少的内存。

从基础知识了解Apache Carbondata

> V3 version of CarbonDag E 1 % Q _t{ s ; da fileq ) E @ O W p format

块还由所有列的ColumnChunks组成。 所更改的是Coluw C B a + d imnChunk由一个或多个Column PageR u y 8 ks组成,并且Co s v slumn Page添加了一个新的Bl4 v ( oockletMinMaxIndex。

与V2相比:V2格式的块数据量默认为120,000行,而V3格式的块数据量默认为64MB。 对于相同大小的数据文件,页脚部分索引元数据的信息可能会进一步减少。 同时,V3格式添加了一个新页面。 级别数据过滤,默认情况下每页的数据量仅为32,* n 2000行,这远远小于V2格式的120,000行。 数据过滤的准确L q $ [性进一步提高,可以在解压缩数据之前过滤掉更- g S g多数据。

希望您现在了解V1,V2和V3文件格式之间的主要区别。

% E y 3 5代码教程中,我将使用一些大小为200GB或更大,至少1亿行和50列T R ) w - g a N的示例开放数据集。 代码教程将比较不同文件格式的数据集:orc,carbondata和parquet。

(本文翻译自Aviral Srivastava的文章《Understanding Apache Carbondata from the basics — Part I》,参考:https://medium.com/@aviralsrivastava/underste p uanding-apache-ca% p - n g R D b brbondata-from-the-basics-part-i-629e; % [b1c8ded1)

上一篇

回看互联网10年激荡。问英雄谁主沉浮!你能否把握下一个风口?

下一篇

LPWAN低功耗广域网技术比较:Wi-SUN、LoRaWAN、NB-IoT

你也可能喜欢

  • 暂无相关文章!

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部