parquet和orc

parquet和orc,第1张

Parquet文件是自解析的,文件中包括该文件的数据和元数据。在HDFS文件系统和Parquet文件中存在如下几个概念:

1)HDFS块(Block):它是HDFS上的最小的副本单位,HDFS会把一个Block存储在本地的一个文件并且维护分散在不同的机器上的多个副本,通常情况下一个Block的大小为256M、512M等。

2)HDFS文件(File):一个HDFS的文件,包括数据和元数据,数据分散存储在多个Block中。

3)行组(Row Group):按照行将数据物理上划分为多个单元,每一个行组包含一定的行数,在一个HDFS文件中至少存储一个行组,Parquet读写的时候会将整个行组缓存在内存中,所以如果每一个行组的大小是由内存大的小决定的。

4)列块(Column Chunk):在一个行组中每一列保存在一个列块中,行组中的所有列连续的存储在这个行组文件中。不同的列块可能使用不同的算法进行压缩。

5)页(Page):每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。

Parquet文件的格式如下图所示:

可以看出,存储格式中元数据索引信息是被存储在最后的,所以当读取某一行的数据的时候,就需要去定位最后的索引信息,最后才能去读取对应的行数据。元数据包括 Parquet 原始类型定义、Page类型、编码类型、压缩类型等等。

Parquet 支持嵌套结构的数据模型,而非扁平式的数据模型,这是 Parquet 相对其他列存比如 ORC 的一大特点或优势。支持嵌套式结构,意味着 Parquet 能够很好的将诸如 Protobuf,thrift,json 等对象模型进行列式存储。

Parquet 的数据模型也是 schema 表达方式,用关键字 message 表示。每个字段包含三个属性,repetition属性(required/repeated/optional)、数据类型(primitive基本类型/group复杂类型)及字段名。如:

和Parquet类似,ORC文件也是以二进制方式存储的,所以是不可以直接读取,ORC文件也是自解析的,它包含许多的元数据,这些元数据都是同构ProtoBuffer进行序列化的。ORC的文件结构如下图,其中涉及到如下的概念:

ORC文件:保存在文件系统上的普通二进制文件,一个ORC文件中可以包含多个stripe,每一个stripe包含多条记录,这些记录按照列进行独立存储,对应到Parquet中的row

group的概念。

文件级元数据:包括文件的描述信息PostScript、文件meta信息(包括整个文件的统计信息)、所有stripe的信息和文件schema信息。

stripe:一组行形成一个stripe,每次读取文件是以行组为单位的,一般为HDFS的块大小,保存了每一列的索引和数据。

stripe元数据:保存stripe的位置、每一个列的在该stripe的统计信息以及所有的stream类型和位置。

row group:索引的最小单位,一个stripe中包含多个row group,默认为10000个值组成。

stream:一个stream表示文件中一段有效的数据,包括索引和数据两类。索引stream保存每一个row group的位置和统计信息,数据stream包括多种类型的数据,具体需要哪几种是由该列类型和编码方式决定。

在ORC文件中保存了三个层级的统计信息,分别为文件级别、stripe级别和row group级别的,他们都可以用来根据Search ARGuments(谓词下推条件)判断是否可以跳过某些数据,在统计信息中都包含成员数和是否有null值,并且对于不同类型的数据设置一些特定的统计信息。

读取ORC文件是从尾部开始的,第一次读取16KB的大小,尽可能的将Postscript和Footer数据都读入内存。文件的最后一个字节保存着PostScript的长度,它的长度不会超过256字节,PostScript中保存着整个文件的元数据信息,它包括文件的压缩格式、文件内部每一个压缩块的最大长度(每次分配内存的大小)、Footer长度,以及一些版本信息。在Postscript和Footer之间存储着整个文件的统计信息(上图中未画出),这部分的统计信息包括每一个stripe中每一列的信息,主要统计成员数、最大值、最小值、是否有空值等。

接下来读取文件的Footer信息,它包含了每一个stripe的长度和偏移量,该文件的schema信息(将schema树按照schema中的编号保存在数组中)、整个文件的统计信息以及每一个row group的行数。

处理stripe时首先从Footer中获取每一个stripe的其实位置和长度、每一个stripe的Footer数据(元数据,记录了index和data的的长度),整个striper被分为index和data两部分,stripe内部是按照row group进行分块的(每一个row group中多少条记录在文件的Footer中存储),row group内部按列存储。每一个row group由多个stream保存数据和索引信息。每一个stream的数据会根据该列的类型使用特定的压缩算法保存。在ORC中存在如下几种stream类型:

PRESENT:每一个成员值在这个stream中保持一位(bit)用于标示该值是否为NULL,通过它可以只记录部位NULL的值

DATA:该列的中属于当前stripe的成员值。

LENGTH:每一个成员的长度,这个是针对string类型的列才有的。

DICTIONARY_DATA:对string类型数据编码之后字典的内容。

SECONDARY:存储Decimal、timestamp类型的小数或者纳秒数等。

ROW_INDEX:保存stripe中每一个row group的统计信息和每一个row group起始位置信息。

在初始化阶段获取全部的元数据之后,可以通过includes数组指定需要读取的列编号,它是一个boolean数组,如果不指定则读取全部的列,还可以通过传递SearchArgument参数指定过滤条件,根据元数据首先读取每一个stripe中的index信息,然后根据index中统计信息以及SearchArgument参数确定需要读取的row group编号,再根据includes数据决定需要从这些row group中读取的列,通过这两层的过滤需要读取的数据只是整个stripe多个小段的区间,然后ORC会尽可能合并多个离散的区间尽可能的减少I/O次数。然后再根据index中保存的下一个row group的位置信息调至该stripe中第一个需要读取的row group中。

ORC文件格式只支持读取指定字段,还不支持只读取特殊字段类型中的指定部分。

使用ORC文件格式时,用户可以使用HDFS的每一个block存储ORC文件的一个stripe。对于一个ORC文件来说,stripe的大小一般需要设置得比HDFS的block小,如果不这样的话,一个stripe就会分别在HDFS的多个block上,当读取这种数据时就会发生远程读数据的行为。如果设置stripe的只保存在一个block上的话,如果当前block上的剩余空间不足以存储下一个strpie,ORC的writer接下来会将数据打散保存在block剩余的空间上,直到这个block存满为止。这样,下一个stripe又会从下一个block开始存储。

由于ORC中使用了更加精确的索引信息,使得在读取数据时可以指定从任意一行开始读取,更细粒度的统计信息使得读取ORC文件跳过整个row group,ORC默认会对任何一块数据和索引信息使用ZLIB压缩,因此ORC文件占用的存储空间也更小,这点在后面的测试对比中也有所印证。

大数据分析的流程浅析:大数据整理过程分析

数据整理是数据分析过程中最重要的环节,在大数据分析过程中也是如此。在小数据时代,数据整理包括数据的清洗、数据转换、归类编码和数字编码等过程,其中数据清洗占据最重要的位置,就是检查数据一致性,处理无效值和缺失值等 *** 作。在大数据时代,这些工作被弱化了,在有些大数据的算法和应用中,基本不再进行数据清洗了,因为大数据的多样化使得其数据。有一定的不精确性。但数据转换和编码过程还是需要的。下面以大数据分析中文本分类的例子,来分析大数据整理的过程。

在本例中,以mahout为大数据分析软件,文本分类算法选用朴素贝叶斯算法(new bayes),分类对象是来自不同类别的新闻数据。

当我们使用网页爬虫,每小时源源不断的从多个不同类别的新闻网站上取得数据时,取得的这些数据都是文本数据,也就是非结构化数据,这些数据是不需要进行数据清洗过程,但它们在进入到mahout实现的朴素贝叶斯算法时,需要进行必要的数据转换。该转换主要分两个步骤:

1数据系列化

由于取得的大量的文本数据集中,每个新闻占一个文档,共有无数个小的文件,由于Mahout运行在Hadoop的HDFS上,HDFS是为大文件设计的。如果我们把这些无穷多个小文件都拷贝上去,这样是非常不合适。试想:假设对1000万篇新闻进行分类,难道要拷贝1000w个文件么这样会使HDFS中运行name node节点的终端崩溃掉。

因此,Mahout采用SequenceFile作为其基本的数据交换格式。其思路是:通过调用mahout内置的解析器,扫描所有目录和文件,并把每个文件都转成单行文本,以目录名开头,跟着是文档出现的所有单词,这样就把无穷多个小文件,转换成一个系列化的大文件。然后把这个大文件,再上传到HDFS上,就可以充分发挥HDFS分布式文件系统的优势。当然,这个转换过程由mahout的内置工具完成,而大数据分析师这个时候只需要把所有的新闻按文件夹分好类放置好,同时运行mahout内置的解析器命令就可以了。

2文本内容向量化

简单地说就是把文本内容中的每个单词(去除一些连接词后)转换成数据,复杂地说就是进行向量空间模型化(VSM)。该过程使每个单词都有一个编号,这个编号是就它在文档向量所拥有的维度。这个工作在mahout中实现时,大数据分析师也只需要执行其中的一个命令,就可以轻松地实现文本内容的向量化。

有了这些被向量化的数据,再通过mahout的朴素贝叶斯算法,我们就可以对计算机训练出一套规则,根据这个规则,机器就可以对后续收集的新闻数据进行自动的分类了。

从上述文本分类的大数据整理过程可以看出,大数据时代的数据整理过程不再强调数据的精确性,而强调的是对非结构化数据的数量化。当然,不同的大数据分析应用使用的算法也不一样,其数据整理过程也不太一样,但从总体上看,大数据分析的数据整理区别于小数据时代的精确性,而变得更粗放一些。

以上是小编为大家分享的关于大数据分析的流程浅析 大数据整理过程分析的相关内容,更多信息可以关注环球青藤分享更多干货

hadoop计算需要在hdfs文件系统上进行,文件上传到hdfs上通常有三种方法:a hadoop自带的dfs服务,put;b hadoop的API,Writer对象可以实现这一功能;c 调用OTL可执行程序,数据从数据库直接进入hadoop

hadoop计算需要在hdfs文件系统上进行,因此每次计算之前必须把需要用到的文件(我们称为原始文件)都上传到hdfs上。文件上传到hdfs上通常有三种方法:

a hadoop自带的dfs服务,put;

b hadoop的API,Writer对象可以实现这一功能;

c 调用OTL可执行程序,数据从数据库直接进入hadoop

由于存在ETL层,因此第三种方案不予考虑

将a、b方案进行对比,如下:

1 空间:方案a在hdfs上占用空间同本地,因此假设只上传日志文件,则保存一个月日志文件将消耗掉约10T空间,如果加上这期间的各种维表、事实表,将占用大约25T空间

方案b经测试,压缩比大约为3~4:1,因此假设hdfs空间为100T,原来只能保存约4个月的数据,现在可以保存约1年

2 上传时间:方案a的上传时间经测试,200G数据上传约1小时

方案b的上传时间,程序不做任何优化,大约是以上的4~6倍,但存在一定程度提升速度的余地

3 运算时间:经过对200G数据,大约4亿条记录的测试,如果程序以IO *** 作为主,则压缩数据的计算可以提高大约50%的速度,但如果程序以内存 *** 作为主,则只能提高5%~10%的速度

4 其它:未压缩的数据还有一个好处是可以直接在hdfs上查看原始数据。压缩数据想看原始数据只能用程序把它导到本地,或者利用本地备份数据

压缩格式:按照hadoop api的介绍,压缩格式分两种:BLOCK和RECORD,其中RECORD是只对value进行压缩,一般采用BLOCK进行压缩。

对压缩文件进行计算,需要用SequenceFileInputFormat类来读入压缩文件,以下是计算程序的典型配置代码:

JobConf conf = new JobConf(getConf(), logclass);

confsetJobName(”log”);

confsetOutputKeyClass(Textclass);//set the map output key type

confsetOutputValueClass(Textclass);//set the map output value type

confsetMapperClass(MapClassclass);

//confsetCombinerClass(Reduceclass);//set the combiner class ,if havenot, use Recuce class for default

confsetReducerClass(Reduceclass);

confsetInputFormat(SequenceFileInputFormatclass);//necessary if use compress

接下来的处理与非压缩格式的处理一样

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。

1、用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

2、Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。

3、Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。

以上就是关于parquet和orc全部的内容,包括:parquet和orc、大数据分析的流程浅析 大数据整理过程分析、如何实现让用户在网页中上传下载文件到HDFS中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9620559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存