Impala高性能探秘之HDFS数据访问

本文深入探讨Impala如何高效地访问HDFS数据,包括数据分区、任务分发、HdfsScanNode的实现、数据解析和处理、数据压缩等关键环节。Impala将数据读取与扫描线程分离,利用元数据进行分区剪枝,优化任务分配,确保数据本地性和任务均衡。此外,介绍了Scanner线程如何处理数据,以及数据压缩在性能优化中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Impala是一个高性能的OLAP引擎,Impala本身只是一个OLAP-SQL引擎,它访问的数据存储在第三方引擎中,第三方引擎包括HDFS、Hbase、kudu。对于HDFS上的数据,Impala支持多种文件格式,目前可以访问Parquet、TEXT、avro、sequence file等。对于HDFS文件格式,Impala不支持更新操作,这主要限制于HDFS对于更新操作的支持比较弱。本文主要介绍Impala是如何访问HDFS数据的,Impala访问HDFS包括如下几种类型:1、数据访问(查询);2、数据写入(插入);3、数据操作(重命名、移动文件等)。本文将详细介绍Impala是如何在查询执行过程中从HDFS获取数据,也就是Impala中HdfsScanNode的实现细节。

本文是Impala系列文章的一篇,关于Impala的介绍相关的文章可以参考:Impala查询详解第一篇——简介大数据时代快速SQL引擎-Impala

数据分区

Impala执行查询的时首先在FE端进行查询解析,生成物理执行计划,进而分隔成多个Fragment(子查询),然后交由Coordinator处理任务分发,Coordinator在做任务分发的时候需要考虑到数据的本地性,它需要依赖于每一个文件所在的存储位置(在哪个DataNode上),这也就是为什么通常将Impalad节点部署在DataNode同一批机器上的原因,为了揭开Impala访问HDFS的面纱需要先从Impala如何分配扫描任务说起。

众所周知,无论是MapReduce任务还是Spark任务,它们执行的之前都需要在客户端将输入文件进行分割,然后每一个Task处理一段数据分片,从而达到并行处理的目的。Impala的实现也是类似的原理,在生成物理执行计划的时候,Impala根据数据所在的位置将Fragment分配到多个Backend Impalad节点上执行,那么这里存在两个核心的问题:

  • Impala如何获取每一个文件的位置?
  • 如何根据数据位置分配子任务?

在之前介绍的Impala的总体架构可以看到,Catalogd节点负责整个系统的元数据,元数据是以表为单位的,这些元数据具有一个层级的关系,如下图所示

这里写图片描述
Impala表元数据结构

每一个表包含如下元数据(只选取本文需要用到的):

  • schema信息:该表中包含哪些列,每一列的类型是什么等
  • 表属性信息:拥有者、数据库名、分区列、表的根路径、表存储格式。
  • 表统计信息:主要包括表中总的记录数、所有文件总大小。
  • 分区信息:每一个分区的详细信息。

每一个分区包含如下信息:

  • 分区名:由所有的分区列和每一列对应的值唯一确定的
  • 分区文件格式:每一个分区可以使用不同的文件格式存储,解析时根据该格式而非表中的文件存储格式,如果创建分区时不指定则为表的存储格式。
  • 分区的所有文件信息:保存了该分区下每一个文件的详细信息,这也导致了重新写入数据之后需要REFRESH表。

每一个文件包含如下的信息:

  • 该文件的基本信息:通过FileStatus对象保存,包括文件名、文件大小、最后修改时间等。
  • 文件的压缩格式:根据文件名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值