专栏首页大数据和云计算技术一套数据,多种引擎(续)---两种数据格式(Parquet/ORCfile)浅析

一套数据,多种引擎(续)---两种数据格式(Parquet/ORCfile)浅析

最近主要在研究大数典型应用adhoc query,要实现秒级的adhoc query,通常有3种思路:

1、用搜索技术,将查询都建立索引,然后用搜索技术来实现。这种技术目前主要限制是索引建立和存储成本高,索引建立不及时,例如支付宝的higo。

2、实时计算,对不能指定维度的查询,理论上认为是实时计算,每个列上建立函数索引,这种典型的代表是mesa。关于mesa,前面我有篇简单的介绍性文章《mesa介绍:google 近实时数据仓库系统》,深入的大家可以看一看google的论文。淘宝的garuda公开的材料来看,主要也是实时计算的思路,但是目前garuda公开的资料不多,不知道目前这个系统到什么阶段了。

3、最后一种思路是利用MPP架构,通过并行扫描的技术来实现adhoc query。前面写了两篇分析文章《实时分析系统(HIVE/HBASE/IMPALA)浅析》和《 MPP DB 是 大数据实时分析系统 未来的选择吗?》。这两篇文章最新偶能发现被公司内部拿去作为参考,说明研究这块问题的人还不少,能拿我的文章去参考,应该还是比较认可我的思路的吧。O(∩_∩)O~

以上是业界目前我所知道的3种典型的思路,朋友们要是有新的思路欢迎多交流。

关于第3种思路,目前业界有很多引擎,各有优缺点,最近我萌发了另外一种考虑《一套数据,多种引擎(impala/Hive/kylin)》。前面说了这么久,关键还是要回到今天要讨论的正题上来,怎么做到一套数据?

数据分 metadata和 raw data。Impala一开始的思路就是用来改进hive的不足,所以和Hive天然共元数据,这里就不讨论元数据了。我们今天来简单对比分析一下业界典型的两种数据存储格式Parquet和ORCfile,分别是impala和Hive推荐使用的数据格式。

一、首先来看下ORCfile。

Orcfile(Optimized Row Columnar)是hive 0.11版里引入的新的存储格式,是对之前的RCFile存储格式的优化,是HortonWorks开源的。看下orcfile的存储格式:

可以看到每个Orc文件由1个或多个stripe组成,每个stripe250MB大小,这个Stripe实际相当于之前的rcfile里的RowGroup概念,不过大小由4MB->250MB,这样应该能提升顺序读的吞吐率。每个Stripe里有三部分组成,分别是Index Data,Row Data,Stripe Footer:

每个Stripe都包含index data、row data以及stripe footer,Stripe footer包含流位置的目录,Row data在表扫描的时候会用到。

Index data包含每列的最大和最小值以及每列所在的行。行索引里面提供了偏移量,它可以跳到正确的压缩块位置。

通过行索引,可以在stripe中快速读取的过程中可以跳过很多行,尽管这个stripe的大小很大。在默认情况下,最大可以跳过10000行。

因为可以通过过滤预测跳过很多行,因而可以在表的 secondary keys 进行排序,从而可以大幅减少执行时间。比如你的表的主分区是交易日期,那么你可以对次分区(state、zip code以及last name)进行排序。

每个文件有一个File Footer,这里面存的是每个Stripe的行数,每个Column的数据类型信息等;每个文件的尾部是一个PostScript,这里面记录了整个文件的压缩类型以及FileFooter的长度信息等。在读取文件时,会seek到文件尾部读PostScript,从里面解析到File Footer长度,再读FileFooter,从里面解析到各个Stripe信息,再读各个Stripe,即从后往前读。

ORCFILE主要特点:

混合存储结构,先按行存储,一组行数据叫stripes,stripes内部按列式存储。

支持各种复杂的数据类型,比如: datetime, decimal, 以及一些复杂类型(struct, list, map, and union);

在文件中存储了一些轻量级的索引数据;

基于数据类型的块模式压缩:

a、integer类型的列用行程长度编码(run-length encoding)

b、String类型的列用字典编码(dictionary encoding);

二、再来看看Parquet

我们的开源项目 Parquet 是 Hadoop 上的一种支持列式存储文件格式,起初只是 Twitter 和 Coudera 在合作开发,发展到现在已经有包括 Criteo公司 在内的许多其他贡献者了. Parquet 用 Dremel 的论文中描述的方式,把嵌套结构存储成扁平格式。

尽管 Parquet 是一个面向列的文件格式,不要期望每列一个数据文件。Parquet 在同一个数据文件中保存一行中的所有数据,以确保在同一个节点上处理时一行的所有列都可用。Parquet 所做的是设置 HDFS 块大小和最大数据文件大小为 1GB,以确保 I/O 和网络传输请求适用于大批量数据(What Parquet does is to set an HDFS block size and a maximum data file size of 1GB, to ensure that I/O and network transfer requests apply to large batches of data)。

在成G的空间内,一组行的数据会重新排列,以便第一行所有的值被重组为一个连续的块,然后是第二行的所有值,依此类推。

为了在列式存储中可以表达嵌套结构,用叫做 definition level和repetition level两个值描述。分别表达某个值在整个嵌套格式中,最深嵌套层数,以及在同一个嵌套层级中第几个值。

Parquet 使用一些自动压缩技术,例如行程编码(run-length encoding,RLE) 和字典编码(dictionary encoding),基于实际数据值的分析。一当数据值被编码成紧凑的格式,使用压缩算法,编码的数据可能会被进一步压缩。Impala 创建的 Parquet 数据文件可以使用 Snappy, GZip, 或不进行压缩;Parquet 规格还支持 LZO 压缩,但是目前 Impala 不支持 LZO 压缩的 Parquet 文件。

除了应用到整个数据文件的 Snappy 或 GZip 压缩之外,RLE 和字段编码是 Impala 自动应用到 Parquet 数据值群体的压缩技术。

综合来看,ORCfiel和parquet本质上都是列上存储,大同小异。parquet主要特点是支持嵌套格式,ORCfile主要特点是strips中有轻量级的index data。所以这两种数据存储格式完全是可以相互借鉴融合的。

列示存储不是hadoop首创,是从传统数据库中发展而来。最后来看看wiki中介绍的列示存储的历史:

Column stores or transposed files have been implemented from the early days of DBMS development. TAXIR was the first application of a column-oriented database storage system with focus on information-retrieval in biology[11] in 1969. Statistics Canada implemented the RAPID system[12] in 1976 and used it for processing and retrieval of the Canadian Census of Population and Housing as well as several other statistical applications. RAPID was shared with other statistical organizations throughout the world and used widely in the 1980s. It continued to be used by Statistics Canada until the 1990s.

KDB was the first commercially available column-oriented database developed in 1993 followed in 1995 by Sybase IQ. However, that has changed rapidly since about 2004 with many open source and commercial implementations. MonetDB was released under an open-source license on September 30, 2004,[13] followed closely by the now defunct C-Store.[14] Vertica was eventually developed out of C-Store, while the MonetDB-related X100 project evolved into VectorWise.[15][16]

相关阅读:

一套数据,多种引擎

本文分享自微信公众号 - 大数据和云计算技术(jiezhu2007),作者:朱洁

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2014-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据组织核心技术

    要高效地使用数据,就必须要有组织,因此业界对数据的结构化组织有很多探索。 1)Cube技术概念 OLAP的目标是满足决策支持或者满足在多维环境下特定的查询和报表...

    大数据和云计算技术
  • 大数据邂逅美剧

    关注“hadoop技术学习”这个公众号的同学越来越多,增长很快,不是说这个公众号多吸引人,倒是可以看出了国内hadoop技术人员越来越多。hadoop技术热门是...

    大数据和云计算技术
  • 新数仓系列:Hbase国内开发者生存现状(2)

    大数据前几年各种概念争论很多,NoSQL/NewSQL,CAP/BASE概念一堆堆的,现在这股热潮被AI接过去了。大数据真正落地到车联网,分控,各种数据分析等等...

    大数据和云计算技术
  • 50个数据科学应用领域|数据科学

    数据就是资源,如何利用此资源创造商业价值,大家共同研究和实践的问题。数据科学专注于从数据中学习那些有商业价值的东西并加以利用,玩数据的人角色多样,有数据分析师、...

    陆勤_数据人网
  • 路由之POST请求(三)

    这一次我们讲POST请求 post请求和get请求的定义方式一样,只不过在laravel中为了安全,post请求会有csrf限制 老规矩,上代码

    大话swift
  • 简单就是更好!面向低资源槽填充和意图分类的轻量级数据增强

    当有相当大的域内训练数据可用时,基于神经的模型在槽填充和意图分类方面取得了突出的性能。然而,随着新领域的频繁添加,创建大量数据的成本也很高。我们展示了轻量级扩充...

    用户7703613
  • Linux中的管道命令(三)

    tr命令将文本中的一个字符替换为另一个字符(除非挤压字符),它不直接读取文件,而是从标准输入中读取信息,它的语法如下:

    mwangblog
  • 大数据和人工智能如何赋能保险行业?

    科技对产业的变革将会越来越明显,越来越深刻,国务院在“十三五”国家信息化规划中也提到了云计算、大数据、人工智能、区块链等新技术对产业变革的重要性。保险这一古老的...

    挖掘大数据
  • 算法学习笔记(三):冒泡排序和归并排序

    free赖权华
  • linux下增加磁盘改变指定文件路径分区挂载点和迁移数据

    Centos7 系统上原有目录/data 挂载根目录下,空间有点小,我们需要把/data目录挂载到另一个磁盘,同时把数据迁移。 1.查看分区情况 fdisk ...

    张善友

扫码关注云+社区

领取腾讯云代金券