在本周的白板演练Parth Chandra中,Apache Drill项目PMC主席兼MapR工程团队成员介绍了Apache Drill SQL查询引擎如何读取Parquet格式的数据以及一些最佳实践,以使Parquet发挥最大性能。
其他Apache Drill资源:
这是视频转录:
您好,我是Chandra。 我是Apache Drill项目的开发人员之一,实际上我是Apache Drill PMC,也是MapR工程团队的成员。 今天,我们将讨论镶木地板列文件格式,尤其是关于Apache Drill如何读取镶木地板文件格式,以及我们如何使用一些非常好的最佳做法来最大程度地读取镶木地板文件。
让我们开始讨论镶木地板文件的外观。 实木复合地板文件是圆柱状的。 这意味着它以列的形式组织数据,而不是一次组织一个记录。 这是它的外观图片。 拼花地板文件分为称为行组的逻辑单元。 在一个行组中,您可以在此处看到镶木地板文件将一列的所有数据放在一起,然后将下一列的所有数据放在一起,因此将有一堆记录。 而且您唯一可以确定的是,这些组中每个组的记录数是相同的。 在该列中,镶木地板文件将数据组织到页面中。 页面可以是不同的类型。 页面的一种类型可以是字典页面,但是特别要注意镶木地板的一点是,页面是镶木地板文件的最小粒度单位。 这意味着当实木复合地板保存数据时,它将占用整个页面,然后以实木复合地板格式对数据进行编码,然后将其压缩。 这意味着在阅读完整个页面,将其解压缩并对其进行解码之前,我无法访问页面中的单个记录。 这是要记住的重要事情。
要记住的另一件事是,单个文件分为许多行组。 分布式文件系统中发生的事情之一是,行组可以花费多台计算机。 不过,我们尝试做的是,我们要确保单个行组始终位于同一音符上。 假设一个文件,现在假设它是一个文件,它被划分为多个节点,因此它位于节点1和节点2之间,我们尝试确保此文件的行组1位于节点1上,并且该文件的行组2位于该文件上在节点2上。这是有原因的。 我们试图看到的一件事就是Drill如何读取实木复合地板文件,而我们在这里试图看到的是对所发生情况的一些伪表示,那就是Drill查看了所有必须读取的实木复合地板文件。 ,它在镶木地板文件中查找并发现有多少行组要读取。 然后,它询问文件系统,告诉我该行组位于哪个节点上。
结果发现,对于该文件,文件1比方说,行组1是节点1,行组2在节点2上,我要做的是它将开始分布式操作,该操作将通过读取行开始节点1上的组1,并且将读取节点2上的行组2。这样,在读取行组1的数据时没有网络流量,因为该数据已在本地读取,而行组2的相同在节点2上本地读取。
一旦一个特定的过程以单个注释开始,我们就会读取一个特定的节点组。 在该节点内,Drill将开始读取每一列,并且这是并行操作,因此,列式数据库允许您执行的操作之一是,如果不需要读取B列,则无需读取B列。 ,您只读取A列。以行导向格式,您一次只能读取一行数据,因此最终可以同时读取A列和B列,但是如果是列式数据库,则无需这样做那。
假设在这种特殊情况下,我们将同时阅读A列和B列。 在节点1上,单个读取器将开始读取第1行,在该行中它将读取列A和列B,因为这是它要做的,并且正如我们提到的,单个粒度单位是一页,因此我们将读取一页有时,有时就像我提到的那样,该页面可能是字典页面,这实际上是一种非常有效的方式来存储例如在特定列中经常出现的单词。 该过程实质上是读取列,它将读取一个页面,将对页面进行解压缩,将对页面进行解码,并将将已解码的页面数据复制为内存中列式的内部数据,以Drill的形式存储到内部存储器中。这称为值向量。 当然,值向量是一种将列数据存储在内存中的非常有效的方法,因为它允许随机访问,但是今天我们不打算讨论值向量的细节。 记住这是一件好事,这是Drill读取镶木地板文件时发生的操作之一。
我们该怎么做以确保Drill能够最大程度地利用如何读取镶木地板文件? 我已经提到的一件事是,我们试图确保特定的行组始终位于同一节点上。 我们要确保实际上不知道其在编写Parquet文件的文件系统始终保证行组始终位于同一节点上。 您在此处执行的操作之一是尝试确保行组的大小,并且我们希望将行组变大,我们更喜欢使行组的大小达到千兆字节,Apache Drill中的默认值约为半字节。 gig,它是512 MB,但是1 GB是一个相当不错的大小,我们尝试确保HDFS块大小,或者如果您使用的是MFS,则MFS块大小是相同的。 这样做是确保文件系统知道是否要写入数据块,即1 GB的数据将始终位于同一节点上。 因为我们正在写相同大小的行组,所以我们可以保证该行组现在写在同一节点上。 如前所述,这消除了网络传输。
我们下一步要做的是尝试使用较小的页面大小,因为页面是粒度单位。 它使我们可以在读取列时并行处理页面,因此,我们将要读取一个页面,我们将对该页面进行解压缩,我们将对该页面进行解码,然后将数据复制到值向量中,但是我们希望以足够大的工作单元块来进行处理,但是我们不希望它太小,也不想太大。 我们注意到的一件事(这也是默认设置)是您尝试将页面大小设置为1 GB。 我之所以要提到这是因为,尽管这些是Drill中的默认设置,所以如果您使用Drill创建了实木复合地板文件,您将自动获得此功能,对于使用其他工具创建的实木复合地板文件而言,情况并非如此。 其他工具将允许您更改这两个参数,即实际的行组大小和页面大小,因此,您想利用Drill知道这些大小并可以从中最大程度地利用这一事实。
我要提到的最后一件事是,如果您存储压缩的数据,则将磁盘上的数据量减到最少,并且您希望将磁盘上的读取操作(通常是较慢的操作)最小化。 将数据压缩后存储是一个好主意,然后再次将数据压缩到页面级别,但是压缩技术有多种选择。 最常用的2种是Snappy和GZIP,这里的权衡是Snappy在解压缩数据时比GZIP快得多,但压缩的程度不高,因此会在磁盘上使用更大的空间,但是在读取数据时,它的读取速度比GZIP快得多。 如果要限制数据使用的磁盘空间量,则最好使用GZIP,以便将空间最小化。 如果您只是想更快地阅读,并且愿意在某些磁盘空间上进行权衡,则可以使用Snappy。 同样,您可能必须尝试几次,具体取决于您的数据种类,但这是最常见的两种选择。
那就是我今天给你们的东西。 希望这会有所帮助。 如果您有任何意见,请随时留下一些反馈,非常感谢您的观看。
翻译自: https://www.javacodegeeks.com/2016/10/apache-drill-sql-queries-parquet-data.html